4

我使用ActionBarSherlock和支持库V4。这是在'SherlockFragmentActivity'中。NullPointerException异常使用ActionBarSherlock

我上线269得到一个空指针,下面引用。我已验证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,使用相同的代码,除了通过正常途径进口SearchView(不是福尔摩斯),它4.0伟大的工作。我试图让我的应用程序向后兼容,并打破了较新的Android版本,但在较老的版本中效果很好。

编辑:它实际上是空的2.3和4.0 +

更新4.0+铸造发行时菜单项有android:actionViewClass="android.app.SearchView" 后来我把它改成android:actionViewClass="com.actionbarsherlock.widget.SearchView" ,现在固定的2.3和空:我似乎用一个黑客修复它:

我添加了一个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

哪一行,你[R收到错误:在

<activity android:name="com.example.MyActivityWithActionBar" ... android:theme="@style/Theme.Sherlock.Light"> </activity> 

的更多信息? –

+0

269行。我把它标记为上面的注释。我也加了更新。 – KickingLettuce

+0

您是否找到更好的解决方案?我遇到完全相同的问题,不想使用此解决方法,因为它违背了使用ActionbarSherlock库的目的,为所有Android版本创建一个代码库。 –

回答

0

您要使用两个完全不同的类,并重命名为搜索查看,但在不同的包。你不能简单地将一个对象从一个类转换成另一个类。 com.actionbarsherlock.widget.Searchview与android.widget.SearchView不同。因此,searchView上线269

空这将是有关给我们看从你的Java文件的顶部进口。

很可能,R.id.menu_search引用的视图是一个android.widget.SearchView,你的代码期望它是一个com.actionbarsherlock.widget.Searchview。

+0

更新:我切换我的菜单项,如在新的编辑问题的底部看到的,所以我修复了这个问题,但现在我只在4.0模拟器中获得了Nullpointer;在2.3 – KickingLettuce

+2

中运行良好此外,错误的转换不会导致NullPointerExceptions但是ClassCastExceptions。 –

相关问题