2014-10-06 18 views
1

我在我的應用程序中支持API 15,並且當我嘗試從我的菜單中獲取searchView時,我遇到了這些用戶的崩潰。API 15中的menuItem.getActionView()== null

下面是我的代碼:

@Override 
public void onPrepareOptionsMenu(Menu menu) { 
    super.onPrepareOptionsMenu(menu); 

    MenuItem menuItem = menu.getItem(0); 
    searchView = (SearchView)menuItem.getActionView(); 
    searchView.setIconifiedByDefault(false); 
    searchView.setQuery("", true); 
    menuItem.expandActionView(); 
} 

我在這條線得到一個NullPointerException異常

searchView.setIconifiedByDefault(false); 

因爲searchView爲空。這在API 16及更高版本的設備上工作得非常好。有沒有人遇到過這個問題?

+0

只是檢查你得到(0)與調試器返回什麼menu.getItem。 – for3st 2014-10-06 15:34:54

+0

http://stackoverflow.com/q/18438890/844882 – 2014-10-06 15:35:35

+0

@AlexLockwood我已經通過這個問題,並沒有解決方案似乎解決了我的問題 – coder 2014-10-06 15:45:51

回答

1

膨脹佈局時,如果出現問題,通常會導致立即崩潰,但不會使菜單資源膨脹。如果出現問題,則會記錄堆棧跟蹤,但除此之外的情況會被處理,因此執行會繼續。只是在一段時間後,我們才意識到有些事情沒有奏效,而事情在以後突破。

自定義操作欄項(actionLayout,actionViewClassactionProvider)尤其傾向於此。如果在加載其中任何一個時出現問題(例如actionViewClass未實施正確的構造函數),我們只會在嘗試檢索自定義項並返回null時才瞭解它。解決方案是通過LogCat翻找並查找與處理的異常相關的堆棧跟蹤,以查看真正出錯的地方。

在像這樣的一個API級別相關的情況下,最有可能的情況是自定義操作項的初始化引用了舊版Android上不存在的方法,因此失敗。

0

我也有和你一樣的問題,來到這個stackoverflow問題。經過一番鬥爭,我發現了這個問題的核心和解決方案。

在API15,應用程序的初始化過程中,只有onCreateOptionsMenu的調用,但onPrepareOptionsMenu

在API16及更高版本中,onPrepareOptionsMenuonCreateOptionsMenu之後被調用。

所以我的解決辦法是在onCreateOptionsMenu終點打電話onPrepareOptionsMenu

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    super.onCreateOptionsMenu(menu, inflater); 

    (...) 

    if (Build.VERSION.SDK_INT < 16) { 
     onPrepareOptionsMenu(menu); 
    } 
}