111

なぜこれが起こっているのか理解できないようです。このコード:

mProgressDialog = ProgressDialog.show(this, "", getString(R.string.loading), true);

うまく動作します。ただし、このコード:

mProgressDialog = ProgressDialog.show(getApplicationContext(), "", getString(R.string.loading), true);

次の例外をスローします。

W/WindowManager(  569): Attempted to add window with non-application token WindowToken{438bee58 token=null}.  Aborting.
D/AndroidRuntime( 2049): Shutting down VM
W/dalvikvm( 2049): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
E/AndroidRuntime( 2049): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 2049): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tastekid.TasteKid/com.tastekid.TasteKid.YouTube}: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime( 2049):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
E/AndroidRuntime( 2049):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
E/AndroidRuntime( 2049):    at android.app.ActivityThread.access$2100(ActivityThread.java:116)
E/AndroidRuntime( 2049):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
E/AndroidRuntime( 2049):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 2049):    at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 2049):    at android.app.ActivityThread.main(ActivityThread.java:4203)
E/AndroidRuntime( 2049):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 2049):    at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 2049):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
E/AndroidRuntime( 2049):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
E/AndroidRuntime( 2049):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 2049): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime( 2049):    at android.view.ViewRoot.setView(ViewRoot.java:460)
E/AndroidRuntime( 2049):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
E/AndroidRuntime( 2049):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
E/AndroidRuntime( 2049):    at android.app.Dialog.show(Dialog.java:238)
E/AndroidRuntime( 2049):    at android.app.ProgressDialog.show(ProgressDialog.java:107)
E/AndroidRuntime( 2049):    at android.app.ProgressDialog.show(ProgressDialog.java:90)
E/AndroidRuntime( 2049):    at com.tastekid.TasteKid.YouTube.onCreate(YouTube.java:45)
E/AndroidRuntime( 2049):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
E/AndroidRuntime( 2049):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
E/AndroidRuntime( 2049):    ... 11 more

なぜこれが起こっているのですか?メソッドから呼び出していonCreateます。

4

18 に答える 18

129

API レベル 7 の Android バージョン 2.1 を使用しています。この (または同様の) 問題に直面し、これを使用して解決しました:

Dialog dialog = new Dialog(this);

これの代わりに:

Dialog dialog = new Dialog(getApplicationContext());

お役に立てれば :)

于 2010-05-24T19:23:10.747 に答える
64

私のために働きました

builder = new AlertDialog.Builder(getApplicationContext());

builder = new AlertDialog.Builder(ThisActivityClassName.this);

奇妙なことは、最初のものはGoogleチュートリアルで見つけることができ、人々はこれでエラーになる..

于 2011-05-24T13:17:31.043 に答える
42

どの API バージョンを使用していますか? 問題が何であるかについて私が正しければ、これは Android 1.6 (API バージョン 4) で修正されました。

getApplicationContext()null を指しているだけのオブジェクト参照のようです。onCreate()ウィンドウが実際に構築される前に、コードの一部が実行されているという点で、私が抱えていた問題と同様の問題が発生していると思います。これはハックになりますが、数百ミリ秒で新しいスレッドを起動してみてください (IIRC: 300-400 は私にとってはうまくいくように見えましたが、いじる必要があります)。例: ネットワーク IO)。このようなもの:

@Override
public void onCreate(Bundle savedInstanceState) {
    // do all your other stuff here

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            mProgressDialog = ProgressDialog.show(
               YouTube.this.getApplicationContext(), "",
               YouTube.this.getString(R.string.loading), true);

            // start time consuming background process here
        }
    }, 1000); // starting it in 1 second
}
于 2009-10-13T19:56:11.487 に答える
23

これは、null アプリケーション コンテキストに関するタイミングの問題ではないと思います

アプリ内で Application を拡張してみてください (または、既にお持ちの場合はそのまま使用してください)

public class MyApp extends Application

インスタンスをプライベート シングルトンとして使用できるようにします。これは決して nullではありません

private static MyApp appInstance;

MyApp で静的ヘルパーを作成します (シングルトンを使用します)。

    public static void showProgressDialog( CharSequence title, CharSequence message )
{
    prog = ProgressDialog.show(appInstance, title, message, true); // Never Do This!
}

ブーム!!

また、ここで Android エンジニアの回答を確認してください: WindowManager$BadTokenException

このエラーの原因の 1 つは、アクティビティではないコンテキストを介してアプリケーション ウィンドウ/ダイアログを表示しようとしている可能性があります。

さて、私は同意します。メソッドがActivityの代わりにContextパラメータを取ることは意味がありません..

于 2010-05-05T22:32:05.970 に答える
10

上記の回答を読んだ後、私の状況では、次の方法で問題が解決したことがわかりました。

これはエラーを投げました

myButton.setOnClickListener(new OnClickListener(){
    public void onClick(View v) {
        MyDialogue dialog = new MyDialogue(getApplicationContext());
        dialog.show();              
    }
});

コンテキストが間違っていることを示唆した以前の回答に基づいて、ボタンの onClick メソッドに渡されたビューからコンテキストを取得するように getApplicationContext() を変更しました。

myButton.setOnClickListener(new OnClickListener(){
    public void onClick(View v) {
        MyDialogue dialog = new MyDialogue(v.getContext());
        dialog.show();              
    }
});

私はJavaの仕組みを完全には理解していないので、間違っている可能性がありますが、私の特定の状況では、上記のスニペットがAbstract Activityクラスで定義されていたことが原因である可能性があると推測しています。おそらく getApplicationContext() が有効なコンテキストを返さないという事実に貢献しました?? (ただの推測)。

于 2010-11-12T12:30:21.850 に答える
6

