4

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

我在第 269 行得到了一个 Nullpointer,如下所示。我已验证 SearchView 为空,而不是 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"/>

日志猫

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 中运行良好。有一次,pre-ActionBarSherlock,使用相同的代码,除了SearchView通过正常方式(不是 Sherlock)导入它在 4.0 中工作得很好。我正在尝试使我的应用程序向后兼容并且破坏了较新的 Android 版本,但在较旧的版本中运行良好。

编辑: 当菜单项有时,它实际上是 2.3 中的 Null 和 4.0+ 中的 Cast Issue android:actionViewClass="android.app.SearchView" 然后我将其更改为 android:actionViewClass="com.actionbarsherlock.widget.SearchView" ,现在在 2.3 中为 FIXED,在 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);
}

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

4

3 回答 3

2
于 2013-03-09T00:56:54.317 回答
0

您正在尝试使用两个完全不同的类,它们都名为 SearchView 但在不同的包中。您不能简单地将对象从一个类转换为另一个类。com.actionbarsherlock.widget.Searchview 与 android.widget.SearchView 不同。因此,searchView在第 269 行为空。

从您的 Java 文件顶部查看导入对我们来说是相关的。

可能 R.id.menu_search 引用的视图是 android.widget.SearchView 并且您的代码期望它是 com.actionbarsherlock.widget.Searchview。

于 2012-12-21T00:46:33.487 回答
0
于 2013-03-12T14:12:44.793 回答