2

在我的应用程序中,我使用的AlertDialog是自定义视图。这个视图包含几个EditTexts 和一些其他的东西。有一些附加到EditTexts 的侦听器可以执行所需的任何功能。

在对话框的按钮单击上,我正在对输入到 s 中的数据执行一些验证,如果数据无效,则EditText显示另一个。AlertDialog一旦该(第二个)对话框关闭,我想保留在主对话框上(使用自定义视图),但由于某种原因,该对话框在我的第二个对话框显示之前关闭。如何在第二个对话框下保持原始(自定义视图)对话框仍然打开?

这是我的(简化的)代码:

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- 它显示它应该的方式 - 然后从中打开第二个对话框。这样,当打开第二个对话框时,原始活动(看起来像一个对话框)在后台仍然可见。

于 2013-02-08T22:27:23.720 回答
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 回答
0

我已经遇到了同样的问题并进行了很多搜索,但没有找到与此相关的任何内容。

所以,我只是在那里使用了一点技巧来满足我的要求。

首先我声明 AlertDialogs :

AlertDialog.Builder subDialog,mainDialog;

然后像这样使用hack:

        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();

我所做的是第二次打开子对话框的 ok 操作,我再次调用 MainDialog 的显示操作。

希望它会帮助你。

谢谢。

于 2013-01-28T17:34:19.157 回答