我正在尝试将 Search-ActionView 添加到我的应用程序中(如此处所述http://developer.android.com/guide/topics/search/search-dialog.html#UsingSearchWidget 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)
由于这个问题经常被查找,而且我一次又一次地偶然发现了同样的问题,这里有一个小跟进,它跟踪创建 SearchWidget 的所有必要步骤。
不过,SearchWidget 有一个棘手的部分:如果您在 searchable.xml 中使用硬编码字符串而不是资源,应用程序将崩溃并显示令人困惑的错误消息。这花了我一生太多的时间......
-
创建一个 Activity 来处理搜索结果
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" />
-
在 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" />
to an 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 添加到应提供 SearchWidget 的每个活动中的 ActionView
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 );
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)