7

私の問題はこの 2 年前の質問に似ています。2 年間で多くの変更があったため、同じ問題を再投稿して最新の回答を取得しています。

私は GingerBread+ デバイス用のアプリを開発しています。多くのアクティビティがあり、バックグラウンドでサーバーからデータを受け取ります。そのデータに基づいて、場合によってDialogはユーザーに表示する必要があります。問題は、現在の最前線のアクティビティをどのように知るかです。

が試したのは、getApplicationContext()whileDialog作成を試みましたが、うまくいきません。いくつかの例外をスローします。

解決策 ?(私は本当に嫌いです)、Application解決策は、クラスに変数を持ち、onResume()各アクティビティに設定すること で、現在表示されているアクティビティを追跡することです。彼らがこれを達成するためのよりスマートな方法であり、彼らがこれを達成するためのよりスマートな方法であると確信している場合、私は本当にこの簿記をしたくありません。

私の簡単な質問は、
現在表示されているアクティビティに関するダイアログを表示するにはどうすればよいですか? 、その参照を AlertDialog.Builder に与えることができるように、それが私の仕事をすると思います

編集、次のコードを使用して簡単なダイアログを作成します private View.OnClickListener cancelClickListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                LoginActivity.this);

        // set title
        alertDialogBuilder.setTitle("Roobroo will exit..");

        // set dialog message
        alertDialogBuilder
                .setMessage("Are you sure you want to exit ?")
                .setCancelable(false)
                .setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int id) {
                                // if this button is clicked, close
                                // current activity
                                LoginActivity.this.finish();
                            }
                        })
                .setNegativeButton("No",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int id) {
                                // if this button is clicked, just close
                                // the dialog box and do nothing
                                dialog.cancel();
                            }
                        });

        // create alert dialog
        AlertDialog alertDialog = alertDialogBuilder.create();

        // show it
        alertDialog.show();
        // TODO Write the code to exit from the app, (gracefull exit)
        Log.i(LOG_CAT, "Cancel Button is clicked");
    }
};

AlertDialog.Builder を使用した例外 alertDialogBu​​ilder = new AlertDialog.Builder( getApplicationContext()); 私に次の例外を与えます、

06-11 14:09:16.732: E/AndroidRuntime(1005): FATAL EXCEPTION: main
06-11 14:09:16.732: E/AndroidRuntime(1005): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
06-11 14:09:16.732: E/AndroidRuntime(1005):     at android.view.ViewRoot.setView(ViewRoot.java:531)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at android.app.Dialog.show(Dialog.java:241)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at com.mycompany.myapp.activities.LoginActivity$3.onClick(LoginActivity.java:127)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at android.view.View.performClick(View.java:2485)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at android.view.View$PerformClick.run(View.java:9080)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at android.os.Handler.handleCallback(Handler.java:587)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at android.os.Handler.dispatchMessage(Handler.java:92)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at android.os.Looper.loop(Looper.java:123)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at android.app.ActivityThread.main(ActivityThread.java:3683)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at java.lang.reflect.Method.invokeNative(Native Method)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at java.lang.reflect.Method.invoke(Method.java:507)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at dalvik.system.NativeStart.main(Native Method)
4

3 に答える 3

6

それがあなたを助けるならば、これを試してください:

1.で を作成Activityしますtransparent theme and no title

2.onCreate()を定義しalert dialogます。

3. BroadcastReceiver からこのアクティビティを開始すると、alert dialog.

于 2012-06-12T10:41:10.700 に答える
4

Activityを作成し、そのテーマを次Dialogmanifestように設定するだけです。

  <activity
        android:name="Dialog_MsgBox"
        android:launchMode="singleInstance"
        android:theme="@android:style/Theme.Dialog" >
    </activity>

アクティビティの複数のインスタンスを防ぐためにも設定launchModeします。singleInstanceダイアログに使用したいレイアウトを使用してください。

別のメッセージを設定するには、余分な文字列メッセージを入れて、Dialog(アクティビティ) の起動時にそれらを取得します。

于 2012-06-12T11:01:10.630 に答える
2

最善の解決策ではありませんが、私にとってはうまくいきました..

Activity を拡張する抽象クラス MyActivity を作成し、セッター呼び出しをこのクラスの OnResume および OnPause 側に配置しました。アプリケーションの他のすべてのアクティビティは、Activity の代わりにこのカスタム スーパー クラスを拡張するだけです。

次に、このクラスの変数を Application クラスに作成し、

private Activity currentOnTopActivity;

この変数を MyActivity クラス内onResume()およびクラス内で設定/リセットします。onPause()

ユーザーにダイアログを表示したいときはいつでも、次のようにします...

   if (currentOnTopActivity!=null && !currentOnTopActivity.isFinishing()) {
                currentOnTopActivity.runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        String msg = "Some msg";
                        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(currentOnTopActivity);
                        AlertDialog invitationDialog = null;

                        // set title
                        alertDialogBuilder.setTitle("Title ");

                        // set dialog message
                        alertDialogBuilder.setMessage(msg).setCancelable(false).setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                         // do something                            }
                        });

                        // create alert dialog
                        invitationDialog = alertDialogBuilder.create();

                        // show it on UI Thread
                        invitationDialog.show();

                    }

                });
            }

また、スーパー アクティビティ クラスを導入することで、他のすべてのアクティビティで共通のコードを複製する代わりに、この抽象クラスに共通のコードを配置する柔軟性が得られます。

于 2012-07-04T08:04:15.067 に答える