Как отобразить AlertDialog во фрагменте?

Я хочу отобразить диалоговое окно предупреждения в моем приложении. Я использую фрагменты. Я попытался ниже код:

 AlertDialog ad = new AlertDialog.Builder(context)
            .create();
    ad.setCancelable(false);
    ad.setTitle(title);
    ad.setMessage(message);
    ad.setButton(context.getString(R.string.ok_text), new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    });
ad.show();

но это был сбой и ошибка в logcat было:

04-18 15:23:01.770: E / AndroidRuntime (9424): android.вид.Ему$BadTokenException: не удается добавить окно -- маркер null не для приложения

из интернета я узнал, что сбой вызван проблемой контекста. Я дал контекст as

context = this.getActivity().getApplicationContext();

Я не знаю, в чем проблема с этим. Кто-нибудь может мне помочь?

7 ответов


заменить context с getActivity().

на ApplicationContext не должны использоваться для таких задач, как создание диалоговых окон. Поскольку вы находитесь во фрагменте, вы можете вместо этого получить контекст действия, просто вызвав фрагменты getActivity() метод.


дополнительная информация об этом вопросе (AlertDialog в фрагменте, управляемом внутри события):

Если вы вызываете AlertDialog в событии, таком как onClick(View v) или onLongClick(View v), вы можете использовать

public boolean onClick(View v) {
    ...
    AlertDialog.Builder alertBuilder = new AlertDialog.Builder(v.getContext());
    ...
}

попробуйте использовать DialogFragment, DialogFragment лучше, когда вы используете фрагменты


у меня были похожие проблемы, когда я пытался создать AlertDialog из фрагмента. Из него возникло исключение NullPointerException. Первоначально я сделал следующее:

AlertDialog alertDialog = new AlertDialog.Builder(getActivity()).create();

на NullPointerException произошло конкретно при вызове alertDialog.show() позже в коде. Но после поиска документации для AlertDialog.Builder(), казалось, был другой способ инициализировать его [AlertDialog.Builder Doc], который должен включать тему / resId, как показано ниже:

AlertDialog alertDialog = new AlertDialog.Builder(getActivity(), R.style.Theme_AppCompat_Dialog_Alert).create();

этот решил NullPointerException под рукой. Надеюсь, это поможет вам!


я использовал его в адаптере внутри listView, поэтому я не мог использовать getActivity(). Чтобы заставить его работать, я использовал getActivity() для контекста в экземпляре адаптера во фрагменте:

this.adapter = new myAdapter(getActivity(), factory);

позже в другом классе (класс адаптера) я смог использовать getContext()и это сработало.


                       AlertDialog alert= null;
                        AlertDialog.Builder build= new AlertDialog.Builder(getActivity());
                        build.setTitle("title");
                        build.setItems(stringarrayname, new DialogInterface.OnClickListener() {

                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // TODO Auto-generated method stub
                            //Toast.makeText(getActivity(), "hi", Toast.LENGTH_SHORT).show();   

                            }
                        });
                        build.create().show();

вы можете попробовать это или использовать DialogFragment

private void showAlert(final int position) {
        new AlertDialog.Builder(getActivity().getApplicationContext())
                .setTitle("Delete entry")
                .setMessage("Are you sure you want to delete this entry?")
                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                      //  deleteSuggestions(position);
                    }
                })
                .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        // do nothing
                    }
                })
                .setIcon(android.R.drawable.ic_dialog_alert)
                .show();
    }