項目別オーバーレイを含むマップ ビューを作成しています。mapActivity から次のような itemizedoverlay を作成していました。

OCItemizedOverlay currentLocationOverlay = new OCItemizedOverlay(pin,getApplicationContext);

itemizedoverlayのonTapメソッドがトリガーされたとき(マップビューで場所がタップされたとき)、「android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application」という例外が発生することがわかりました。

「getApplicationContext()」の代わりに「this」を単純にコンストラクターに渡すと、問題が解決することがわかりました。これは、エイリアンジャズキャットの結論を支持しているようです。変。

于 2010-08-06T19:32:32.710 に答える
4

TabActivities 内に表示されるアクティビティには、getParent()を使用します

final AlertDialog.Builder builder = new AlertDialog.Builder(getParent());

それ以外の

final AlertDialog.Builder builder = new AlertDialog.Builder(this);
于 2012-01-09T11:53:44.283 に答える
3

試す -

AlertDialog.Builder builder = new AlertDialog.Builder(getParent());
于 2011-07-11T13:06:12.567 に答える
3

Android 2.2 の場合、次の
コードを使用します。

//activity is an instance of a class which extends android.app.Activity
Dialog dialog = new Dialog(activity);

このコードの代わりに:

// this code produces an ERROR:
//android.view.WindowManager$BadTokenException: 
//Unable to add window -- token null is not for an application
Context mContext = activity.getApplicationContext();
Dialog dialog = new Dialog(mContext);

activity.onCreateDialog(int dialogId)備考: 私のカスタム ダイアログは、メソッドの外部で作成されます。

于 2011-05-26T10:07:46.787 に答える
2

(互換性)フラグメントで同様の問題があり、getActivity()内で使用するProgressDialog.show()とクラッシュしました。タイミングのせいだというのは同意。

可能な修正:

mContext = getApplicationContext();

if (mContext != null) {
    mProgressDialog = ProgressDialog.show(mContext, "", getString(R.string.loading), true);
}

使用する代わりに

mProgressDialog = ProgressDialog.show(getApplicationContext(), "", getString(R.string.loading), true);

mContext をできるだけ早く配置して、コンテキストを取得する時間を増やします。これが機能するという保証はまだありません。クラッシュの可能性を減らすだけです。それでもうまくいかない場合は、タイマー ハックに頼る必要があります (後でダイアログを閉じるなど、他のタイミングの問題が発生する可能性があります)。

もちろん、thisまたはを使用できる場合は、すでに何かを指しているActivityName.thisため、より安定しています。thisただし、特定の Fragment アーキテクチャのように、場合によっては、それはオプションではありません。

于 2013-02-14T03:50:27.160 に答える
2
于 2014-03-02T15:12:15.210 に答える
2

アクティビティ内でダイアログを使用するには、次のようにします。

private Context mContext;
private AlertDialog.Builder mBuilder;

@Override
protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     mContext = this;

     //using mContext here refering to activity context
     mBuilder = new AlertDialog.Builder(mContext);
     //...
     //rest of the code
     //...
}

フラグメント内でダイアログを使用するには、次のようにします。

private Context mContext;
private AlertDialog.Builder mBuilder;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      View mRootView = inflater.inflate(R.layout.fragment_layout, container, false);
      mContext = getActivity();

      //using mContext here refering to fragment's hosting activity context
      mBuilder = new AlertDialog.Builder(mContext);
      //...
      //rest of the code
      //...
      return mRootView;
}

それだけです^_^

于 2016-09-19T13:31:28.887 に答える
1

これを回避するために私がしたことは、グローバル データを保存するすべてのアクティビティの基本クラスを作成することでした。最初のアクティビティでは、コンテキストを次のように基本クラスの変数に保存しました。

基本クラス

public static Context myucontext; 

基本クラスから派生した最初のアクティビティ

mycontext = this

次に、ダイアログを作成するときに getApplicationContext の代わりに mycontext を使用します。

AlertDialog alertDialog = new AlertDialog.Builder(mycontext).create();
于 2010-08-01T08:15:26.223 に答える
0

現在のアクティビティビューに例外をスローするためのアラートダイアログを実装しました。このように与えたときはいつでも

AlertDialog.Builder builder = new AlertDialog.Builder(context);

同じウィンドウ例外が与えられた場合、onCreate() からアラートのコードを記述します。非常に単純で、メソッドでcontext = this;aftersetContentView()ステートメントを使用しました。onCreate()コンテキスト変数をグローバルのように使用しましたContext context;

コードサンプルは

static Context context;

 public void onCreate(Bundle savedInstanceState)  { 
        super.onCreate(savedInstanceState); 


        setContentView(R.layout.network); 
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        context = this;
.......

Alert メソッドのサンプルは

private void alertException(String execMsg){
        Log.i(TAG,"in alertException()..."+context);
        Log.e(TAG,"Exception :"+execMsg);
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
.......

それは私にとってはうまくいきます.実際に私はStackOverflowでこのエラーを検索しました.私はこのクエリを見つけました.

ありがとう、ラジェンダー

于 2010-06-22T06:12:40.483 に答える
0

ダイアログは、常にアクティビティの一部として作成および表示されます。Application コンテキストの代わりに Activity コンテキストを渡す必要があります。

http://developer.android.com/guide/topics/ui/dialogs.html#ShowingADialog

于 2012-10-03T19:04:37.817 に答える
0

groupActivity に問題がある場合は、これを使用しないでください。PARENT は、親 ActivityGroup からの静的です。

final AlertDialog.Builder builder = new AlertDialog.Builder(GroupActivityParent.PARENT);

それ以外の

final AlertDialog.Builder builder = new AlertDialog.Builder(getParent());
于 2012-02-03T11:50:39.103 に答える