ActionBarSherlock – SearchView имеет значение null?

Я добавляю функцию поиска в Action Bar в SherlockListActivity, однако, когда я пытаюсь создать экземпляр SearchView, он всегда имеет значение null:

@Override public boolean onCreateOptionsMenu(Menu menu) { getSupportMenuInflater().inflate(R.menu.activity_main_menu, menu); SearchView searchView = (SearchView) menu.findItem(R.id.activity_main_menu_search).getActionView(); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){ public boolean onQueryTextSubmit(String p1){ List<Application> auxList = Search.search(mContext, p1); AdapterApp aux = new AdapterApp(mContext, auxList); setListAdapter(aux); getListView().setOnItemClickListener(aux.getItemClickListener()); return true; } public boolean onQueryTextChange(String p1){ return false; } }); return super.onCreateOptionsMenu(menu); } 

activity_main_menu.xml:

 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/activity_main_menu_search" android:title="@string/search" android:icon="@android:drawable/ic_menu_search" android:showAsAction="ifRoom|collapseActionView" android:actionViewClass="com.actionbarsherlock.widget.SearchView " /> <item android:id="@+id/activity_main_menu_purchase" android:title="@string/purchase" android:icon="@drawable/ic_launcher_market_holo" android:showAsAction="ifRoom|collapseActionView" /> </menu> 

Также я должен сказать, что я правильно импортировал необходимые классы:

 import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.ActionBar.OnNavigationListener; import com.actionbarsherlock.app.SherlockListActivity; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; import com.actionbarsherlock.view.MenuItem.OnActionExpandListener; import com.actionbarsherlock.widget.SearchView; 

И это трассировка стека. Когда создается SearchView, журнал возвращает это:

 06-03 19:42:43.128: W/dalvikvm(15936): dvmFindClassByName rejecting 'com.actionbarsherlock.widget.SearchView ' 06-03 19:42:43.138: W/MenuInflater(15936): Cannot instantiate class: com.actionbarsherlock.widget.SearchView 06-03 19:42:43.138: W/MenuInflater(15936): java.lang.ClassNotFoundException: Didn't find class "com.actionbarsherlock.widget.SearchView " on path: /data/app/com.iamaner.oneclickfreeze-1.apk 06-03 19:42:43.138: W/MenuInflater(15936): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:65) 06-03 19:42:43.138: W/MenuInflater(15936): at java.lang.ClassLoader.loadClass(ClassLoader.java:501) 06-03 19:42:43.138: W/MenuInflater(15936): at java.lang.ClassLoader.loadClass(ClassLoader.java:461) 06-03 19:42:43.138: W/MenuInflater(15936): at com.actionbarsherlock.view.MenuInflater$MenuState.newInstance(MenuInflater.java:486) 06-03 19:42:43.138: W/MenuInflater(15936): at com.actionbarsherlock.view.MenuInflater$MenuState.setItem(MenuInflater.java:447) 06-03 19:42:43.138: W/MenuInflater(15936): at com.actionbarsherlock.view.MenuInflater$MenuState.addItem(MenuInflater.java:468) 06-03 19:42:43.138: W/MenuInflater(15936): at com.actionbarsherlock.view.MenuInflater.parseMenu(MenuInflater.java:190) 06-03 19:42:43.138: W/MenuInflater(15936): at com.actionbarsherlock.view.MenuInflater.inflate(MenuInflater.java:112) 06-03 19:42:43.138: W/MenuInflater(15936): at com.iamaner.oneclickfreeze.ActivityMain.onCreateOptionsMenu(ActivityMain.java:131) 06-03 19:42:43.138: W/MenuInflater(15936): at com.actionbarsherlock.app.SherlockListActivity.onCreatePanelMenu(SherlockListActivity.java:184) 06-03 19:42:43.138: W/MenuInflater(15936): at com.actionbarsherlock.ActionBarSherlock.callbackCreateOptionsMenu(ActionBarSherlock.java:559) 06-03 19:42:43.138: W/MenuInflater(15936): at com.actionbarsherlock.internal.ActionBarSherlockNative.dispatchCreateOptionsMenu(ActionBarSherlockNative.java:65) 06-03 19:42:43.138: W/MenuInflater(15936): at com.actionbarsherlock.app.SherlockListActivity.onCreateOptionsMenu(SherlockListActivity.java:149) 06-03 19:42:43.138: W/MenuInflater(15936): at android.app.Activity.onCreatePanelMenu(Activity.java:2490) 06-03 19:42:43.138: W/MenuInflater(15936): at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:458) 06-03 19:42:43.138: W/MenuInflater(15936): at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:820) 06-03 19:42:43.138: W/MenuInflater(15936): at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:248) 06-03 19:42:43.138: W/MenuInflater(15936): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 06-03 19:42:43.138: W/MenuInflater(15936): at android.view.Choreographer.doCallbacks(Choreographer.java:562) 06-03 19:42:43.138: W/MenuInflater(15936): at android.view.Choreographer.doFrame(Choreographer.java:531) 06-03 19:42:43.138: W/MenuInflater(15936): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 06-03 19:42:43.138: W/MenuInflater(15936): at android.os.Handler.handleCallback(Handler.java:725) 06-03 19:42:43.138: W/MenuInflater(15936): at android.os.Handler.dispatchMessage(Handler.java:92) 06-03 19:42:43.138: W/MenuInflater(15936): at android.os.Looper.loop(Looper.java:137) 06-03 19:42:43.138: W/MenuInflater(15936): at android.app.ActivityThread.main(ActivityThread.java:5231) 06-03 19:42:43.138: W/MenuInflater(15936): at java.lang.reflect.Method.invokeNative(Native Method) 06-03 19:42:43.138: W/MenuInflater(15936): at java.lang.reflect.Method.invoke(Method.java:511) 06-03 19:42:43.138: W/MenuInflater(15936): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 

