私はアプリの互換性をほのめかしたので、私の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の使用を開始してから発生しました。
よろしく、
app
にもカスタムactionViewClass
名前空間を使用してみてください。
app:actionViewClass="Android.support.v7.widget.SearchView"/>
proguard-rules.pro内部にあるファイルに次の行を追加しますappフォルダー:
-keep class Android.support.v7.widget.SearchView {*; }
これは、プロガードを有効にしていて、SearchView
クラスを除去している場合にも発生する可能性があります。クラスを維持するには、プロガード設定を変更する必要があります。
詳細については、 this questionを参照してください。
これは、Simasの回答に対する追加情報です。私はこれを別の答えで見つけました( https://stackoverflow.com/a/33400808/4949671 )、それは私の例外を解決するために非常に重要でした:
app:actionViewClass
[〜#〜] not [〜#〜]Android:actionViewClass
「実行とエラー」を再生してしばらくすると、解決策が見つかりました。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>
詳細-> ドキュメント
progurdを使用する場合、次の行をproguard-rules.proファイルに追加する必要があります
-keep public class Android.support.v7.widget。** {*; }
または
-keep class Android.support.v7.widget.SearchView {*; }
そのようなビルドタイプで縮小する場合、「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 { *; }
Proguardが有効になっている場合に問題が発生します。これを保護ルールに追加することで修正できます
-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;
}
});