Как отобразить 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 не для приложения

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

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

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

7   51   2012-04-18 14:08:18

7 ответов:

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

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

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