2012-06-19 94 views
3

我得到一些奇怪的日誌,這顯然只發生在版本低於3的Android設備上(使用模擬器進行檢查)。 當您更改方向和的onCreate()或onRestoreInstanceState()被調用的包是不是空墜毀NoSuchMethodError Bundle.getString()

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_menu);} 
    if (savedInstanceState != null) { 
     mSlug = savedInstanceState.getString(KEY_SLUG, null); 
    } 
}@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putString(KEY_SLUG, mSlug); 
}@Override 
protected void onRestoreInstanceState(Bundle outState) { 
    super.onRestoreInstanceState(outState); 
    if (outState != null) { 
     mSlug = outState.getString(KEY_SLUG, mSlug); 
    } 
} 

的logcat的,日誌是這樣的: http://i.stack.imgur.com/WbivQ.png 有誰得到線索這裏發生了什麼?

回答

8

Bundle.getString帶有2個參數僅在API級別12和更高版本中可用。您必須自己指定默認值,而不是將其作爲參數傳遞。

您可以通過「通過API級過濾器」下拉列表中單擊並在the documentation

+0

謝謝。答案很明顯... – LeDon

+0

很高興我能幫到你。如果回答您的問題,請務必將答案標記爲正確,並且如果您願意,也可以上傳它! – Codeman

+0

我不得不等待10分鐘來檢查它是否有用,並且沒有足夠的聲望來兌現這個快速有用的答案。 :/ – LeDon

3

右上角選擇合適的API級別檢查這個自己在未來製作簡單

mSlug = savedInstanceState.getString(KEY_SLUG, null); 

與olders的API兼容,只是

mSlug = getIntent().hasExtra(KEY_SLUG) ? savedInstanceState.getString(KEY_SLUG) : null; 
+0

這不是最好的例子,因爲getString(key)的默認'key not found'返回值已經爲null。但是我明白你的觀點,如果需要非空的默認值,這將會很有用。 – k2col

0

取代它只需使用此功能:

public static String getStringFromBundle(Bundle bundle, String key, String defaultValue){ 
if (Build.VERSION.SDK_INT < 12){ 
    String returns = bundle.getString(key); 
    if(returns==null) returns = defaultValue; 

    return returns; 
} else 
    return bundle.getString(key, defaultValue); 
} 
0

編輯:修正,見下面的註釋。

對於任何使用MvvmCross的人來說,4.2.3的錯誤是由於這個原因導致的。只需創建您自己的FragmentCacheConfiguration並實現此線程中的一種解決方法。 https://github.com/MvvmCross/MvvmCross/issues/1431

+0

解決方法https://github.com/MvvmCross/MvvmCross/pull/1439 – Martijn00