Как отобразить 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();