Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Action Bar Search View (Android) null error

I am not sure why it is appearing as null, if it has to do something with the fragment and the fragment title or the drawer, since it is on the main activity of where this fragment is being pulled up from.

Here is my menu xml item:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" >
    <item android:id="@+id/action_search"
        android:title="@string/action_search"
        android:icon="@drawable/ic_action_search"
        app:showAsAction="always"
        app:actionViewClass="android.support.v7.widget.SearchView" />
</menu>

Here is the fragment code:

public class BrowseFragment extends Fragment {

    //action bar expands to search
    //search - keyword or tab search, title
    //include popular - same algorithm as home
    //show categories

    //category click takes you to grid activity
//adapter with custom model
    private CategoryViewerAdapter adapter;

    //list with custom model
    private List<CategoryItem> categoriesList;

    //List view
    private ListView categoryListView;

    //SearchView
    private SearchView search;

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.browse, menu);

        //find the menu item and set search view at the same time
        search = (SearchView) menu.findItem(R.id.action_search).getActionView();


        //to always show the search view - to include this must implement it above
        search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                return false;
            }
        });
        search.setIconified(false);

        super.onCreateOptionsMenu(menu,inflater);
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_browse, container, false);

        //Allows menu options in fragment
        setHasOptionsMenu(true);


        //Set adapter for multi-select model and adapter
        adapter = new CategoryViewerAdapter(getActivity(), getSingleCategory());
        categoryListView = (ListView) rootView.findViewById(R.id.categoryListView);
        categoryListView.setAdapter(adapter);


        return rootView;
    }

    //call to retrieve list
    private List<CategoryItem> getSingleCategory() {
        //initiate new list
        categoriesList = new ArrayList<CategoryItem>();

        //called to get string array
        Resources res = getResources();
        String[] categories = res.getStringArray(R.array.categories);

        //loop through string array
        for (String category : categories) {
            categoriesList.add(get(category));
        }

        return categoriesList;
    }

    //call model to set names and methods for each item
    private CategoryItem get(String name) {
        return new CategoryItem(name);
    }


}

The null pointer error points to this line:

search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

Here is the error log:

03-03 02:50:33.590  15744-15744/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.app, PID: 15744
    java.lang.NullPointerException
            at com.example.app.BrowseFragment.onCreateOptionsMenu(BrowseFragment.java:64)
            at android.app.Fragment.performCreateOptionsMenu(Fragment.java:1780)
            at android.app.FragmentManagerImpl.dispatchCreateOptionsMenu(FragmentManager.java:1927)
            at android.app.Activity.onCreatePanelMenu(Activity.java:2539)
            at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:436)
            at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:800)
            at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:221)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
            at android.view.Choreographer.doCallbacks(Choreographer.java:574)
            at android.view.Choreographer.doFrame(Choreographer.java:543)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
            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:5017)
            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:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)
like image 310
Lion789 Avatar asked Mar 03 '14 01:03

Lion789


1 Answers

Are you using Proguard? If so, make sure you have a rule that keeps the android.support.v7.widget.SearchView class.

For example, to keep everything in all the different versions of the support library, add:

-keep class android.support.** { *; }
-keep interface android.support.** { *; }

to your proguard-rules.txt file.

like image 195
ashughes Avatar answered Oct 06 '22 21:10

ashughes