【问题标题】:Calling method from another activity crashes从另一个活动调用方法崩溃
【发布时间】:2017-02-26 08:15:40
【问题描述】:

我正在尝试调用此方法

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 );
}}

这是我的日志:

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$3.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$3.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)

【问题讨论】:

    标签: android searchview


    【解决方案1】:

    最好尝试这种方式

    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);
      }
    
    }
    

    在主要活动的 oncreate 方法中设置此项目的单击侦听器,以便您可以在多个类中使用基本活动

    更新下一行

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


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

    【讨论】:

    • 我有点不懂。你能告诉我怎么做吗?对不起,我是新手
    【解决方案2】:

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

    要使其正常工作,您应该向 MainActivity 传递一个意图。然后在 Activity 生命周期的正确位置,您可以检查 Activity 的起始 Intent 中是否存在值,然后在需要时执行该操作。

    例如:

    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();
            }
        }
    }
    

    【讨论】:

    • 你说的“putBoolean”不起作用,我正在获取 putExtra。
    猜你喜欢
    • 2015-01-26
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2013-08-26
    相关资源
    最近更新 更多