Search code examples
androidsearchview

Calling method from another activity crashes


I'm trying to call this method

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

in my onItemClick from my baseactivity, but it crashes. How can I fix this?

This is my baseactivity:

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

This my mainactivity:

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

Here is my 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$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)

Solution

  • Better to try this way

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

    in main activity oncreate method set this item click listener so you can use base activity in multiple classes

    update below line

    // Define the on-click listener for the list items mListView.setOnItemClickListener(onItemClickListener); now that you have defined the onClick in main activity you do not need to do like this: new MainActivity().get()


    Also one thing to mention here is new MainActivity() creates the object of mainActivity and calls get method from it rather then activty which has been viewed currently if still you do want to call use static method which i highly do not recommend to do so.