0

i have a SearchView in my MainActivity. i want to pass the text i am entering to my fragment(That contains a ListView) and be able to filter the list using an adapter.

The problem is using the below code i am able to pass in the text entered to the fragment but then i get a nullpointer exception.

Note: the adapter works fine. i also tried setting a TextView in my fragment to the String passed but also the app crashes.

in MainActivity:

   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.activity_main_actions, menu);
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    MenuItem searchItem = menu.findItem(R.id.action_search);
    searchView = (SearchView) searchItem.getActionView();  
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setIconifiedByDefault(false); 

    SearchView.OnQueryTextListener textChangeListener = new SearchView.OnQueryTextListener()
    {

      @Override
        public boolean onQueryTextSubmit(String query)
        {
            TopRatedFragment newFragment = new TopRatedFragment();  //FOR PASSING TEXT
            Bundle args = new Bundle();
            args.putString("hii", query);
            newFragment.setArguments(args);
            newFragment.kl();
            android.support.v4.app.FragmentTransaction transaction =                
             getSupportFragmentManager().beginTransaction();
              transaction.addToBackStack(null);

            // Commit the transaction
            transaction.commit();

            System.out.println("on query submit: "+query);
            return true;
        }
    };
    searchView.setOnQueryTextListener(textChangeListener);

     return super.onCreateOptionsMenu(menu);

In Fragment:

    public void kl(){
    String menu = getArguments().getString("hii");
    adapter.getFilter().filter("hii");
}

LogCat:

 10-16 09:26:23.234: E/AndroidRuntime(19960): FATAL EXCEPTION: main
 10-16 09:26:23.234: E/AndroidRuntime(19960): java.lang.NullPointerException
 10-16 09:26:23.234: E/AndroidRuntime(19960):   at  com.example.tab.TopRatedFragment.kl(TopRatedFragment.java:51)
  10-16 09:26:23.234: E/AndroidRuntime(19960):  at     com.example.tab.MainActivity$3.onQueryTextSubmit(MainActivity.java:160)
   10-16 09:26:23.234: E/AndroidRuntime(19960):     at   android.widget.SearchView.onSubmitQuery(SearchView.java:1203)
   10-16 09:26:23.234: E/AndroidRuntime(19960):     at android.widget.SearchView.access$900(SearchView.java:93)
   10-16 09:26:23.234: E/AndroidRuntime(19960):     at android.widget.SearchView$8.onEditorAction(SearchView.java:1178)
   10-16 09:26:23.234: E/AndroidRuntime(19960):     at android.widget.TextView.onEditorAction(TextView.java:4973)
   10-16 09:26:23.234: E/AndroidRuntime(19960):     at com.android.internal.widget.EditableInputConnection.performEditorAction(EditableInputConnection.java:138)
  10-16 09:26:23.234: E/AndroidRuntime(19960):  at    com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:297)
  10-16 09:26:23.234: E/AndroidRuntime(19960):  at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:77)
 10-16 09:26:23.234: E/AndroidRuntime(19960):   at android.os.Handler.dispatchMessage(Handler.java:99)
  10-16 09:26:23.234: E/AndroidRuntime(19960):  at android.os.Looper.loop(Looper.java:176)
  10-16 09:26:23.234: E/AndroidRuntime(19960):  at android.app.ActivityThread.main(ActivityThread.java:5419)
 10-16 09:26:23.234: E/AndroidRuntime(19960):   at java.lang.reflect.Method.invokeNative(Native Method)
  10-16 09:26:23.234: E/AndroidRuntime(19960):  at java.lang.reflect.Method.invoke(Method.java:525)
  10-16 09:26:23.234: E/AndroidRuntime(19960):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
 10-16 09:26:23.234: E/AndroidRuntime(19960):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
  10-16 09:26:23.234: E/AndroidRuntime(19960):  at dalvik.system.NativeStart.main(Native Method)

Ok so I found out that the problem is that in the Fragment class, outside the onCreateView, the View is null and thus any attribute(TextView, adapter...) is null. thats why im getting nullpointer exception. but cant seem to find how to solve it because i want to set the adapter outside the oncreateview

Rashad.Z
  • 2,494
  • 2
  • 27
  • 58
  • post your logcat then... – M D Oct 16 '14 at 06:25
  • instead of calling `kl()` method inside `onQueryTextSubmit()` . Pass `bundle` to `fragment` and unbundle it in `onCreateView()`. – dreamcoder Oct 16 '14 at 06:36
  • but isn't onCreateView() called only once? – Rashad.Z Oct 16 '14 at 06:38
  • the fragment is already called before and is viewable (its a viewpager) – Rashad.Z Oct 16 '14 at 06:41
  • `onCreateView()` will call everytime – dreamcoder Oct 16 '14 at 07:10
  • ok thanks i got that, but what if the fragment is created when the activitiy is created (so it is on the screen and not being called on click or something) and i want to pass a String that is entered in SearchView (that is in activity). So i cant pass what is in the bundle at onCreateView because Both the ActionBar of the MainActivity and the fragment are always visible together. so onCreateView is only being called when the application starts – Rashad.Z Oct 16 '14 at 07:23
  • then you have to check for `view`. If it is created then you can use or if not then you need to inflate it again. Then only i think you can use adapter outside `onCreateView()` – dreamcoder Oct 16 '14 at 09:23

2 Answers2

0
 class myClass extends FragmentActivity {
   public static String dataToPass="Test";

 //Call Class fragment 
 //In this way you can share String , integers , object , arralist and can be share between     all fragment. you just need to define all in that activity as public static .
 } 
Danial Hussain
  • 2,488
  • 18
  • 38
0

you can communicate between fragments by defining interfaces. describe here http://developer.android.com/training/basics/fragments/communicating.html

Define an inerface in Fragment

 public interface OnManufacturerSelectedListener {
            public void onManufacturerSelected(String Manufacturer);
        }

in fragments method kl():

 public void kl(){
    String menu = getArguments().getString("hii");
    OnManufacturerSelectedListener.onManufacturerSelected("hii");
}

then implement OnManufacturerSelectedListener in MainActivity

@Override
        public void onManufacturerSelected(String Manufacturer) {
            String hi=Manufacturer;
        }
Asim.I
  • 1,097
  • 6
  • 8