Я хочу отобразить диалоговое окно предупреждения в своем приложении. Я использую фрагменты. Я попробовал приведенный ниже код:
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: Невозможно добавить нулевой токен окна не для приложения
Из Интернета я узнал, что авария связана с проблемой контекста. Я дал контекст как
context = this.getActivity().getApplicationContext();
Я не знаю, в чем проблема с этим. Кто-нибудь может мне помочь?
Замените context
с помощью getActivity()
.
ApplicationContext
не должен использоваться для таких задач, как создание диалоговых окон. Поскольку вы находитесь в фрагменте, вы можете вместо этого получить Activity-Context, просто вызвав метод Fragments getActivity()
.
Дополнительная информация об этом вопросе (AlertDialog во фрагменте, управляемом внутри события):
Если вы вызываете AlertDialog в течение события, такого как onClick (View v) или onLongClick (View v), вы можете использовать
public boolean onClick(View v) { ... AlertDialog.Builder alertBuilder = new AlertDialog.Builder(v.getContext()); ... }
Попытайтесь использовать DialogFragment, DialogFragment лучше, когда вы используете фрагменты
Я использовал его в адаптере внутри listView, поэтому я не мог использовать getActivity()
. Чтобы заставить его работать, я использовал getActivity()
для контекста в создании адаптера во фрагменте:
this.adapter = new myAdapter(getActivity(), factory);
Позже в другом классе (классе адаптера) я смог использовать getContext()
и он сработал.
Вы можете попробовать это или использовать 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(); }
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();