web-dev-qa-db-ja.com

AndroidStudio 3.0.1のDialogFragment getActivity() "might be null" lint警告

これに関して最も近い既存の質問は アクティビティへの参照に関するAndroid Studio 3.0 lint警告 ですが、それは役に立ちません。

AndroidStudio 3.0.1を使用して、私はDialogFragmentを使用して、この通常の作業を行います。

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

Argument 'getActivity()' might be nullとうめくリント警告があります。

私はwhygetActivity()がnullかもしれないことを理解し、リント検査がこれをどのように認識するかを理解します(_@Nullable_アノテーションから)。

私の質問は:getActivity()がnullであることはすべて非常によくて良いことですが、実際にこれを上品かつ整然と処理することになっていますか? onCreateDialogmustDialog(スーパークラスの_@Nullable_アノテーションのため)を返すため、Imust 作成するアクティビティコンテキストがあります。

onCreateDialogがActivityにアタッチされていない場合、DialogFragmentが呼び出されることはないと想定できますが、それでも、乱雑なリント警告に対処するにはどうすればよいですか?

25
Trevor

@Niklasの答えは、なぜこの警告が表示されるのかを説明しています。あなたが実際に何をすべきかについての私の考えを共有したいと思います。

まず、この追加されたnullabilityは、ここ数年存在していた古い設計の欠陥を公開することです-このメソッドは常にnullを返す可能性があります(例:Fragmentdetached)。

Activityが実際にnullのときにこのメソッドが呼び出された場合、戻り値に@NonNullとして注釈を付けて内部的に例外をスローすることを好むでしょうが、後方互換性を壊し、非常にリスクが高いことを理解しています(なぜそうなるのかはほとんどわかりませんがActivityが実際にnullになる可能性がある場合、誰でもこのメソッドを呼び出します)。

それで、私たちはそれについて何をすべきでしょうか?

まず第一に、機能がまったく変更されていないため、問題のコードがすでに機能している場合は、@ CommonsWareが提案したことを行います-警告を抑制するか、無視します。

また、各呼び出しをnullチェックにラップすることもできます。例外。

ただし、このメソッドをBaseDialogに配置します(他のすべてのダイアログによって拡張されます)。

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

これらのオプションはすべて、実際にはnullが返されることを期待しておらず、それが発生した場合にアプリがクラッシュしても問題ないことを示していることに注意してください。そのため、代わりにサポートライブラリコードでこれを使用する方が良いと言いました。

編集:

フラグメントをサポートする新しいメソッドが追加されました- requireActivity() 。このメソッドは、上記のgetActivityNonNull()と同等です(ただし、Activityにアタッチされていない場合はIllegalStateExceptionをスローします)。

getActivity()の代わりにこのメソッドを使用すると、うまくいくはずです。

26
Vasiliy

これらのメソッドは、Revision 27.1.0リリースで追加されました。フラグメント:requireContext()requireActivity()requireHost()、およびrequireFragmentManager()メソッドがあり、NonNullオブジェクトを返します同等のgetメソッドまたはIllegalStateExceptionをスローします。

3

これは、 アクティビティへの参照に関するAndroid Studio 3.0 lint警告 の複製です。

tldr; getActivity()は、サポートライブラリ27.0.0で注釈@Nullableおよび静的分析ツールがこれを取り上げます。

2
Niklas

requireActivity()メソッドのソースコードを表示する場合:

 @NonNull 
 public final FragmentActivity requireActivity() { 
     FragmentActivity activity = this.getActivity();
     if (activity == null) { 
         throw new IllegalStateException(
             "Fragment " + this + " not attached to an activity."
         );
     } else {
         return activity; 
     }
 } 
0
Avid Programmer