Как отобразить 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 ответов:
заменить
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()); ... }
у меня были подобные проблемы, когда я пытался создать 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(); }
Comments