17

私がやろうとしていること:

カスタムアラートダイアログを作成します。他のアラートダイアログと同じようにボタンがありますが、上記は2つのテキストエディット入力ボックスです。カスタムダイアログではなく、カスタマイズされたアラートダイアログを作成したい

これが私が試していることです#3: http ://developer.android.com/guide/topics/ui/dialogs.html

それは言う:

AlertDialog.Builder builder;
AlertDialog alertDialog;

Context mContext = getApplicationContext();
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.custom_dialog,
                           (ViewGroup) findViewById(R.id.layout_root));
TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("Hello, this is a custom dialog!");


builder = new AlertDialog.Builder(mContext);
builder.setView(layout);
alertDialog = builder.create();

ドキュメントによると:

View layout = inflater.inflate(R.layout.custom_dialog,
                           (ViewGroup) findViewById(R.id.layout_root));

ここで、最初のパラメーターはレイアウトリソースIDで、2番目のパラメーターはルートビューのIDです。

問題は、レイアウトルートが何であるかわからないことです。これは、アクティビティで開始するダイアログです。アクティビティの場合、レイアウトIDを使用する必要がありますか?layout_rootは帽子から引き出されていますか?

また試した:

  View layout = inflater.inflate(R.layout.my_custom_layout,
                                   (ViewGroup)   findViewById(android.R.id.content).getRootView());

結果のnullポインタ。

4

4 に答える 4

38

古い質問ですが、この記事は、この回答を検索する他の人に役立つ場合があります。

意図したレイアウト インフレーション:

Android アプリケーションで LayoutInflater を使用して次のようなコードを作成したことがある場合:

inflater.inflate(R.layout.my_layout, null);

あなたのやり方が間違っているので、読み進めてください。その理由を説明したいと思います。

...しかし...

すべてのルールには例外があります

もちろん、インフレ中に親を正当化できる場合もありますがnull 、それらはほとんどありません。AlertDialog. _ 同じ XML レイアウトを使用し、それをダイアログ ビューとして設定する次の例を考えてみましょう。

AlertDialog.Builder builder = new AlertDialog.Builder(context);
View content = LayoutInflater.from(context).inflate(R.layout.item_row, null);

builder.setTitle("My Dialog");
builder.setView(content);
builder.setPositiveButton("OK", null);
builder.show();

ここでの問題は、AlertDialog.Builder がカスタム ビューをサポートしているが、レイアウト リソースを受け取る setView() の実装を提供していないことです。そのため、XML を手動で拡張する必要があります。ただし、結果はルートビューを公開しないダイアログに入る (実際にはまだ存在しない) ため、レイアウトの最終的な親にアクセスできないため、それをインフレに使用することはできません。 . AlertDialog はとにかくレイアウト上の LayoutParams を消去し、それらを match_parent に置き換えるため、これは無関係であることが判明しました。

この記事には、ダイアログの構築以外のほとんどの場合に親を提供する必要がある理由についての説明があります。ViewGroup

于 2014-07-13T08:48:01.957 に答える
1

これを試しましたか?

View layout = inflater.inflate(R.layout.custom_dialog,null);
于 2012-05-22T03:22:22.747 に答える
1

Ok。ドキュメントのルート ビューは、カスタム レイアウトの要素を参照します。したがって、カスタム レイアウトには、ルート ビューと呼ばれる最も外側のビューがあります。これに Id を与える必要があり、示されているように渡すことができます。したがって、最初の引数はカスタム ビュー ID で、2 番目の引数はカスタム ビュー内のルート レイアウト要素の ID です。

 View layout = inflater.inflate(R.layout.custom_dialog,
                       (ViewGroup) findViewById(R.id.layout_root));

したがって、上記のドキュメントに示されているこの例では、R.id.layout_root は、custom_dialog レイアウト内の最も外側の LinearLayout などに指定した ID を参照しています。

于 2012-05-22T04:03:06.317 に答える