web-dev-qa-db-ja.com

アプリの互換性があるため、Searchviewは機能しません

私はアプリの互換性をほのめかしたので、私の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)

だから私が持っている間にsearchviewのnullpointer:

@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"/>

なぜそれがもう機能しないのか分かりませんが、app compat 21の使用を開始してから発生しました。

よろしく、

61
Laurenswuyts

appにもカスタムactionViewClass名前空間を使用してみてください。

app:actionViewClass="Android.support.v7.widget.SearchView"/>
229
Simas

proguard-rules.pro内部にあるファイルに次の行を追加しますappフォルダー:

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

40
Darush

これは、プロガードを有効にしていて、SearchViewクラスを除去している場合にも発生する可能性があります。クラスを維持するには、プロガード設定を変更する必要があります。

詳細については、 this questionを参照してください。

15
Parag Sarda

これは、Simasの回答に対する追加情報です。私はこれを別の答えで見つけました( https://stackoverflow.com/a/33400808/4949671 )、それは私の例外を解決するために非常に重要でした:

app:actionViewClass[〜#〜] not [〜#〜]Android:actionViewClass

11

「実行とエラー」を再生してしばらくすると、解決策が見つかりました。UI要素がエラーの原因ではないようです。 QueryListenerに検索を設定すると、正常に機能します。コードは次のとおりです。

ActivitySearchBarを含む:

@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"/>

menu.xmlの「SearchBar」

     <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"/>

...

そして最後に、大事なことを言い忘れていましたが、manifest(しかし、これは明確でなければなりません)...

  <activity
        Android:name=".activities.MainActivity"
        Android:label="@string/title_activity_main">
        <meta-data
            Android:name="Android.app.searchable"
            Android:resource="@xml/searchable"/>
    </activity>

詳細-> ドキュメント

10
Martin Pfeffer

progurdを使用する場合、次の行をproguard-rules.proファイルに追加する必要があります

-keep public class Android.support.v7.widget。** {*; }

または

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

4
Masum

そのようなビルドタイプで縮小する場合、「proguard-rules.pro」ファイルを1行追加する必要があります。

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 { *; }
1
Atiar Talukdar

Proguardが有効になっている場合に問題が発生します。これを保護ルールに追加することで修正できます

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

0
jeevraj jangid

結果をクリックした後、アプリは操作が完了していないことを予期しており、さらに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;
            }
        });
0