web-dev-qa-db-ja.com

AlertDialogで使用するためにビューを拡張するときの「ビュールートとしてnullを渡さない」警告

null as parentを使用してビューを拡張すると、次のようなリント警告Avoid passing null as the view rootが表示されます。

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

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

この場合、parentはどうあるべきだと思いますか?

106

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

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

短い話は、ダイアログのビューを膨らませているとき、parentはnullであるべきだということです。なぜなら、それはViewのインフレーション時に知られていないからです。この場合、警告を回避するための3つの基本的な解決策があります。

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

http://www.doubleencore.com/2013/05/layout-inflation-as-intended/ をご覧ください。この問題の詳細な説明、特に「すべてのルールには例外があります」セクションをご覧ください。終わり。

31
emerssso

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

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

ここで、liLayoutInflater'sオブジェクトです。

17
SVL Narasimham

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

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

(AlertDialog) dialogInterfaceを使用して、dialog内のOnClickListenerを取得し、次にdialog.findViewById(your_view_id)を取得します。

14
Jeffrey Chen

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

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

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

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

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

    @SuppressLint( "InflateParams")

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

1
Apfelsaft