Ответ 1
Попробуйте использовать собственное пространство имен app
для своего actionViewClass
тоже:
app:actionViewClass="android.support.v7.widget.SearchView"/>
Так как я внедрял приложение, мой поисковый запрос больше не работает:
Process: com.laurenswuyts.witpa, PID: 26666
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.SearchView.setSearchableInfo(android.app.SearchableInfo)' on a null object reference
at com.laurenswuyts.witpa.Activities.Events.EventActivity.onCreateOptionsMenu(EventActivity.java:75)
at android.app.Activity.onCreatePanelMenu(Activity.java:2820)
at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:275)
at android.support.v7.app.ActionBarActivity.superOnCreatePanelMenu(ActionBarActivity.java:276)
at android.support.v7.app.ActionBarActivityDelegate$1.onCreatePanelMenu(ActionBarActivityDelegate.java:79)
at android.support.v7.widget.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:49)
at android.support.v7.internal.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:459)
at android.support.v7.internal.app.ToolbarActionBar$1.run(ToolbarActionBar.java:69)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Так что nullpointer для searchview пока у меня есть:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.event_main, menu);
// Get the SearchView and set the searchable configuration
// Associate searchable configuration with the SearchView
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView =
(SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
return super.onCreateOptionsMenu(menu);
}
И в моем меню у меня есть следующее:
<!-- Search Widget -->
<item android:id="@+id/action_search"
android:title="@string/action_search"
android:icon="@drawable/ic_action_search"
app:showAsAction="always"
android:actionViewClass="android.support.v7.widget.SearchView"/>
Я понятия не имею, почему он больше не работает, но это произошло с тех пор, как я начал использовать приложение compat 21.
Привет,
Попробуйте использовать собственное пространство имен app
для своего actionViewClass
тоже:
app:actionViewClass="android.support.v7.widget.SearchView"/>
Добавьте следующую строку в файл proguard-rules.pro, расположенный внутри папки app:
-keep класс android.support.v7.widget.SearchView {*; }
Это также может произойти, если у вас включена защита proguard, и она разделяет aways SearchView
class. Вам нужно будет изменить настройки proguard, чтобы сохранить класс.
Подробнее см. этот.
Это дополнительная информация для ответа Симаса. Я нашел это в другом ответе (fooobar.com/questions/104977/...), и это было очень важно для решения моего исключения:
Обратите внимание, что это
app:actionViewClass
НЕandroid:actionViewClass
после некоторого времени воспроизведения "run and error" я нашел решение. Похоже, что пользовательский интерфейс не является причиной того, что вызывает ошибку. После установки поиска в QueryListener он работает хорошо. Вот какой код:
Активность, которая содержит SearchBar:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
Log.d(TAG, "onQueryTextSubmit ");
return false;
}
@Override
public boolean onQueryTextChange(String s) {
Log.d(TAG, "onQueryTextChange ");
return false;
}
});
return true;
}
searchable.xml
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_name"
android:hint="@string/search_hint"/>
И "SearchBar" в menu.xml
<item
android:id="@+id/search"
android:title="@string/search_title"
android:icon="@drawable/abc_ic_search_api_mtrl_alpha"
app:showAsAction="collapseActionView|ifRoom"
app:actionViewClass="android.support.v7.widget.SearchView"/>
...
И последнее, но не менее важное: манифест (но это должно быть понятно)...
<activity
android:name=".activities.MainActivity"
android:label="@string/title_activity_main">
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable"/>
</activity>
Дополнительная информация → Документы
Если вы используете progurd, то вам нужно добавить следующую строку в файл proguard-rules.pro
-keep открытый класс android.support.v7.widget. ** {*; }
или же
-keep class android.support.v7.widget.SearchView {*; }
Если вы минимизируете типы ваших сборок, то вам нужно добавить одну строку в ваш файл 'proguard-rules.pro'.
buildTypes {
release {
debuggable false
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
minifyEnabled false
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Добавьте строку в ваш файл 'proguard-rules.pro'.
-keep class android.support.v7.widget.SearchView { *; }
После того, как вы нажмете на результат, ваше приложение ожидает, что операция не завершилась и пытается перейти к аргументу Intent.
SearchView.OnSuggestionListener
и верните true
, который уведомляет ваше приложение о завершении операции щелчка.
searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {
@Override
public boolean onSuggestionClick(int position) {
return true;
}
@Override
public boolean onSuggestionSelect(int position) {
return false;
}
});
Проблема возникает, если Proguard включен. можно исправить, добавив это в правила Proguard
-keep class android.support.v7.widget.SearchView {*; }
У меня была довольно похожая проблема с androidx.appcompat.widget.SearchView
, но другая причина. Сбой происходит при нажатии кнопки действия
Process: hotspotshield.android.vpn, PID: 26089
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.drawable.Drawable.getPadding(android.graphics.Rect)' on a null object reference
at androidx.appcompat.widget.SearchView.adjustDropDownSizeAndPosition(SearchView.java:1373)
at androidx.appcompat.widget.SearchView$4.onLayoutChange(SearchView.java:380)
at android.view.View.layout(View.java:20690)
at android.view.ViewGroup.layout(ViewGroup.java:6194)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
В теме отсутствует атрибут android:popupBackground
. На самом деле материальные темы AppCompat имеют необходимый фон, но, несмотря на то, что моя тема выходит за рамки Theme.AppCompat.Light
, она все равно вылетает.
Единственное решение, которое я нашел, это переопределить атрибут:
<style name="AppTheme" parent="Theme.AppCompat.Light">
<item name="android:popupBackground" tools:ignore="PrivateResource">@drawable/abc_popup_background_mtrl_mult</item>
</style>
Это отрисовка по умолчанию, которая используется в AppCompat. Он помечен как приватный, но вы можете использовать его. Или объявите фон нарисованным самостоятельно