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)
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With