我试图搜索,添加的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)
用这种方式,如链接
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一个棘手的部分是: 如果您在searchable.xml,而不是资源使用硬编码字符串的应用程序将混乱的错误消息崩溃。 这花了我生命中太多的时间...
创建活动来处理搜索结果
public class Search extends Activity {}
添加文件“searchable.xml”你RES / 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" />
在你资源创建正确的菜单项“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>
在SearchManager的加入您在的ActionView每个活动应该提供SearchWidget
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));
搜索查看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"
在<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);
而已。
顺便说一句,你还可以用我的搜索小插件这需要一个字符串列表作为一个数组列表,并将其显示,根据输入的查询。 一旦用户选择了特定结果,所选择的结果被返回它可以在父活动的onActivityResult检索。
此问题是由缺少意图过滤器触发:
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>