Подтвердить что ты не робот

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.

Привет,

4b9b3361

Ответ 1

Попробуйте использовать собственное пространство имен app для своего actionViewClass тоже:

app:actionViewClass="android.support.v7.widget.SearchView"/>

Ответ 2

Добавьте следующую строку в файл proguard-rules.pro, расположенный внутри папки app:

-keep класс android.support.v7.widget.SearchView {*; }

Ответ 3

Это также может произойти, если у вас включена защита proguard, и она разделяет aways SearchView class. Вам нужно будет изменить настройки proguard, чтобы сохранить класс.

Подробнее см. этот.

Ответ 4

Это дополнительная информация для ответа Симаса. Я нашел это в другом ответе (fooobar.com/questions/104977/...), и это было очень важно для решения моего исключения:

Обратите внимание, что это app:actionViewClass НЕ android:actionViewClass

Ответ 5

после некоторого времени воспроизведения "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>

Дополнительная информация → Документы

Ответ 6

Если вы используете progurd, то вам нужно добавить следующую строку в файл proguard-rules.pro

-keep открытый класс android.support.v7.widget. ** {*; }

или же

-keep class android.support.v7.widget.SearchView {*; }

Ответ 7

Если вы минимизируете типы ваших сборок, то вам нужно добавить одну строку в ваш файл '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 { *; }

Ответ 8

После того, как вы нажмете на результат, ваше приложение ожидает, что операция не завершилась и пытается перейти к аргументу 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;
            }
        });

Ответ 9

Проблема возникает, если Proguard включен. можно исправить, добавив это в правила Proguard

-keep class android.support.v7.widget.SearchView {*; }

Ответ 10

У меня была довольно похожая проблема с 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. Он помечен как приватный, но вы можете использовать его. Или объявите фон нарисованным самостоятельно