2012-06-21 55 views
6

說我們有兩個活動,Activity1和Activity2。android-如何在活動結束後顯示對話框

在活動1的onClick()方法中,我們有一個呼叫開始活動2如果按下某個按鈕:

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

結束後()被調用的活性2,和活性1重新開始,我需要一個對話框以便在恢復後立即顯示在Activity1中。

之前,我只是叫的ShowDialog(ID)的活性1的onClick同一塊()方法:

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

的問題是,活性1恢復後,對應END_DIALOG_ID對話是不可見的,但屏幕變暗且無響應(就像對話存在一樣),直到按下後退鍵。

我已經嘗試在Activity1的onResume()和onRestart()方法中放置showDialog()調用,但這些都會使程序崩潰。

我也嘗試在Activity2中創建一個AsyncTask方法,並在其onPostExecute()中調用showDialog(),但該對話框在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); 

    } 
} 

我現在想通過調用

Activity1.this.startActivityForResult(myIntent, END_DIALOG_REQUEST); 

與相應的setResult()和活性1 onActivityResult()方法來實現這一點,但似乎應該有實現這更好的做法。我需要的是在Activity2完成時顯示一個對話框。

感謝您提供的任何幫助。

+1

我打算建議startActivityForResult和onActivityResult,但你似乎已經自己發現了它。對我而言,這是實現你想要的最直接的方法。 – mportuesisf

回答

7

像你的建議,打startActivityForResultActivity2。然後,覆蓋onActivityResult並檢查RESULT_OK,然後顯示您的對話框。這是完全可以接受的做法,可以做你想做的事情。

+0

謝謝。這似乎是最好的答案,因爲重寫'onResume()'會在第一次啓動Activity1時顯示對話框,如果應用程序失去焦點,onRestart()會導致顯示該對話框。當Activity2完成時(或通過BACK鍵取消),使用'startActivityForResult'似乎更好,只顯示對話框。再次感謝! – avoyles

+0

不客氣。還有一點要記住,如果用戶導航到另一個應用程序(電話,消息傳遞等等),然後返回到您的活動,則會調用onResume()。 – wsanville

+0

嗯,是的。那是個很好的觀點。但我認爲'startActivityForResult'會更好,因爲我只想在Activity2完成並且Activity1焦點之後顯示對話框。該對話框用於獲取時間戳,它需要在Activity2轉換回Activity1時。 – avoyles

0

可以使用的onResume方法(如果u'r不看從任何活性2)

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

在onResume()中使用showDialog()也會導致首次創建Activity1時顯示對話框。 – avoyles

+0

但是,使用onRestart而不是onResume似乎正常工作。我以前試過時忘記調用'super.onRestart()'。什麼情況下我可能不必擔心onRestart()被調用,而不是在Activity2完成後調用? – avoyles

+0

你需要確保'onRestart()'中的每個變量都已經被啓動/重新啓動,否則它會拋出'NullPointerException' – Hein

0

我要回到根系活力 - MainActivity,有可能關閉一些活動,然後顯示對話框。所以我選擇了另一種方式。

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) { 
     //... 
    } 
} 

我請從MainActivity.onPostResume MyDialog.showDialogIfNecessary()()方法。

相關問題