Android从对话框中显示另一个对话框

问题描述:

我想从另一个对话框的按钮的onClick监听器中显示一个对话框,但第二个对话框不会显示。我搜索并发现了类似的问题Dialogs order in Android,尝试提供的解决方案,但即使这样也行不通。Android从对话框中显示另一个对话框

我的代码与答案中提供的代码非常相似。

公共无效的onClick(DialogInterface 对话框,INT ID){ 的ShowDialog(SECOND_DIALOG); dialog.dismiss(); }

任何帮助将是非常赞赏。

感谢,

阿克沙伊

这是我正在做它:

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时有一个按钮,然后对话框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(); 
     } 

我知道这是前一段时间问的,但是我发现这里有一个非常简洁的解决方案。

我定义一个接口是这样的:

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方法中),但是否则这似乎工作精美。

只需在对话框中隐藏并显示视图点击

+0

请为此添加评论。无需为此提供答案 – 2016-12-15 09:50:19