Android отображает другое диалоговое окно из диалога - PullRequest
13 голосов
/ 14 апреля 2011

Я пытаюсь отобразить диалоговое окно из прослушивателя onClick кнопки другого диалогового окна, но второе диалоговое окно не отображается.Я искал и обнаружил похожую проблему - Порядок диалогов в Android , попробовал предоставленное решение, но даже это не работает.

Мой код очень похож на тот, который приведен в ответе.

public void onClick (диалог DialogInterface, int id) {showDialog (SECOND_DIALOG);dialog.dismiss ();}

любая помощь будет очень признательна.

Спасибо,

Акшай

Ответы [ 3 ]

8 голосов
/ 14 апреля 2011

Вот как я это делаю:

    if (!appPrefs.getAcceptedUsageAggrement()) {
        tracker.trackPageView("/UsageAgreementDialog");
        acceptedUsage_alertDialog = new AlertDialog.Builder(BroadcastSMSActivity.this)
        .setTitle(R.string.accept_usage_title)
        .setMessage(R.string.accept_usage_message)
        .setNegativeButton(android.R.string.cancel, new AlertDialog.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                finish();
            }
        })
        .setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                if (appPrefs.getAppVer().equals("")) {
                    tracker.trackEvent("Application", "Install", getAppVerName(), 1);
                } else {
                    tracker.trackEvent("Application", "Upgrade", appPrefs.getAppVer().toString()+"->"+getAppVerName(), 1);
                }
                displayRecentChanges = true;
                appPrefs.saveAppVer(getAppVerName());
                appPrefs.saveAcceptedUsageAggrement(true);
            // Display Recent Changes on 1st use of new version
                if (displayRecentChanges) {
                    tracker.trackPageView("/RecentChangesDialog");
                    recentChanges_alertDialog = new AlertDialog.Builder(BroadcastSMSActivity.this)
                    .setTitle(getString(R.string.changes_title, getAppVerName()))
                    .setMessage(R.string.changes_dialog)
                    .setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            recentChanges_alertDialog.cancel();
                            acceptedUsage_alertDialog.cancel();
                        }
                    })
                    .create();
                    recentChanges_alertDialog.show();
                }
            }
        })
        .create();
        acceptedUsage_alertDialog.show();
    }
5 голосов
/ 02 апреля 2014

Я знаю, что об этом спрашивали некоторое время назад, но вот довольно хорошее решение, которое я нашел.

Я определяю интерфейс следующим образом:

public interface OpenDialog {

public void showDialog(DialogFragment dialog);

}

Который затем реализует мое действие, передавая ссылку на себя диалоговому окну при его открытии, используя мой класс InterfaceHolder:

public class MyActivity extends FragmentActivity implements OpenDialog {

@Override
protected void onCreate(Bundle arg0) {
    super.onCreate(arg0);

    InterfaceHolder.set(this);        
    showDialog(new DialogOne());

}

public void showDialog(DialogFragment dialog) {
    dialog.show(getSupportFragmentManager(), "tag");
}

InterfaceHolder - это просто класс со статической ссылкой на интерфейс, который я использую для его передачи:

public class InterfaceHolder {
private static OpenDialog openDialog;

public void set(OpenDialog openDialog)
    this.openDialog = openDialog;
}

public void get()
    return openDialog;
}

Таким образом, метод showDialog отобразит любой диалог, который я передам в него; как вы видите, я делаю это для отображения DialogOne. Теперь, если я хочу открыть новый диалог под названием «DialogTwo» внутри «DialogOne», я могу вызвать его, написав:

InterfaceHolder.get().showDialog(new DialogTwo());
dismiss();

И вуаля, DialogTwo показывается. Очевидно, что вы должны быть осторожны, чтобы убедиться, что ссылка на вашу деятельность была передана в InterfaceHolder (хороший способ сделать это - поместить InterfaceHolder.set (this); в метод showDialog), но в противном случае это работает красиво.

2 голосов
/ 17 апреля 2012

я предлагаю этот код. в диалоговом окне 1 есть кнопка, при нажатии которой открывается диалоговое окно 2.

    private Dialog dialog;
    private AlertDialog.Builder voteBuilder;

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);     

    // Firat dialog
            dialog = new Dialog(QrCodeReader.this);
            dialog.setContentView(R.layout.customdialog_qr);
            dialog.setCancelable(false);

    // Second dialog
            showVotingDialog();

    //set up button of dialog 1
            Button btnVote = (Button) dialog.findViewById(R.id.btnVote);
            btnVote.setOnClickListener(new OnClickListener() {
            @Override
                public void onClick(View v) {
                    dialog.dismiss();
                    voteBuilder.show();
                }
            });

dialog.show();
    }

    private void showVotingDialog() {
            voteBuilder = new AlertDialog.Builder(this);
            voteBuilder.setTitle(R.string.votingdialog_title);
            voteBuilder.setCancelable(false);
            LayoutInflater inflater = getLayoutInflater();
            final View checkboxLayout = inflater.inflate(R.layout.voting_dialog, null);
            voteBuilder.setView(checkboxLayout);
            voteBuilder.setPositiveButton(R.string.menu_ok, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    RadioGroup radioGroup = (RadioGroup) checkboxLayout.findViewById(R.id.vote_radiogroup);
                    int checkedRadioButton = radioGroup.getCheckedRadioButtonId();
                    int radioButtonSelected = 0;
                    switch (checkedRadioButton) {
                        case R.id.vote_item1 : radioButtonSelected = 1; break;
                        case R.id.vote_item2 : radioButtonSelected = 3; break;
                        case R.id.vote_item3 : radioButtonSelected = 5; break;
                        case R.id.vote_item4 : radioButtonSelected = 10; break;
                        case R.id.vote_item5 : radioButtonSelected = 20; break;
                        default: radioButtonSelected = 0;
                    }

                    sendVoteBySMS(radioButtonSelected);
                }
            });
            voteBuilder.setNegativeButton(R.string.menu_cancel, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    QrCodeReader.this.finish();
                }
            });

            voteBuilder.create();
    //      voteBuilder.show();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...