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 решил это сформировать меня. (Странное исправление, поскольку вы просто удаляете базу Темы).

Intereting Posts
Как работает отслеживание установки приложений Android? Является ли класс android.os.Handler устранением необходимости объявлять определенные методы как синхронизированные? Android flavor – не может найти символьную переменную в файле R В чем разница между библиотекой SlidingMenu и Android Navigation Drawer? Android – пользовательский интерфейс с настраиваемыми атрибутами Выполните действие над кнопкой Нажмите в пользовательском уведомлении: Android Progressbar togther с asyncTask Как подать виджет DatePicker с другими календарными системами? Geofences не работает, когда приложение убито Android: как проверить, работает ли приложение в фоновом режиме Google API для определения местоположения требуется интернет? Может ли библиотека на Android иметь свои собственные фильтры? Java.lang.IllegalAccessError: класс ref в предварительно проверенном классе разрешен для неожиданной реализации при запуске тестового проекта? Как получить статус загрузки? Android: Как я могу проверить определенный элемент в проверенном ListView?