Search-ActionViewをアプリケーションに追加しようとしています(ここで説明しているように http://developer.Android.com/guide/topics/search/search-dialog.html#UsingSearchWidget )。残念ながら、NullPointerExceptionが発生し続け、実際に何が間違っているのかを検出するのに苦労しています。
Androidページに表示される検索可能な構成と検索可能なアクティビティを作成しました。私のメニュー.xmlファイルは次のようになります。
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >
...
<item
Android:id="@+id/menu_item_search"
Android:actionViewClass="Android.widget.SearchView"
Android:icon="@drawable/icon_search"
Android:showAsAction="always"
Android:title="@string/action_bar_button_search">
</item>
</menu>
これは、例外がスローされるメソッドです。
public boolean onCreateOptionsMenu( Menu menu )
{
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate( R.menu.action_bar, menu );
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.menu_item_search).getActionView();
// NullPointerException thrown here; searchView is null.
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false);
return super.onCreateOptionsMenu( menu );
}
完全なスタックトレース:
FATAL EXCEPTION: main
Java.lang.NullPointerException
at com.example.activities.Test.onCreateOptionsMenu(Test.Java:41)
at Android.app.Activity.onCreatePanelMenu(Activity.Java:2444)
at com.Android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.Java:408)
at com.Android.internal.policy.impl.PhoneWindow.invalidatePanelMenu(PhoneWindow.Java:759)
at com.Android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.Java:2997)
at Android.os.Handler.handleCallback(Handler.Java:605)
at Android.os.Handler.dispatchMessage(Handler.Java:92)
at Android.os.Looper.loop(Looper.Java:137)
at Android.app.ActivityThread.main(ActivityThread.Java:4507)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:511)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:790)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:557)
at dalvik.system.NativeStart.main(Native Method)
link のようにこの方法を使用します
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.action_bar, menu);
MenuItem searchItem = menu.findItem(R.id.menu_item_search);
SearchView searchView = (SearchView) searchItem.getActionView();
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
if(null!=searchManager ) {
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
}
searchView.setIconifiedByDefault(false);
return true;
}
この質問は非常に頻繁に検索され、同じ問題に何度も出くわしたので、SearchWidgetを作成するために必要なすべての手順を追跡する小さなフォローアップがあります。
ただし、SearchWidgetには注意が必要な部分が1つあります。searchable.xmlでリソースの代わりにハードコーディングされた文字列を使用すると、混乱するエラーメッセージでアプリがクラッシュします。これは私の人生の何時間もかかりました...
検索結果を処理するアクティビティを作成する
public class Search extends Activity {}
Res/xmlディレクトリにファイル「searchable.xml」を追加します(ヒントとラベルにリソースを使用してください!)
<searchable xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:hint="@string/search_hint"
Android:includeInGlobalSearch="false"
Android:label="@string/search_label"
Android:searchSettingsDescription="@string/search_global_description" />
Res/menuディレクトリに適切なメニュー項目「main.xml」を作成します
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item
Android:id="@+id/options_menu_main_search"
Android:actionViewClass="Android.widget.SearchView"
Android:icon="@drawable/icon_magnifier"
Android:showAsAction="always"
Android:title="Search"/>
</menu>
Manifest.xmlを更新します。検索アクティビティを追加し、検索アクティビティを受け取るアクティビティを指定します。 <meta-data Android:name="Android.app.default_searchable" Android:value=".app.Search" />
をactivity
ノードに追加すると、検索可能になります。 application
ノードに追加すると、すべてのアクティビティが検索可能になります。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android">
<application>
<meta-data
Android:name="Android.app.default_searchable"
Android:value=".app.Search" />
<activity Android:name=".activities.Search" >
<intent-filter>
<action Android:name="Android.intent.action.SEARCH" />
</intent-filter>
<meta-data
Android:name="Android.app.searchable"
Android:resource="@xml/searchable" />
</activity>
</application>
SearchWidgetを提供するすべてのアクティビティで、ActionManagerにSearchManagerを追加します
public class Activity extends Android.app.Activity
{
@Override
public boolean onCreateOptionsMenu( Menu menu )
{
getMenuInflater().inflate( R.menu.main, menu );
// Add SearchWidget.
SearchManager searchManager = (SearchManager) getSystemService( Context.SEARCH_SERVICE );
SearchView searchView = (SearchView) menu.findItem( R.id.options_menu_main_search ).getActionView();
searchView.setSearchableInfo( searchManager.getSearchableInfo( getComponentName() ) );
return super.onCreateOptionsMenu( menu );
}
}
ターゲティングを使用している場合Android 2.xおよびAndroid.support.v7.widget.SearchViewを使用して、menu.xmlが次のようになっていることを確認します(yourapp名前空間)
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:yourapp="http://schemas.Android.com/apk/res-auto">
<item
Android:id="@+id/search"
Android:title="@string/search"
Android:icon="@drawable/ic_search"
yourapp:showAsAction="always"
yourapp:actionViewClass="Android.support.v7.widget.SearchView" />
</menu>
そして、メニューを膨らませるアクティビティで:
Android.support.v7.widget.SearchView searchView = (Android.support.v7.widget.SearchView)
MenuItemCompat.getActionView(menu.findItem(R.id.search));
SearchView getActionViewはnullを返します
リンクのように、メニューxmlファイルを開いて変更します
Android:actionViewClass="Android.widget.SearchView"
に
app:actionViewClass="Android.widget.SearchView"
これは私のために働いた
私も同じ問題を抱えていました。私の場合、Android:actionViewClass
からapp:actionViewClass
は問題を解決しました(xmlns:app="http://schemas.Android.com/apk/res-auto"
in <menu>
鬼ごっこ)。
まず、SearchWidgetを含むXMLファイルをレイアウトフォルダーに作成します。
<?xml version="1.0" encoding="utf-8"?>
<SearchView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/edit_query"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:inputType="textFilter"
>
</SearchView>
次に、アクティビティでアクションバーを取得します
Android.support.v7.app.ActionBar actionBar = getSupportActionBar();
次に、検索ビューへの参照を追加します
actionBar.setCustomView(R.layout.custom_action_bar);
search = (EditText) actionBar.getCustomView().findViewById(
R.id.edit_query);
次に、アクションバーの表示オプションを設定します
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_HOME_AS_UP);
それでおしまい。
ところで、入力したクエリに従って、文字列のリストを配列リストとして取得して表示するmy search widget を使用することもできます。ユーザーが特定の結果を選択すると、選択した結果が返され、親アクティビティのonActivityResultで取得できます。
この問題は、インテントフィルターが欠落していることによって引き起こされます。
<intent-filter>
<action Android:name="Android.intent.action.SEARCH" />
</intent-filter>