2017-12-27 217 views
6

我能找到的最接近的現有問題是Android Studio 3.0 lint warnings for references to activity,但它沒有幫助。DialogFragment getActivity()「可能爲空」AndroidStudio 3.0.1中的lint警告

使用AndroidStudio 3.0.1,我有一個DialogFragment,我這樣做平常的東西:

@Override 
    @NonNull 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     ... 

我在我有一個lint警告的呻吟是Argument 'getActivity()' might be null

我明白爲什麼getActivity()可能是空的,我明白了皮棉檢驗如何知道這(從@Nullable註釋)。

我的問題是:這一切都很好,getActivity()可能爲空,但實際上我應該如何處理這種優雅和整潔? onCreateDialog必須返回一個Dialog(因爲超類'@Nullable註釋)所以我必須有活動上下文來創建它。

我可以認爲onCreateDialog永遠不會被調用,如果DialogFragment沒有附加到一個活動,但仍然 - 我如何解決不整潔的皮棉警告?

+2

「我該如何解決不整潔的皮棉警告?」 - 壓制它並繼續前進。 – CommonsWare

+0

爲什麼你不使用getContext() –

+0

也許你可以依靠onActivityCreated或onAttach(depracated)這將給你有效的參考。然後用它代替getActivity()? – marcinj

回答

1

@Niklas的答案解釋了爲什麼你現在得到這個警告。我想分享我對你實際應該做什麼的想法。

首先,所有這些添加的可空性確實暴露了這些年來一直存在的舊設計缺陷 - 這種方法總是可以返回空值(例如碎片分離)。

我寧願他們註釋返回值爲@NonNull並在內部拋出異常,如果這個方法在Activity實際爲空時被調用,但我知道它會破壞向後兼容性,因此非常危險(儘管我可以幾乎看不出爲什麼任何人在Activity實際上可以爲null時調用此方法)。

那麼,我們應該怎麼做呢?

首先,由於功能完全沒有改變,如果有問題的代碼已經工作,然後做@CommonsWare建議 - 要麼禁止警告或忽略它。

您也可以將每個電話打包爲空檢查,例如,例外。

什麼,我要做的事情,但是,把這種方法在我BaseDialog(這是由所有其他對話擴展):

protected FragmentActivity getActivityNonNull() { 
    if (super.getActivity() != null) { 
     return super.getActivity(); 
    } else { 
     throw new RuntimeException("null returned from getActivity()"); 
    } 
} 

注意,所有這些選項有效狀態,你不要」如果發生這種情況,我們真的希望返回null,並且在應用程序崩潰時可以正常運行。這就是爲什麼我說我寧願有支持庫代碼。