Android 1.6: «android.view.WindowManager $ BadTokenException: невозможно добавить окно - нулевой токен не для приложения» - PullRequest
300 голосов
/ 14 апреля 2010

Я пытаюсь открыть диалоговое окно, но каждый раз, когда я пытаюсь открыть его, выдается следующее исключение:

Uncaught handler: thread main exiting due to uncaught exception
android.view.WindowManager$BadTokenException: 
     Unable to add window -- token null is not for an application
  at android.view.ViewRoot.setView(ViewRoot.java:460)
  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
  at android.app.Dialog.show(Dialog.java:238)
  at android.app.Activity.showDialog(Activity.java:2413)

Я создаю его, вызывая showDialog с идентификатором дисплея. Обработчик onCreateDialog отлично регистрируется, и я могу пройти по нему без проблем, но я прикрепил его, поскольку мне кажется, что я что-то упустил:

@Override
public Dialog onCreateDialog(int id)
{
    Dialog dialog;
    Context appContext = this.getApplicationContext();
    switch(id)
    {
        case RENAME_DIALOG_ID:
            Log.i("Edit", "Creating rename dialog...");
            dialog = new Dialog(appContext);
            dialog.setContentView(R.layout.rename);
            dialog.setTitle("Rename " + noteName);
            break;
        default:
            dialog = null;
            break;
    }
    return dialog;      
}

Чего-то не хватает? В некоторых вопросах говорилось об этой проблеме при создании диалога из onCreate, что происходит потому, что действие еще не создано, но это происходит из-за вызова из объекта меню, и переменная appContext выглядит так правильно заполнен в отладчике.

Ответы [ 16 ]

2 голосов
/ 25 августа 2014

Для вложенных диалогов эта проблема очень распространена, она работает, когда

AlertDialog.Builder mDialogBuilder = new AlertDialog.Builder(MyActivity.this);

используется вместо

mDialogBuilder = new AlertDialog.Builder(getApplicationContext);

это альтернатива.

1 голос
/ 07 сентября 2013

Вы также можете сделать это

public class Example extends Activity {
    final Context context = this;
    final Dialog dialog = new Dialog(context);
}

Это сработало для меня!

0 голосов
/ 23 февраля 2017

Лучший и самый безопасный способ показать «ProgressDialog» в AsyncTask, избегая проблемы утечки памяти, - это использовать «Обработчик» с Looper.main ().

    private ProgressDialog tProgressDialog;

затем в 'onCreate'

    tProgressDialog = new ProgressDialog(this);
    tProgressDialog.setMessage(getString(R.string.loading));
    tProgressDialog.setIndeterminate(true);

Теперь вы закончили с установочной частью. Теперь вызовите showProgress () и hideProgress () в AsyncTask.

    private void showProgress(){
        new Handler(Looper.getMainLooper()){
            @Override
            public void handleMessage(Message msg) {
                tProgressDialog.show();
            }
        }.sendEmptyMessage(1);
    }

    private void hideProgress(){
        new Handler(Looper.getMainLooper()){
            @Override
            public void handleMessage(Message msg) {
                tProgressDialog.dismiss();
            }
        }.sendEmptyMessage(1);
    }
0 голосов
/ 03 марта 2016

Попробуйте сбросить dialog тип окна на

WindowManager.LayoutParams.TYPE_SYSTEM_ALERT:
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

Не забудьте использовать разрешение android.permission.SYSTEM_ALERT_WINDOW

0 голосов
/ 22 февраля 2016

Как уже говорилось, вам нужен Activity в качестве контекста для диалога, используйте "YourActivity.this" для статического контекста или отметьте здесь , чтобы узнать, как использовать динамический в безопасном режиме

0 голосов
/ 30 января 2016
public class Splash extends Activity {

    Location location;
    LocationManager locationManager;
    LocationListener locationlistener;
    ImageView image_view;
    ublic static ProgressDialog progressdialog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);
        progressdialog = new ProgressDialog(Splash.this);
           image_view.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                        locationManager.requestLocationUpdates("gps", 100000, 1, locationlistener);
                        Toast.makeText(getApplicationContext(), "Getting Location plz wait...", Toast.LENGTH_SHORT).show();

                            progressdialog.setMessage("getting Location");
                            progressdialog.show();
                            Intent intent = new Intent(Splash.this,Show_LatLng.class);
//                          }
        });
    }

Текст здесь: -
используйте это для получения activity контекста для progressdialog

 progressdialog = new ProgressDialog(Splash.this);

или progressdialog = new ProgressDialog(this);

используйте это для получения контекста приложения для BroadcastListener не для progressdialog.

progressdialog = new ProgressDialog(getApplicationContext());
progressdialog = new ProgressDialog(getBaseContext());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...