AlertDialogで使用するためにビューをインフレートするときの「ビュールートとしてnullを渡さないでください」という警告


126

次のようにas でAvoid passing null as the view rootビューを膨らませると、糸くずの警告が表示さnullれますparent

LayoutInflater.from(context).inflate(R.layout.dialog_edit, null);

しかし、ビューはのコンテンツとして使用するAlertDialog使用して、setViewAlertDialog.Builder、私はとして渡されるべきかわかりませんparent

parentこの場合、何をすべきだと思いますか?


2
nullの代わりにfalseを渡します。これを
MrDumb 2014年

nullではなく親のレイアウトを指定して、setViewを使用しないようにしてください。
Haresh Chhelana、2014年

メソッドのlint警告を抑制します。合格しない理由はまだわかりませんnull
323go 2014年

4
親ビューに応じてレイアウトの問題を理解しましたが、それは基本的にアクティビティのビュー階層の上に浮かぶAlertDialogには当てはまりません。それがあなたが合格できる理由ですnull。リントを抑えることができるのには理由があります。Lintは、見逃されがちな問題について警告を出すことになっています。この場合、それは正しい呼び出しです。
323go 2014年

1
@ ashutiwari4私は毎日新しいことを学んでいます。美しい世界:I
Rahul

回答:


174

次のコードを使用して、警告なしでダイアログビューを拡張します。

View.inflate(context, R.layout.dialog_edit, null);

7
@MarianPaździoch警告を発生させないため。:-)もちろん、それはなぜリントコードお菓子の質問頼むView.inflateLayoutInflator.inflate異なっています。決定的な答えは見ていません。これは、同じ見方を膨らませるために一見同等に見える2つの方法がある理由に関連している可能性があります。その理由についても私は見ていません。
Edward Brey 2015

12
これは間違っています。警告を抑制するだけですが、問題はまだ残っています。より良いソリューションについては、possiblemobile.com / 2013/05 / layout-inflation-as-intendedをお読みください。
jcsahnwaldt Reinstate Monica、2015

16
@JonaChristopherSahnwaldt詳しく説明していただけますか?この記事によると、AlertDialogにはルートビューがないため、nullの親が必要です。私には、この警告はダイアログ外のビューには意味があるが、ダイアログビューには適用できないことが強調されているようです。
エドワードブレイ

7
@EdwardBreyそうです-私は記事を完全に読みませんでした。この特定のケースでは、View.inflate(...null)またはのどちらを使用してもかまいません@SuppressLint。一般的にLayoutInflater.from(...).inflate(..., parent, false)は、優れています。これを指摘してくれてありがとう!
jcsahnwaldtがモニカを復活させる

1
@Bevor That nullの質問を回避することは、親がいる場合についてです。この質問はについてですAlertDialog。これは、インフレートされるビューの親を提供しません。のルートビューをインフレートする場合AlertDialog、nullを渡すことは正しいです。Lintはこの特定のコンテキストを考慮に入れていないため、parent誤検出を起こす関数を使用した場合に警告が表示され、エラーが発生しやすいことを示すものではありません。そのため、この場合parent、警告を出さず、トリガーしない関数を使用することが有効です。
Edward Brey 2018

35

短い話は、ダイアログのビューをインフレートしているときparentは、ビューのインフレーション時には不明であるため、nullにする必要があるということです。この場合、警告を回避するための3つの基本的な解決策があります。

  1. @Suppressを使用して警告を抑制する
  2. ビューのinflateメソッドを使用してビューを膨らませます。これは単にLayoutInflaterのラッパーであり、ほとんどの場合、問題を難読化します。
  3. LayoutInflaterの完全なメソッドを使用してビューを拡張しますinflate(int resource, ViewGroup root, boolean attachToRoot)。に設定attachToRootしますfalse。これは、親が利用できないことをインフレーターに伝えます。Android Lintの古いバージョンでは、これにより警告が削除されました。これは、Android Studioのポスト1.0バージョンでは当てはまりません。

この問題の詳細については、http://www.doubleencore.com/2013/05/layout-inflation-as-intended/を確認してください。特に、最後にある「すべてのルールには例外があります」セクションを参照してください。


19

ViewGroupがnullをキャストすると警告が解決されました。

View dialogView = li.inflate(R.layout.input_layout,(ViewGroup)null);

