从另一个 activity 调用方法崩溃

Calling method from another activity crashes

我正在尝试调用此方法

public void get() {
    tileView.smoothScaleFromCenter( 0.5000f );
}

在我的 onItemClick 中来自我的基础活动,但它崩溃了。我该如何解决这个问题?

这是我的基本活动:

  public boolean onQueryTextChange(String newText) {
    showResults(newText + "*");
    return false;
}

public boolean onQueryTextSubmit(String query) {
    showResults(query + "*");
    return false;
}

public boolean onClose() {
    searchView.onActionViewCollapsed();
    showResults("");
    return false;
}
private void showResults(String query) {

    Cursor cursor = mDbHelper.searchPlaces((query != null ? query.toString() : "@@@@"));

    if (cursor == null) {
        //
    } else {
        // Specify the columns we want to display in the result
        String[] from = new String[]{
                PlacesDbAdapter.KEY_PLACES
        };

        // Specify the Corresponding layout elements where we want the columns to go
        int[] to = new int[]{R.id.scustomer
        };

        // Create a simple cursor adapter for the definitions and apply them to the ListView
        SimpleCursorAdapter places1 = new SimpleCursorAdapter(this, R.layout.customerresult, cursor, from, to);
        mListView.setAdapter(places1);

        // Define the on-click listener for the list items
        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                new MainActivity().get();
                searchView.setQuery("", true);
            }
        });
    }
}

这是我的主要活动:

public void get() {
tileView.smoothScaleFromCenter( 0.5000f );
}}

这是我的 logcat:

02-26 16:12:21.074 31567-31567/com.example.lightning.myapplication3 E/AndroidRuntime: FATAL EXCEPTION: main


Process: com.example.lightning.myapplication3, PID: 31567
  java.lang.NullPointerException
      at com.example.lightning.myapplication3.MainActivity.get(MainActivity.java:208)
      at com.example.lightning.myapplication3.BaseActivity.onItemClick(BaseActivity.java:197)
      at android.widget.AdapterView.performItemClick(AdapterView.java:299)
      at android.widget.AbsListView.performItemClick(AbsListView.java:1156)
      at android.widget.AbsListView$PerformClick.run(AbsListView.java:2963)
      at android.widget.AbsListView.run(AbsListView.java:3737)
      at android.os.Handler.handleCallback(Handler.java:733)
      at android.os.Handler.dispatchMessage(Handler.java:95)
      at android.os.Looper.loop(Looper.java:136)
      at android.app.ActivityThread.main(ActivityThread.java:5421)
      at java.lang.reflect.Method.invokeNative(Native Method)
      at java.lang.reflect.Method.invoke(Method.java:515)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:979)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:795)
      at dalvik.system.NativeStart.main(Native Method)

创建 activity 需要时间。一旦您的 activity 在 new MainActivity() 之后构建,与您的 activity 关联的视图尚未创建或绑定...因此 NullPointerException.

要实现此功能,您应该将意图传递给 MainActivity。然后在 activity 生命周期的正确点上,您可以检查 activity 的起始意图中是否存在值,然后在需要时执行操作。

例如:

public static final String KEY_SCALE_FROM_CENTER = "scale_from_center";

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    searchView.setQuery("", true);
    Intent intent = new Intent(this, MainActivity.class);
    intent.putExtra(KEY_SCALE_FROM_CENTER, true);
    startActivity(intent);
}


public class MainActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_view);
        if (getIntent().getBooleanExtra(KEY_SCALE_FROM_CENTER, false)) {
            get();
        }
    }
}

最好尝试这种方式

public class BaseActivity{
   //   ... fields....
   //Define ClickListner on base class  or just a setter
   OnItemClickListener onItemClickListener;
   //.... methods ...
   private void showResults(String query) {
    //   ... lines....

     \*mListView.setOnItemClickListener(new AdapterView.OnItemClickListener()          {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            new MainActivity().get();
            searchView.setQuery("", true);
         }
       });*/
      //replace above with this
      if(onItemClickListener!=null)
          mListView.setOnItemClickListener(onItemClickListener);
   }

   //generate setter for that
   public void setOnItemClickListener(OnItemClickListener onItemClickListener){
      this.onItemClickListener = onItemClickListener;
      mListView.setOnItemClickListener(onItemClickListener);
   }
}

public class MainActivity extends BaseActivity implements  OnItemClickListener{
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      setContentview...
      setOnItemClickListener(this);
  }

  @Override
  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
   get();
   searchView.setQuery("", true);
  }

}

在 main activity oncreate 方法中设置此项点击侦听器以便您可以在多个 类

中使用 base activity

更新下行

// 定义列表项的点击监听器 mListView.setOnItemClickListener(onItemClickListener); 现在您已经在 main activity 中定义了 onClick,您不需要这样做: new MainActivity().get()


这里还有一件事要提到的是 new MainActivity() 创建 mainActivity 的对象并从中调用 get 方法 而不是当前已查看的活动 如果你仍然想调用使用静态方法,我强烈不建议这样做。