3

そのため、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 内から呼び出されます。

4

3 に答える 3

4

これが私がそれを行う方法です(テストされていないコード);)

カスタム ダイアログ:

public class AdDialogFragment extends DialogFragment {
   String mProduct;
   String mDescription;
   String mCompany;
   TextView mProductTV;
   TextView mDescriptionTV;
   TextView mCompanyTV;

   public void setAdInfo(String product, String desc, String company)
   {
       mProduct = product;
       mDescription = desc;
       mCompany = company;
   }
   public AdDialogFragment() {
        super();
   }
   public static AdDialogFragment newInstance() {
        return new AdDialogFragment();
   }

public Dialog onCreateDialog(final Bundle savedInstanceState) {
   LayoutInflater factory = LayoutInflater.from(getActivity());
   final View content = factory.inflate(R.layout.ad_dialog, null);
   mProductTV = (TextView) content.findViewById(R.id.product);
   mDescriptionTV = (TextView) content.findViewById(R.id.description);
   mCompanyTV = (TextView) content.findViewById(R.id.company);

   fillTextViews();

   AlertDialog.Builder dialog;
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
      dialog = new AlertDialog.Builder(new ContextThemeWrapper(getActivity(), R.style.Theme.DeviceDefault.Dialog.)); //can't remember the name or create a custom theme.
   } else {
      dialog = new AlertDialog.Builder(getActivity());//anything below honeycomb can die :).
   }

   //  now customize your dialog
   dialog.setTitle(getActivity().getString(R.string.some_title_if_any))
      .setView(content)
      .setCancelable(true) //this is the default I think.
      .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   // do something
               }
           });
      .setNegativeButton("Exit", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   dismiss();
               }
           });
   return dialog.create();
}

private void fillTextViews() {
   mProductTV.setText(mProduct);
   mDescriptionTV.setText(mDescription);
   mCompanyTV.setText(mCompany);
}

これは、たとえばアクティビティから呼び出す方法です。

public void showYourFancyDialog() {
   AdDialogFragment dialog = AdDialogFragment.newInstance();
   dialog.setAdInfo(yourProduct, yourDescription, yourCompany);
   dialog.show(getSupportFragmentManager(), "dialog");
}

Google のドキュメントからのパターンの使用

于 2013-05-02T18:20:39.393 に答える
2

あなたは次のことを試すことができます、それは私にとってはうまくいきました:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
View v = inflater.inflate(R.layout.ad_dialog, null));
builder.setView(v);

そして、次findViewByIdのように呼び出します。

v.findViewById();
于 2013-05-02T17:52:54.347 に答える
0

通常のアクティビティを使用した AlertDialog クラスを繰り返す代わりに、少し前にこの問題を解決しました。AndroidManifest.xml では、アクティビティ仕様に次の行があります。

android:theme="@styles/Theme.HoloLight.Dialog"

アドバイスとして、Linear Layout は機能しません。RelativeLayout を試してください。

于 2013-05-19T01:09:37.773 に答える