getSearchableInfo returns 空
getSearchableInfo returns NULL
在尝试了 Whosebug 中关于这个问题的所有解决方案之后,我决定在这里提问。
我正在尝试在我的操作栏中实现搜索栏。
我正在使用 AppCompatActivity 并导入 android.support.v7.widget.SearchView.
郑重声明,我正在使用 PageManager 和 TabLayout(如果有任何关系的话)。
我在以下行中收到 java.lang.NullPointerException 错误:
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
这是我的代码:
搜索栏声明在 menu_main.xml:
<item
android:id="@+id/searchPlace"
android:title="@string/search_hint"
android:actionViewClass="android.support.v7.widget.SearchView"
android:showAsAction="always"/>
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_hint" />
AndroidManifest.xml
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.AppCompat.Light.NoActionBar" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.default_searchable"
android:value=".searchResultActivity" />
</activity>
<activity
android:name=".Settings"
android:label="@string/title_activity_settings" >
</activity>
<activity
android:name=".searchResultActivity"
android:label="@string/app_name"
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
<!-- to identify this activity as "searchable" -->
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
在我的 MainActivity.java onCreateOptionsMenu 中搜索代码:
// Associate searchable configuration with the SearchView
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView =
(SearchView) menu.findItem(R.id.searchPlace).getActionView();
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
Logcat 错误:
Process: il.co.test.test, PID: 1642
java.lang.NullPointerException
at il.co.test.test.MainActivity.onCreateOptionsMenu(MainActivity.java:106)
at android.app.Activity.onCreatePanelMenu(Activity.java:2538)
at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:262)
at android.support.v7.internal.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:85)
at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.onCreatePanelMenu(AppCompatDelegateImplBase.java:267)
at android.support.v7.internal.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:85)
at android.support.v7.internal.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:448)
at android.support.v7.internal.app.ToolbarActionBar.run(ToolbarActionBar.java:65)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
更新
我不确定,我不知道如何检查 - 但我很确定我的 getActionVIew() returns NULL.
更新 2 - 已修复!
在检查了一些关于 getActionView() null 问题的 Whosebug 之后,
getActionView() of my MenuItem return null 的第二个答案解决了我的问题。
我不得不使用命名空间 app 代替 android.
真的很痛!
希望有人能发现我的错误并帮助我改正,因为我花了 6 个小时尝试了很多解决方案。
提前致谢!
搜索菜单项
<item
android:id="@+id/searchPlace"
android:title="@string/search_hint"
android:actionViewClass="android.support.v7.widget.SearchView"
android:title="@string/search"
app:showAsAction="always|collapseActionView"/>
Activity代码
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.your_menu, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.searchPlace).getActionView();
searchView.setOnQueryTextListener(queryTextListener);
return true;
}
private OnQueryTextListener queryTextListener = new OnQueryTextListener()
{
@Override
public boolean onQueryTextSubmit(String query) {
//if you need this
return false;
}
@Override
public boolean onQueryTextChange(String query) {
//your code
return true;
}
};
在这种情况下,您不需要可搜索的配置,不需要清单中的笔触,不需要 SearchManager 和其他东西。只需在菜单中声明搜索项即可。
在检查了一些关于 getActionView() null 问题的 Whosebug 之后,
getActionView() of my MenuItem return null 的第二个答案解决了我的问题。
我不得不使用命名空间 app 代替 android.
好痛!
在尝试了 Whosebug 中关于这个问题的所有解决方案之后,我决定在这里提问。
我正在尝试在我的操作栏中实现搜索栏。 我正在使用 AppCompatActivity 并导入 android.support.v7.widget.SearchView.
郑重声明,我正在使用 PageManager 和 TabLayout(如果有任何关系的话)。
我在以下行中收到 java.lang.NullPointerException 错误:
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
这是我的代码:
搜索栏声明在 menu_main.xml:
<item
android:id="@+id/searchPlace"
android:title="@string/search_hint"
android:actionViewClass="android.support.v7.widget.SearchView"
android:showAsAction="always"/>
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_hint" />
AndroidManifest.xml
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.AppCompat.Light.NoActionBar" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.default_searchable"
android:value=".searchResultActivity" />
</activity>
<activity
android:name=".Settings"
android:label="@string/title_activity_settings" >
</activity>
<activity
android:name=".searchResultActivity"
android:label="@string/app_name"
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
<!-- to identify this activity as "searchable" -->
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
在我的 MainActivity.java onCreateOptionsMenu 中搜索代码:
// Associate searchable configuration with the SearchView
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView =
(SearchView) menu.findItem(R.id.searchPlace).getActionView();
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
Logcat 错误:
Process: il.co.test.test, PID: 1642
java.lang.NullPointerException
at il.co.test.test.MainActivity.onCreateOptionsMenu(MainActivity.java:106)
at android.app.Activity.onCreatePanelMenu(Activity.java:2538)
at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:262)
at android.support.v7.internal.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:85)
at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.onCreatePanelMenu(AppCompatDelegateImplBase.java:267)
at android.support.v7.internal.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:85)
at android.support.v7.internal.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:448)
at android.support.v7.internal.app.ToolbarActionBar.run(ToolbarActionBar.java:65)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
更新
我不确定,我不知道如何检查 - 但我很确定我的 getActionVIew() returns NULL.
更新 2 - 已修复!
在检查了一些关于 getActionView() null 问题的 Whosebug 之后, getActionView() of my MenuItem return null 的第二个答案解决了我的问题。 我不得不使用命名空间 app 代替 android.
真的很痛!
希望有人能发现我的错误并帮助我改正,因为我花了 6 个小时尝试了很多解决方案。
提前致谢!
搜索菜单项
<item
android:id="@+id/searchPlace"
android:title="@string/search_hint"
android:actionViewClass="android.support.v7.widget.SearchView"
android:title="@string/search"
app:showAsAction="always|collapseActionView"/>
Activity代码
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.your_menu, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.searchPlace).getActionView();
searchView.setOnQueryTextListener(queryTextListener);
return true;
}
private OnQueryTextListener queryTextListener = new OnQueryTextListener()
{
@Override
public boolean onQueryTextSubmit(String query) {
//if you need this
return false;
}
@Override
public boolean onQueryTextChange(String query) {
//your code
return true;
}
};
在这种情况下,您不需要可搜索的配置,不需要清单中的笔触,不需要 SearchManager 和其他东西。只需在菜单中声明搜索项即可。
在检查了一些关于 getActionView() null 问题的 Whosebug 之后, getActionView() of my MenuItem return null 的第二个答案解决了我的问题。 我不得不使用命名空间 app 代替 android.
好痛!