gpt4 book ai didi

android - 使用 ActionBarSherlock 在 SearchView 上出现 NullPointerException

转载 作者:太空宇宙 更新时间:2023-11-03 10:24:50 24 4
gpt4 key购买 nike

我正在使用 ActionBarSherlock 和支持库 v4。这是在“SherlockFragmentActivity”中。

我在第 269 行收到一个 Nullpointer,引用如下。我已验证 SearchView 为空,而不是 SearchManager。虽然 menu 也为空,但我不确定这是否正常? 重要提示:它在我的 Android 4.0 和 4.1 测试中仅为 null。在 2.3 中,效果很好!

这是我的 SearchView 代码:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.menu, menu);

SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView =
(SearchView) menu.findItem(R.id.menu_search).getActionView(); // line 269
searchView.setSearchableInfo(
searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(true);
searchView.setSubmitButtonEnabled(true);
return true;
}

我现在把这个作为我的菜单项。

 <item
android:id="@+id/menu_search"
android:actionViewClass="com.actionbarsherlock.widget.SearchView"
android:icon="@android:drawable/ic_menu_search"
android:showAsAction="always"
android:title="search"/>

LogCat

FATAL EXCEPTION: main
java.lang.NullPointerException
at com.---.---.master.MainFragmentActivity
.setupSearchView(MainFragmentActivity.java:269)
at com.---.---.master.MainFragmentActivity.onCreateOptionsMenu(
MainFragmentActivity.java:258)
at android.support.v4.app.Watson.onCreatePanelMenu(Watson.java:45)
at com.actionbarsherlock.ActionBarSherlock.callbackCreateOptionsMenu(
ActionBarSherlock.java:559)
at com.actionbarsherlock.internal.ActionBarSherlockCompat.preparePanel(
ActionBarSherlockCompat.java:479)
at com.actionbarsherlock.internal.ActionBarSherlockCompat
.dispatchInvalidateOptionsMenu(ActionBarSherlockCompat.java:272)
at com.actionbarsherlock.internal.ActionBarSherlockCompat$1.run(
ActionBarSherlockCompat.java:984)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3683)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(
ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)

进口:

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.app.SherlockListFragment;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.widget.SearchView;

import android.app.SearchManager;

同样,我仅在 4.0 模拟器和 4.1 设备中获得空指针。应用程序在 2.3 中运行良好。有一次,ActionBarSherlock 之前使用相同的代码,除了通过正常方式(不是 Sherlock)导入 SearchView 它在 4.0 中运行良好。我正在尝试使我的应用向后兼容,并打破了较新的 Android 版本,但在旧版本中运行良好。

编辑: 当菜单项有 android:actionViewClass="android.app.SearchView" 时,它实际上在 2.3 中为 Null,在 4.0+ 中为 Cast Issue然后我将其更改为 android:actionViewClass="com.actionbarsherlock.widget.SearchView"现在在 2.3 中修复,在 4.0+ 中为 Null

更新:我似乎用 hack 修复了它:

我添加了一个 menu-v11 文件夹,添加了一个 menu.xml 的副本文件,其中只有一项更改:android:actionViewClass="android.app.SearchView",否则它与其他 menu.xml 文件相同。

在 Java 中,我这样做了:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.menu, menu);
MenuItem searchItem = menu.findItem(R.id.menu_search);
SearchManager searchManager =
(SearchManager) getSystemService(Context.SEARCH_SERVICE);

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setSearchableInfo(searchManager
.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(true);
searchView.setSubmitButtonEnabled(true);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
setupNewSearchView(searchItem, searchManager);
}
return true;
}


@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void setupNewSearchView(MenuItem searchItem,
SearchManager searchManager) {
android.widget.SearchView searchView =
(android.widget.SearchView) searchItem.getActionView();
searchView.setSearchableInfo(searchManager
.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(true);
searchView.setSubmitButtonEnabled(true);
}

好吧,它有效,但我还没有把它作为答案,因为它看起来像是一种 hack 方式。对更好的想法持开放态度?

最佳答案

ActionBarSherlock(或 ActionBarSherlock + HoloEverywhere + Theme.Sherlock.Light.DarkActionBar?)中的 v14(和 v11?)存在缺少属性的问题。

Simple solution and details in the issue thread…

关于android - 使用 ActionBarSherlock 在 SearchView 上出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13982758/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com