Тогда SearchView имеет значение null, поэтому я получаю исключение NullPointerException при вызове SearchView.setOnQueryTextListener ();

 06-03 19:42:43.148: E/AndroidRuntime(15936): FATAL EXCEPTION: main 06-03 19:42:43.148: E/AndroidRuntime(15936): java.lang.NullPointerException 06-03 19:42:43.148: E/AndroidRuntime(15936): at com.iamaner.oneclickfreeze.ActivityMain.onCreateOptionsMenu(ActivityMain.java:133) 06-03 19:42:43.148: E/AndroidRuntime(15936): at com.actionbarsherlock.app.SherlockListActivity.onCreatePanelMenu(SherlockListActivity.java:184) 06-03 19:42:43.148: E/AndroidRuntime(15936): at com.actionbarsherlock.ActionBarSherlock.callbackCreateOptionsMenu(ActionBarSherlock.java:559) 06-03 19:42:43.148: E/AndroidRuntime(15936): at com.actionbarsherlock.internal.ActionBarSherlockNative.dispatchCreateOptionsMenu(ActionBarSherlockNative.java:65) 06-03 19:42:43.148: E/AndroidRuntime(15936): at com.actionbarsherlock.app.SherlockListActivity.onCreateOptionsMenu(SherlockListActivity.java:149) 06-03 19:42:43.148: E/AndroidRuntime(15936): at android.app.Activity.onCreatePanelMenu(Activity.java:2490) 06-03 19:42:43.148: E/AndroidRuntime(15936): at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:458) 06-03 19:42:43.148: E/AndroidRuntime(15936): at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:820) 06-03 19:42:43.148: E/AndroidRuntime(15936): at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:248) 06-03 19:42:43.148: E/AndroidRuntime(15936): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 06-03 19:42:43.148: E/AndroidRuntime(15936): at android.view.Choreographer.doCallbacks(Choreographer.java:562) 06-03 19:42:43.148: E/AndroidRuntime(15936): at android.view.Choreographer.doFrame(Choreographer.java:531) 06-03 19:42:43.148: E/AndroidRuntime(15936): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 06-03 19:42:43.148: E/AndroidRuntime(15936): at android.os.Handler.handleCallback(Handler.java:725) 06-03 19:42:43.148: E/AndroidRuntime(15936): at android.os.Handler.dispatchMessage(Handler.java:92) 06-03 19:42:43.148: E/AndroidRuntime(15936): at android.os.Looper.loop(Looper.java:137) 06-03 19:42:43.148: E/AndroidRuntime(15936): at android.app.ActivityThread.main(ActivityThread.java:5231) 06-03 19:42:43.148: E/AndroidRuntime(15936): at java.lang.reflect.Method.invokeNative(Native Method) 06-03 19:42:43.148: E/AndroidRuntime(15936): at java.lang.reflect.Method.invoke(Method.java:511) 06-03 19:42:43.148: E/AndroidRuntime(15936): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 

Я потратил весь день на поиски причины ошибки, но не успел … Пожалуйста, мне нужна помощь

Ну, сама ошибка вызвана библиотекой ActionBarSherlock, здесь вы можете найти проблему в GitHub: https://github.com/JakeWharton/ActionBarSherlock/issues/685

И комментарий, размещенный здесь, был моим решением: https://github.com/JakeWharton/ActionBarSherlock/issues/685#issuecomment-11670533

Перейдите к res / values-v14 / abs_themes.xml проекта библиотеки ABS: тогда вы должны отредактировать первые две темы следующим образом:

 <style name="Sherlock.__Theme" parent="android:Theme.Holo"> <item name="textColorPrimary">@color/abs__primary_text_holo_light</item> <item name="textColorPrimaryInverse">@color/abs__primary_text_holo_dark</item> </style> <style name="Sherlock.__Theme.Light" parent="android:Theme.Holo.Light"> <item name="textColorPrimary">@color/abs__primary_text_holo_light</item> <item name="textColorPrimaryInverse">@color/abs__primary_text_holo_dark</item> </style> 

Также не забудьте объявить в своем манифесте те действия, которые его используют:

 android:theme="@style/Theme.Sherlock.Light" 

Я не очень-то знаком с использованием класса ActionBarSherlock SearchView, но могу сказать, что если вы посмотрите на образцы , он не попытается получить SearchView из меню, но он создает SearchView и устанавливает Это в меню.

 @Override public boolean onCreateOptionsMenu(Menu menu) { //Used to put dark icons on light action bar boolean isLight = SampleList.THEME == R.style.Theme_Sherlock_Light; //Create the search view SearchView searchView = new SearchView(getSupportActionBar().getThemedContext()); searchView.setQueryHint("Search for countries…"); searchView.setOnQueryTextListener(this); searchView.setOnSuggestionListener(this); if (mSuggestionsAdapter == null) { MatrixCursor cursor = new MatrixCursor(COLUMNS); cursor.addRow(new String[]{"1", "'Murica"}); cursor.addRow(new String[]{"2", "Canada"}); cursor.addRow(new String[]{"3", "Denmark"}); mSuggestionsAdapter = new SuggestionsAdapter(getSupportActionBar().getThemedContext(), cursor); } searchView.setSuggestionsAdapter(mSuggestionsAdapter); menu.add("Search") .setIcon(isLight ? R.drawable.ic_search_inverse : R.drawable.abs__ic_search) .setActionView(searchView) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); return true; } 

Этот комментарий по вышеупомянутой проблеме github решил это сформировать меня. (Странное исправление, поскольку вы просто удаляете базу Темы).