我使用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);
}
好,它的工作原理,但我不會把它作爲一個答案了,因爲它似乎是這樣做的破解方式。打開更好的想法?
哪一行,你[R收到錯誤:在
的更多信息? –
269行。我把它標記爲上面的註釋。我也加了更新。 – KickingLettuce
您是否找到更好的解決方案?我遇到完全相同的問題,不想使用此解決方法,因爲它違背了使用ActionbarSherlock庫的目的,爲所有Android版本創建一個代碼庫。 –