どこliLayoutInflater'sオブジェクトが。


ここで、「li」はLayoutInflaterオブジェクトです。
SVL

3
あなたが実際にこれを行っている理由を理解していれば、この答えが最善です。既に読んだかもしれませんが、短い話は、AlertDialogはインフレート時には親を知らないため、実際に正しいことを行っているときにこの正確な状況でlintが警告をスローするのは副作用です。
マルバー

私はこの警告に関する無数の回答とページを読みましたが、あなたの解決策は断然最高です:シンプルでエレガント
Couitchy

9
しかし、それは冗長なキャストです
mohit

11
次に、「キャスティングは冗長です」という別の警告が表示されます。
Mousa 2016年

17

を使用する必要があるためAlertDialog.Builder.setView(your_layout_id)、膨らませる必要はありません。

AlertDialog.findViewById(your_view_id)ダイアログの作成後に使用します。

使用し(AlertDialog) dialogInterface得るために、dialog内部でOnClickListener、その後dialog.findViewById(your_view_id)


1
これが道です!ダイアログを作成し、ビューを見つけるだけです。
user1806772 2017年

1
これを行うには良い方法ですが、しかし、このことを覚えておく方法は、 API 21で追加されました
ニコラス・カラスコ

この膨張したレイアウトを何らかの変数に格納しなければならない場合はどうでしょうか?たとえば、私はAメソッドがあるクラスを書きましたonCreateDialog。後者では、あなたが言っalert_dialog_builder.setView(R.layout.edit_account_dialog);たように私は書いた。しかし、この膨らんだレイアウトをというA属性変数に保存する必要がありますthe_inflated_layout_of_the_dialog
JarsOfJam-Scheduler

9

parentダイアログにを指定する必要はありません。

@SuppressLint("InflateParams")オーバーライドの上部にあるを使用してこれを抑制します。


7

本当に何もない場合parent(たとえば、のビューを作成する場合AlertDialog)を渡す以外に選択肢はありませんnull。警告を避けるためにこれを行ってください:

final ViewGroup nullParent = null;
convertView = infalInflater.inflate(R.layout.list_item, nullParent);

4
別の警告「値 'nullParent'は常にnullです。」が生成されます。
Mallaudin 2016年

AndroidStudio 3.3とAPI 28以降、これが機能する唯一のソリューションです。
Zeeshan

1
  1. AlertDialogは、親ビューの代わりにnullを安全に使用できる唯一のケースであると私が知っている限りです。この場合、次のコマンドを使用して警告を抑制できます。

    @SuppressLint( "InflateParams")

  2. 一般に、警告を取り除くために、SupressLintまたは他の回答に記載されている回避策のいずれかを使用してはなりません。親ビューは、インフレートされるビューのルート要素で宣言されているレイアウトパラメータを評価するために必要です。つまり、親ビューの代わりにnullを使用すると、ルート要素のすべてのレイアウトパラメーターは無視され、デフォルトのレイアウトパラメーターに置き換えられます。ほとんどの場合それで問題ありませんが、場合によっては本当に見つけにくいバグが発生することもあります。


0

のドキュメントからView.inflate()、それは言う

XMLリソースからビューを拡張します。この便利なメソッドは、LayoutInflaterクラスをラップし ます。これは、ビューのインフレーションに関するすべてのオプションを提供します。

  @param context The Context object for your activity or application.
  @param resource The resource ID to inflate
  @param root A view group that will be the parent.  Used to properly inflate the  layout_* parameters.

0

https://developer.android.com/guide/topics/ui/dialogsによると

ダイアログのレイアウトを拡張して設定します。
ダイアログレイアウトに入るので、親ビューとしてnullを渡します。

したがって、AlertDialogの作成には、 @SuppressLint("InflateParams")

LayoutInflater inflater = requireActivity().getLayoutInflater();
@SuppressLint("InflateParams")
View view = inflater.inflate(R.layout.layout_dialog, null);
builder.setView(view);

-1

する代わりに

view = inflater.inflate(R.layout.list_item, null);

行う

view = inflater.inflate(R.layout.list_item, parent, false);

与えられた親でそれを膨らませますが、それを親に付けません。

Coeffectに感謝します(彼の投稿へのリンク


親を取得する方法を知っていることも役に立ちます。
Johan Karlsson
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.