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。 –

相關問題