null
as parent
を使用してビューを拡張すると、次のようなリント警告Avoid passing null as the view root
が表示されます。
LayoutInflater.from(context).inflate(R.layout.dialog_edit, null);
ただし、ビューはAlertDialog
のコンテンツとして使用され、setView
をAlertDialog.Builder
で使用するため、parent
として何を渡すべきかわかりません。
この場合、parent
はどうあるべきだと思いますか?
次のコードを使用して、警告なしでダイアログビューを拡大します。
View.inflate(context, R.layout.dialog_edit, null);
短い話は、ダイアログのビューを膨らませているとき、parent
はnullであるべきだということです。なぜなら、それはViewのインフレーション時に知られていないからです。この場合、警告を回避するための3つの基本的な解決策があります。
inflate(int resource, ViewGroup root, boolean attachToRoot)
を使用してビューを膨張させます。 attachToRoot
をfalse
に設定します。これにより、インフレータに親が利用できないことが通知されます。http://www.doubleencore.com/2013/05/layout-inflation-as-intended/ をご覧ください。この問題の詳細な説明、特に「すべてのルールには例外があります」セクションをご覧ください。終わり。
ViewGroupとしてnullをキャストすると、警告が解決されました。
View dialogView = li.inflate(R.layout.input_layout,(ViewGroup)null);
ここで、li
はLayoutInflater's
オブジェクトです。
AlertDialog.Builder.setView(your_layout_id)
を使用する必要がありますので、それを膨らませる必要はありません。
ダイアログを作成した後、AlertDialog.findViewById(your_view_id)
を使用します。
(AlertDialog) dialogInterface
を使用して、dialog
内のOnClickListener
を取得し、次にdialog.findViewById(your_view_id)
を取得します。
本当にparent
がない場合(たとえば、AlertDialog
のビューを作成する場合)、null
を渡す以外に選択肢はありません。警告を避けるためにこれを行ってください:
final ViewGroup nullParent = null;
convertView = infalInflater.inflate(R.layout.list_item, nullParent);
ダイアログにparent
を指定する必要はありません。
オーバーライドの上部で@SuppressLint("InflateParams")
を使用してこれを抑制します。
AlertDialogは、親ビューの代わりにnullを安全に使用できる唯一の場合を知っている限りです。この場合、次を使用して警告を抑制することができます。
@SuppressLint( "InflateParams")
一般に、警告を取り除くために、SupressLintまたは他の回答で言及されている回避策のいずれかを使用しないでください。親ビューは、拡大されるビューのルート要素で宣言されているレイアウトパラメータを評価するために必要です。つまり、親ビューの代わりにnullを使用すると、ルート要素内のすべてのレイアウトパラメータが無視され、デフォルトのレイアウトパラメータに置き換えられます。ほとんどの場合は問題ありませんが、場合によっては見つけるのが非常に難しいバグになります。