Как отобразить 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.view.WindowManager $BadTokenException: Невозможно добавить окно - токен null не для приложения

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

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

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

Ответ 1

Замените context на getActivity().

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

Вы можете попробовать это или использовать 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();
    }

Ответ 6

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