2

私のアプリではAlertDialog、カスタム ビューで を使用しています。このビューには、いくつEditTextかの とその他のものが含まれています。EditText必要な機能を実行するにアタッチされたリスナーがいくつかあります。

ダイアログのボタンをクリックすると、sに入力されたデータに対していくつかの検証を実行し、データが無効な場合はEditText別の検証を表示します。AlertDialogその(2番目の)ダイアログが閉じられたら、(カスタムビューで)メインダイアログに残りたいのですが、何らかの理由で、2番目のダイアログが表示される前にそのダイアログが閉じられます。2 番目のダイアログの下で元の (カスタム ビュー) ダイアログを開いたままにしておくにはどうすればよいですか?

これが私の(簡略化された)コードです:

final EntryPanel panel = new EntryPanel(OrderActivity.this);

AlertDialog dlg = new AlertDialog.Builder(OrderActivity.this)
    .setCancelable(true)
    .setView(panel)
    .setPositiveButton(R.string.button_ok, new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            final int id = pePanel.getProductId();
            if(!isValidProduct(id)) {

                new AlertDialog.Builder(OrderActivity.this)
                    .setMessage(R.string.error_unknown_product)
                    .setCancelable(true)
                    .setPositiveButton(R.string.button_ok, new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dlg2, int which) {
                            dlg2.cancel();

                        }
                    })
                    .show();
            }
            else {
                processProductEntry(id);
                dialog.dismiss();
            }
        }
    })
    .setNegativeButton(R.string.button_cancel, new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    }).show();
4

3 に答える 3

1

したがって、両方のダイアログを開いたままにしておくことはできません。そのため、最初のダイアログ (カスタム ビューを使用) を変更して、存在するアクティビティに変更し、本来themeあるTheme.Dialogべき方法で表示し、そこから 2 番目のダイアログを開きます。このようにして、2 番目のダイアログが開いたときに、元のアクティビティ (ダイアログのように見えます) がまだバックグラウンドで表示されます。

于 2013-02-08T22:27:23.720 に答える
0

私はすでに同じ問題に直面し、たくさん検索しましたが、これに関連するものは何も見つかりませんでした。

だから、私はほとんど私の要件を達成するためにそこで少しハックを使用しました。

まず、AlertDialogsを宣言します。

AlertDialog.Builder subDialog,mainDialog;

次に、次のようなハックを使用します。

        subDialog =  new AlertDialog.Builder(Activity2.this)
        .setMessage("New Dialog Opened") 
        .setCancelable(true)
        .setPositiveButton("Okay", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dlg2, int which) {
                dlg2.cancel();
                mainDialog.show();
            }
        });  


        mainDialog = new AlertDialog.Builder(Activity2.this)
        .setCancelable(true)
        .setMessage("First Dialog Opened")
        .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                subDialog.show();
            }
        })
        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });
        mainDialog.show();

私がしたことは、2番目に開いたサブダイアログのokアクションで、MainDialogのshowactionを再度呼び出します。

それがあなたを助けることを願っています。

ありがとう。

于 2013-01-28T17:34:19.157 に答える
0

私は同様の問題を抱えていたので、次のように解決しました。

public class PayDebtsDialogFragment extends DialogFragment implements OnClickListener
{
public interface OnDebtPayListener{
    void debtPayed(BalanceItem debt, double payedAmount);
    void badPayment(int errorCode);
}

private static final String LOG_TAG = "PayDebtsDialogFragment";
private static final int BAD_PARSING = -1;

private OnDebtPayListener onDebtPayListener;
private BalanceItem debtPayment;
private EditText etAmount;

public void setOnDebtPayListener(OnDebtPayListener onDebtPayListener) {
    this.onDebtPayListener = onDebtPayListener;
}

public BalanceItem getDebtPayment() {
    return debtPayment;
}

public void setDebtPayment(BalanceItem debtPayment) {
    this.debtPayment = debtPayment;
}


@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    builder.setView(getDialogLayout())
           .setTitle("Pay debt")
           .setNegativeButton("cancel", this)
           .setPositiveButton("pay", this);

    return builder.create();
}

@Override
public void onClick(DialogInterface dialog, int which) 
{
    if(which == DialogInterface.BUTTON_POSITIVE){
        if(onDebtPayListener != null){
            try {
                String strPayment = etAmount.getText().toString().trim();
                double payment = Double.valueOf(strPayment);
                Log.d(LOG_TAG, "debtPayed()");
                onDebtPayListener.debtPayed(debtPayment, payment);
            } catch (Exception e) {
                Log.d(LOG_TAG, "badPayment()", e);
                onDebtPayListener.badPayment(BAD_PARSING);
            }
        }else{
            Log.e(LOG_TAG, "onDebtPayListener is NULL");
        }
    }

    dismiss();
}

private View getDialogLayout()
{
    LayoutInflater inflater = getActivity().getLayoutInflater();
    View dialogLayout = inflater.inflate(R.layout.pay_debts_dialog_fragment, null);

    TextView tvPayer = (TextView) dialogLayout.findViewById(R.id.tvPayDebts_payer);
    tvPayer.setText(debtPayment.getPayer().getName() + " pays");

    etAmount = (EditText) dialogLayout.findViewById(R.id.etPayDebts_Amount);
    String hint = String.format(Locale.getDefault(), "Total debt: %.2f%s", debtPayment.getAmount(),
                                debtPayment.getCurrency());
    etAmount.setHint(hint);

    TextView tvReceiver = (TextView) dialogLayout.findViewById(R.id.tvPayDebts_Receiver);
    tvReceiver.setText("to " + debtPayment.getReceiver().getName());

    return dialogLayout;
}

}
  • 私は DialogFragment を使用し、2 つのメソッドで独自のリスナーを定義しました。
  • アクティビティ内にそのインターフェイスを実装します。
  • 入力が悪い場合、アクティビティはエラー ダイアログ (別のダイアログ) を表示し、閉じると最初のダイアログを再度表示します。
于 2013-01-28T17:33:19.733 に答える