2011-04-14 164 views
12

我想從另一個對話框的按鈕的onClick監聽器中顯示一個對話框,但第二個對話框不會顯示。我搜索並發現了類似的問題Dialogs order in Android,嘗試提供的解決方案,但即使這樣也行不通。Android從對話框中顯示另一個對話框

我的代碼與答案中提供的代碼非常相似。

公共無效的onClick(DialogInterface 對話框,INT ID){ 的ShowDialog(SECOND_DIALOG); dialog.dismiss(); }

任何幫助將是非常讚賞。

感謝,

阿克沙伊

回答

8

這是我正在做它:

if (!appPrefs.getAcceptedUsageAggrement()) { 
     tracker.trackPageView("/UsageAgreementDialog"); 
     acceptedUsage_alertDialog = new AlertDialog.Builder(BroadcastSMSActivity.this) 
     .setTitle(R.string.accept_usage_title) 
     .setMessage(R.string.accept_usage_message) 
     .setNegativeButton(android.R.string.cancel, new AlertDialog.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       finish(); 
      } 
     }) 
     .setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       if (appPrefs.getAppVer().equals("")) { 
        tracker.trackEvent("Application", "Install", getAppVerName(), 1); 
       } else { 
        tracker.trackEvent("Application", "Upgrade", appPrefs.getAppVer().toString()+"->"+getAppVerName(), 1); 
       } 
       displayRecentChanges = true; 
       appPrefs.saveAppVer(getAppVerName()); 
       appPrefs.saveAcceptedUsageAggrement(true); 
      // Display Recent Changes on 1st use of new version 
       if (displayRecentChanges) { 
        tracker.trackPageView("/RecentChangesDialog"); 
        recentChanges_alertDialog = new AlertDialog.Builder(BroadcastSMSActivity.this) 
        .setTitle(getString(R.string.changes_title, getAppVerName())) 
        .setMessage(R.string.changes_dialog) 
        .setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { 
         public void onClick(DialogInterface dialog, int which) { 
          recentChanges_alertDialog.cancel(); 
          acceptedUsage_alertDialog.cancel(); 
         } 
        }) 
        .create(); 
        recentChanges_alertDialog.show(); 
       } 
      } 
     }) 
     .create(); 
     acceptedUsage_alertDialog.show(); 
    } 
+1

謝謝比爾!這工作!顯然調用活動上下文的showDialog()不會。 – Akshay 2011-04-14 13:55:24

+0

我不確定我是否已接受Usage_alertDialog.cancel();在正確的地方,但我可以告訴你,當我取消它onClick(),然後嘗試創建後續對話框時,它導致了一個關閉的力量。所以,在第二個對話框的cancel()之後移動它的.cancel()就顯得很自然。 – 2011-04-14 14:20:53

+0

您可能還會注意到那裏有一些很酷的Google Analytics技巧......我在記錄此應用程序的運行是新安裝還是升級。如果是升級版,我會記錄它們的版本以及正在安裝的版本:1.5-> 1.8等。 – 2011-04-14 14:24:50

1

我的建議是這樣的代碼。點擊對話框1時有一個按鈕,然後對話框2將會呼叫。

private Dialog dialog; 
    private AlertDialog.Builder voteBuilder; 

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

    // Firat dialog 
      dialog = new Dialog(QrCodeReader.this); 
      dialog.setContentView(R.layout.customdialog_qr); 
      dialog.setCancelable(false); 

    // Second dialog 
      showVotingDialog(); 

    //set up button of dialog 1 
      Button btnVote = (Button) dialog.findViewById(R.id.btnVote); 
      btnVote.setOnClickListener(new OnClickListener() { 
      @Override 
       public void onClick(View v) { 
        dialog.dismiss(); 
        voteBuilder.show(); 
       } 
      }); 

dialog.show(); 
    } 

    private void showVotingDialog() { 
      voteBuilder = new AlertDialog.Builder(this); 
      voteBuilder.setTitle(R.string.votingdialog_title); 
      voteBuilder.setCancelable(false); 
      LayoutInflater inflater = getLayoutInflater(); 
      final View checkboxLayout = inflater.inflate(R.layout.voting_dialog, null); 
      voteBuilder.setView(checkboxLayout); 
      voteBuilder.setPositiveButton(R.string.menu_ok, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        RadioGroup radioGroup = (RadioGroup) checkboxLayout.findViewById(R.id.vote_radiogroup); 
        int checkedRadioButton = radioGroup.getCheckedRadioButtonId(); 
        int radioButtonSelected = 0; 
        switch (checkedRadioButton) { 
         case R.id.vote_item1 : radioButtonSelected = 1; break; 
         case R.id.vote_item2 : radioButtonSelected = 3; break; 
         case R.id.vote_item3 : radioButtonSelected = 5; break; 
         case R.id.vote_item4 : radioButtonSelected = 10; break; 
         case R.id.vote_item5 : radioButtonSelected = 20; break; 
         default: radioButtonSelected = 0; 
        } 

        sendVoteBySMS(radioButtonSelected); 
       } 
      }); 
      voteBuilder.setNegativeButton(R.string.menu_cancel, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        QrCodeReader.this.finish(); 
       } 
      }); 

      voteBuilder.create(); 
    //  voteBuilder.show(); 
     } 
5

我知道這是前一段時間問的,但是我發現這裏有一個非常簡潔的解決方案。

我定義一個接口是這樣的:

public interface OpenDialog { 

public void showDialog(DialogFragment dialog); 

} 

我的哪些活動,則器具,傳遞到自身的引用到當它打開時,使用我InterfaceHolder類的對話框:

public class MyActivity extends FragmentActivity implements OpenDialog { 

@Override 
protected void onCreate(Bundle arg0) { 
    super.onCreate(arg0); 

    InterfaceHolder.set(this);   
    showDialog(new DialogOne()); 

} 

public void showDialog(DialogFragment dialog) { 
    dialog.show(getSupportFragmentManager(), "tag"); 
} 

InterfaceHolder是隻是一個類的靜態引用我用它來傳遞它的接口:

public class InterfaceHolder { 
private static OpenDialog openDialog; 

public void set(OpenDialog openDialog) 
    this.openDialog = openDialog; 
} 

public void get() 
    return openDialog; 
} 

所以showDialog方法會顯示我傳入的任何對話框;正如你所看到的,我這樣做是爲了顯示DialogOne。現在,如果我想開一個名爲「DialogTwo」內部「DialogOne」新的對話框,我可以寫作稱之爲:

InterfaceHolder.get().showDialog(new DialogTwo()); 
dismiss(); 

瞧,DialogTwo所示。顯然,你必須小心確保對你的活動的引用已經傳遞給InterfaceHolder(一個很好的方法是將InterfaceHolder.set(this);放在showDialog方法中),但是否則這似乎工作精美。

-3

只需在對話框中隱藏並顯示視圖點擊

+0

請爲此添加評論。無需爲此提供答案 – 2016-12-15 09:50:19

相關問題