2012-06-21 52 views
6

Activity1とActivity2という2つのアクティビティがあるとします。 Activity1のonClick()メソッドでandroid - アクティビティの終了後にダイアログを表示する方法

、我々は特定のボタンが押された場合のアクティビティ2を開始するための呼び出しを持っている:

Intent myIntent = new Intent(Activity1.this, Activity2.class); 
Activity1.this.startActivity(myIntent); 

仕上げた後は、()Activity2に呼び出され、Activity1が再開され、私が必要アクティビティ1に表示されるダイアログは、再開されるとすぐに表示されます。

、私は単純にActivity1のonClick()メソッドの同じブロック内にShowDialog(ID)と呼ばれる前に:

public void onClick(View v) { 
    if(v == addHole){ 
    //... 
    Intent myIntent = new Intent(Activity1.this, Activity2.class); 
    Activity1.this.startActivity(myIntent); 
    showDialog(END_DIALOG_ID); 
    } 
} 

Activity1が再開した後、問題が、あり、END_DIALOG_IDに対応するダイアログが表示されていないが、バックキーが押されるまで、画面が暗く反応しない(ダイアログが存在するかのように)。

Activity1のonResume()メソッドとonRestart()メソッドでshowDialog()を呼び出そうとしましたが、両方ともプログラムがクラッシュします。

また、onPostExecute()でshowDialog()を呼び出してActivity2でAsyncTaskメソッドを作成しようとしましたが、ダイアログがActivity2に表示されません。

private class ShowDialogTask extends AsyncTask<Void, Void, Integer> { 
    /** The system calls this to perform work in a worker thread and 
    * delivers it the parameters given to AsyncTask.execute() */ 
    protected Integer doInBackground(Void... id) { 
     //do nothing 
     return END_DIALOG_ID; 
    } 

    /** The system calls this to perform work in the UI thread and delivers 
    * the result from doInBackground() */ 
    protected void onPostExecute(Integer id) { 
     super.onPostExecute(id); 
     showDialog(id); 

    } 
} 

は、私は今、対応setResult()とActivity1からonActivityResult()メソッドで

Activity1.this.startActivityForResult(myIntent, END_DIALOG_REQUEST); 

を呼び出すことにより、これを実装しようとしていますが、これを実現するためのより良い練習がなければならないようです。私が必要とするのは、アクティビティ2の終了時にダイアログが表示されることだけです。

ご協力いただきありがとうございます。

+1

私はstartActivityForResultとonActivityResultを提案しようとしていましたが、あなた自身でそれを発見したようです。私にとって、それはあなたが望むものを達成する最も簡単な方法です。 – mportuesisf

答えて

7

Activity2を開始するときには、startActivityForResultと発声してください。次に、onActivityResultを無効にしてRESULT_OKを確認し、ダイアログボックスを表示します。それは、あなたがやろうとしていることをするための完全に受け入れ可能な習慣です。 、MainActivityを潜在的に閉じて、いくつかの活動をして、ダイアログを表示 - (u'rがactivity2から何かを見ていない場合)

+0

ありがとうございます。 'onResume()'をオーバーライドすると、Activity1が初めて起動されたときにダイアログが表示され、アプリケーションがフォーカスを失った場合に 'onRestart()'がダイアログを表示させるので、これは最善の答えです。 'startActivityForResult'を使うと、Activity2が終了したとき(またはBACKキーを使ってキャンセルされたとき)にダイアログを表示するほうが良いようです。再度、感謝します! – avoyles

+0

ようこそ。もう1つ注意しなければならないのは、ユーザーが別のアプリ(電話、メッセージングなど)にナビゲートしてから、アクティビティに戻ると、 'onResume()'が呼び出されるということです。 – wsanville

+0

はい、はい。それは良い点です。しかし、私は 'startActivityForResult'がうまくいくと思います。私は、Activity2の終了後にダイアログを表示し、Activity1にフォーカスが欲しいと思っています。このダイアログはタイムスタンプを取得するためのもので、Activity2がActivity1に戻った時点である必要があります。 – avoyles

0

あなたは

@Override 
public void onResume(){ 
    super.onResume(); 
    //do something 
} 
+0

onResume()でshowDialog()を使用すると、Activity1が初めて作成されたときにダイアログが表示されます。 – avoyles

+0

しかし、onResumeの代わりにonRestartを使用すると、必要に応じて機能するように見えます。私は前にそれを試したときに 'super.onRestart()'を呼び出すことを忘れていました。 Activity2が終了した後にonRestart()が呼び出されてしまうことについて心配する必要はありますか? – avoyles

+0

'onRestart()'で使用するすべての変数が既に開始/再開始されていることを確認する必要があります。そうしないと、 'NullPointerException'がスローされます。 – Hein

0

私はルートアクティビティに戻るには持ってメソッドをonResume使用することができます。だから私は別の方法を選んだ。

MyDialog { 
    public static synchronized void planToShowDialog(String info) { 
     if (info != null) { 
      saveInfoToPreferences(info); 
     } 
    } 

    public static synchronized void showDialogIfNecessary(Context context) { 
     String info = readInfoFromPreferences(); 
     if (info != null) { 
      saveInfoToPreferences(null); // Show dialog once for given info. 
      new MyDialog(context, info).show(); 
     } 
    } 

    private static String readInfoFromPreferences() { 
     //... 
    } 

    private static void saveInfoToPreferences(String info) { 
     //... 
    } 
} 

IはMainActivity.onPostResume()メソッドからMyDialog.showDialogIfNecessary()を呼び出します。

関連する問題