2012-06-12 2 views
5

私の問題はに似ています.2年後に多くの変更があったため、同じ問題を投稿して更新された回答を得ました。アンドロイドで現在表示されているアクティビティのダイアログを表示するにはどうすればよいですか?

私はGingerBread +デバイス用のアプリを開発しています。私は多くのアクティビティを持っており、バックグラウンドではサーバーからデータを受信して​​います。今、そのデータに基づいて、私はDialogをユーザーに示す必要があります。問題はどのように現在のフロントが最も活動しているかをどのように知るのですか?私が試した何

しかし私は働いていないこと、getApplicationContext()Dialogしばらく創造を与えて試してみました。例外を投げる

解決策はありますか? (私は本当にそれが嫌いです) 変数はApplicationクラスにあり、それを各アクティビティのonResume()に設定することで、現在表示されているアクティビティを追跡できます。私は上のダイアログを表示するにはどうすればよい
、私の素朴な疑問がある

これを達成するために、よりスマートな方法は自分のしている場合、私は本当にこの簿記を行うにはしたくないと私はこれを達成するために、よりスマートな方法は自分のしている確信している、

現在表示されているアクティビティですか?、私はAlertDialog.Builderへの参照を与えることができるので、私は自分の仕事をすると思う.. トップアクティビティでダイアログを表示する方法は?

編集、私は次のコード プライベートView.OnClickListener cancelClickListener =新しいOnClickListenerを(使用して簡単なダイアログを作成する)AlertDialog.Builder alertDialogBu​​ilder =新しいAlertDialog.Builderを使用して、{

@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"); 
    } 
}; 

例外 ( getApplicationContext());

1.transparent theme and no titleActivityを作成します。例外下記の私に与え、それはあなたを助けている場合、

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.argusoft.roobrooAndroid.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) 
+0

getApplicationContext()の例外は何ですか? –

+0

いくつかのコードを表示してください。今まで何をしてきたのですか? – Dhruvisha

+0

さて、透明な余分なアクティビティを持ってきて、そのアクティビティのダイアログを表示することができます。アクティビティのダイアログのすべてのコードを書きます。 – Rasel

答えて

5

はこれを試してみてください。

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

broadcastReceiverからこのアクティビティを開始すると、alert dialogが表示されます。

2

単にあなたがActivityを作成し、このようmanifestDialogにそのテーマを設定することができます。

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

も活動の複数のインスタンスを防ぐためにsingleInstancelaunchModeを設定します。 あなたのダイアログに使用したいレイアウトを使用してください。

別のメッセージを設定するには、追加の文字列メッセージを入力し、ダイアログ(アクティビティ)を起動してください。私はアプリケーションクラスに

private Activity currentOnTopActivity; 

を有することによって、この問題を解決

+0

良い音..現在表示されているアクティビティには常に表示されます... – aProgrammer

+0

はい、現在表示されているアクティビティに表示されます。 –

1

、Iは/ onResume()と各活動のonPause()内部にこの変数をリセット設定します。私は活動を拡張する抽象クラスMyActivityを作成したプロセスを簡素化するために

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

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(); 

        } 

       }); 
      } 

EDIT とこのクラスのOnResumeおよびOnPauseの横にセッター呼び出しを配置し​​ました。私のアプリケーションの他のすべてのアクティビティは、アクティビティの代わりにこのカスタムスーパークラスを拡張するだけです。これにより、最高のソリューションを得るたびに、基礎となるロジックを柔軟に変更することができます。

+1

親愛なるDownvoterより良い方法を提供してください...私はまだ最高の答えを待っています... – aProgrammer

関連する問題