そのため、Google API ガイドを読んで、アラート ダイアログ ボックス内にカスタム レイアウトをロードする方法を見つけました。
次のように DialogFragment クラスを拡張するクラスを作成しました。
String product;
String description;
String company;
public void getAdInfo(String p, String d, String c)
{
product = p;
description = d;
company = c;
}
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
builder.setView(inflater.inflate(R.layout.ad_dialog, null));
TextView pt = (TextView) getView().findViewById(R.id.product);
pt.setText(product);
TextView dt = (TextView) getView().findViewById(R.id.description);
dt.setText(description);
TextView ct = (TextView)getView().findViewById(R.id.company);
ct.setText(company);
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// do something
}
});
builder.setNegativeButton("Exit", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dismiss();
}
});
return builder.create();
}
}
レイアウトは次のとおりです。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/product"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textIsSelectable="false"
/>
<TextView
android:id="@+id/company"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textIsSelectable="false"
/>
<TextView
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textIsSelectable="false"
/>
これらの行を使用して、OnClickListener 内でダイアログをインスタンス化します。
AdDialogFragment ad = new AdDialogFragment();
ad.getAdInfo(j.getAttribute("product"), j.getAttribute("description"), j.getAttribute("company"));
ad.show(getFragmentManager(), null);
j は xml ノードの要素です。
ダイアログを実行するはずのボタンをクリックすると、LogCat から次の NullPointerException エラーが発生します。
E/AndroidRuntime(10483): at com.onix.mallard.android.guifrag.AdDialogFragment.onCreateDialog(AdDialogFragment.java:29)
エラーは次の行を参照しています。
pt.setText(product);
最終的に、アプリが完全にクラッシュします。DialogFragment のレイアウトを動的に変更するにはどうすればよいですか? Android API ガイドでは、DialogFragments は Fragments と同じライフサイクルにバインドされていると述べていますが、(私の知る限り) FragmentTransactions を使用しないため、あまりわかりません。これが不可能で、情報をアクティビティとしてインスタンス化する必要がある場合、害はありません。
それが役立つ場合、ダイアログは Fragment 内から呼び出されます。