我正在使用ActionBarSherlock
和支持库v4。这是一个'SherlockFragmentActivity'。
我在第269行获得了Nullpointer,如下所示。我已经验证SearchView为null,而不是SearchManager。虽然,menu
也是空的,但我不确定这是否正常? 重要提示:在我的Android 4.0和4.1测试中,它仅为空。在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设备上获得Null指针。应用程序在2.3中运行良好。有一段时间,ActionBarSherlock之前,使用相同的代码,除了通过正常方式导入SearchView
(而不是Sherlock),它在4.0中运行良好。我正在努力使我的应用程序向后兼容,并打破了较新的Android版本,但在较旧版本中效果很好。
编辑:当菜单项android:actionViewClass="android.app.SearchView"
时,它实际上是2.3中的Null和4.0+中的Cast问题
然后我将其更改为android:actionViewClass="com.actionbarsherlock.widget.SearchView"
现在固定在2.3和Null in 4.0 +
更新:我似乎用黑客修复了它:
我添加了一个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);
}
嗯,它确实有效,但我还没有把它作为一个答案,因为它似乎是黑客的做法。愿意接受更好的想法吗?
答案 0 :(得分:2)
ActionBarSherlock(或ActionBarSherlock + HoloEverywhere + Theme.Sherlock.Light.DarkActionBar?)中的v14(和v11?)有缺少attrs 的问题。
答案 1 :(得分:0)
您正在尝试使用两个完全不同的类,这两个类都命名为SearchView但在不同的包中。您不能简单地将对象从一个类转换为另一个类。 com.actionbarsherlock.widget.Searchview与android.widget.SearchView不同。因此,第269行searchView
为空。
从Java文件的顶部看到导入是相关的。
可能是R.id.menu_search引用的视图是一个android.widget.SearchView,你的代码希望它是一个com.actionbarsherlock.widget.Searchview。
答案 2 :(得分:0)
在您计划使用ActionBar
的每项活动的代码下,在清单文件中添加主题属性。您可以创建自己的自定义主题,也可以使用ActionBarSherlock
提供的默认主题之一。
<activity
android:name="com.example.MyActivityWithActionBar"
...
android:theme="@style/Theme.Sherlock.Light">
</activity>
更多信息: