これは数日前に機能していましたが、突然停止しました。特定のフラグメントが表示されている場合にのみ、アクションバーの検索ウィジェットを使用します。
これでSearchView
を取得できなくなり、getActionView
は常にnullを返します。
searchable.xml
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:label="@string/app_name"
Android:hint="@string/search_for_places">
</searchable>
Manifest.xml
<activity
Android:name=".ui.activities.MainActivity"
Android:launchMode="singleTop">
<intent-filter>
<action Android:name="Android.intent.action.MAIN"/>
<category Android:name="Android.intent.category.LAUNCHER"/>
<action Android:name="Android.intent.action.SEARCH"/>
</intent-filter>
<meta-data
Android:name="Android.app.searchable"
Android:resource="@xml/searchable"/>
<meta-data
Android:name="Android.app.default_searchable"
Android:value=".ui.activities.MainActivity" />
</activity>
menu.xml
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:myapp="http://schemas.Android.com/apk/res-auto">
<item
Android:id="@+id/action_search_place"
Android:icon="@drawable/ic_2_action_search"
Android:orderInCategory="1"
Android:title="@string/title_search"
myapp:showAsAction="collapseActionView|ifRoom"
myapp:actionViewClass="Android.support.v7.widget.SearchView"/>
</menu>
フラグメント
...
setHasOptionsMenu(true);
...
@Override
public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
inflater.inflate(R.menu.menu, menu);
MenuItem searchItem = menu.findItem(R.id.action_search_place);
mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem);
SearchManager searchManager = (SearchManager) getBaseActivity().getSystemService(Context.SEARCH_SERVICE);
if (mSearchView != null) {
mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
mSearchView.setIconifiedByDefault(true);
mSearchView.setOnQueryTextListener(this);
}
super.onCreateOptionsMenu(menu, inflater);
}
今日、私は同じ問題を抱えていたので、解決したと思います。 ActionBarCompat
契約どおりではないことがいくつかありました。
ActionBarCompat
を使用する各アクティビティは、ActionBarActivity
ではなく FragmentActivity
を直接拡張する必要がありますActionBarCompat
を使用する各アクティビティは、ActionBarCompat
テーマから継承するものとしてテーマを宣言する必要があります。どちらも、Googleの 説明ビデオ を見て見つけました。
これで、私のsearchView
はnull
ではなくなりました。
私のメニューでは、Googleのドキュメントに従ってAndroid:actionViewClass="Android.widget.SearchView"
を使用したため、同じ問題が発生しました。
AppCompatActivityを使用している場合は、代わりにapp:actionViewClass="Android.widget.SearchView"
を使用する必要があります。
これが誰かを助けることを願っています。
プロガードを使用している場合、これが可能な答えです: https://code.google.com/p/Android/issues/detail?id=58508
要するに、以下の行をproguard構成ファイルに追加しますproguard-rules.pro
。
-keep class Android.support.v7.widget.SearchView { *; }
私はそれを修正しました:メニューxmlで、アプリの名前空間を使用しました:
app:showAsAction="collapseActionView|always"
app:actionViewClass="Android.support.v7.widget.SearchView"
Androidのチュートリアル https://developer.Android.com/training/search/setup.html では、Android:showAsとAndroid:actionView ...を使用しています。
私もこれを追加しました:
setHasOptionsMenu(true);
これと@ maxandron answer
私にとっては、次のソリューションがうまくいきました:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
tools:context="com.dev.ttburger.conttagem.BuscarProdutoActivity">
<item
Android:id="@+id/search"
Android:icon="@drawable/ic_search"
Android:title="Buscar"
app:showAsAction="always"
app:actionViewClass="Android.support.v7.widget.SearchView"/>
</menu>
への変更:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
tools:context="com.dev.ttburger.conttagem.BuscarProdutoActivity">
<item
Android:id="@+id/search"
Android:icon="@drawable/ic_search"
Android:title="Buscar"
app:showAsAction="always"
app:actionViewClass="Android.SearchView"/>
</menu>
今日、私は持っていなかったアイテムのgetActionView()呼び出しからnullを取得していることがわかりました。
Android:showAsAction="always"
それ以外の場合は、単に正しく膨張しないようです。
同じエラーが発生しました。そして、私は次のものを作りました:
FragmentActivityによって拡張されるアクティビティがあります:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.feed, menu);
// 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 true;
}
Searchable.xml:
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:label="@string/app_label"
Android:hint="@string/search_hint" >
</searchable>
Menu.xml:
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
tools:context="br.com.srtorcedor.FeedActivity">
<item Android:id="@+id/action_search"
Android:icon="@drawable/abc_ic_search"
Android:title="@string/search_title"
Android:showAsAction="always"
Android:actionViewClass="Android.widget.SearchView"/>
</menu>
AndroidManifest:
<activity
Android:name=".FeedActivity"
Android:icon="@drawable/ic_action_pins"
Android:label="@string/title_activity_feed">
<intent-filter>
<action Android:name="Android.intent.action.SEARCH" />
</intent-filter>
<meta-data
Android:name="Android.app.searchable"
Android:resource="@xml/searchable" />
</activity>
動作するか確認していただけますか?