【问题标题】:AlertDialog is this a bug?AlertDialog 这是一个错误吗?
【发布时间】:2012-05-20 00:47:07
【问题描述】:

我的应用创建了一个 AlertDialog,用户在其中输入要保存的名称。当用户单击保存按钮时,onClickListener 将检查重复名称。如果名称已经存在,则会弹出另一个对话框,提醒用户现有数据将被替换。然后,用户可以选择取消并返回以更改为新名称,或者继续进行数据替换。
当第二个对话框出现时,我希望第一个对话框仍然可见,直到我调用dismiss。但是,第一个 AlertDialog 在第二个 AlertDialog 出现之前消失了。当单击按钮时,将自动调用关闭。这是错误还是设计使然?
我编写了下面的测试用例,我在 3 台设备上进行了检查:Nexus S android 4.0、HTC Rezound android 2.3 和 Motorola Droid Bionic android 2.3。

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:orientation="vertical" >

    <TextView 
        android:id="@+id/message"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Some message will be here"
    />

    <Button
        android:id="@+id/show_btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:text="Show"
    />

</LinearLayout>

代码

public class AlertDialogBug extends Activity 
{
    static final int DIALOG_ALERT_ID = 1;
    AlertDialog alertDlg;  
    TextView message;

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

        setContentView(R.layout.main);

        message = (TextView) findViewById(R.id.message);
        Button showButton = (Button) findViewById(R.id.show_btn);
        showButton.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                showDialog(DIALOG_ALERT_ID);
            }   
         });
     }

    private AlertDialog createAlertDialog()
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Bug?");

        builder.setPositiveButton("OK", new DialogInterface.OnClickListener()
        {

            @Override
            public void onClick(DialogInterface dialog, int which)
            {
                // No dismiss, cancel, finish, or removeDialog,
                // but the dialog will disappear when this button is clicked.
            }

          });

         alertDlg = builder.create();
         alertDlg.setOnDismissListener(new OnDismissListener()
         {

             @Override
             public void onDismiss(DialogInterface dialog)
             {
                message.setText("onDismiss was called");
             }

          });

          return alertDlg;
    }

    @Override
    protected Dialog onCreateDialog(int id)
    {
        switch (id)
        {
            case DIALOG_ALERT_ID:
                return createAlertDialog();

            default:
                return super.onCreateDialog(id);
        }       
    } 

} 

我最初使用 android:theme="@android:style/Theme.Dialog" 将保存对话框编写为一个活动。 UI 在 Nexus S 和 Rezound 上看起来不错,但在 Droid Bionic 上看起来很糟糕(编辑框和按钮只占宽度的一半,另一半是空白的)。

【问题讨论】:

    标签: android


    【解决方案1】:

    这是设计使然。 如果您不想通过单击按钮取消对话框,下面是一些代码。 当您不想取消对话框时,将其添加到您的 setPositiveButton 方法中。

    try { 
    Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing"); 
    field.setAccessible(true); 
    field.set(dialog, false);
    
    } catch (Exception e) { 
    e.printStackTrace(); 
    }
    

    那么如果你想取消对话框,只需要在下面添加这个。

    try {
    Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
    field.setAccessible(true);
    field.set(dialog, true);
    } catch (Exception e) {
    e.printStackTrace();
    }
    

    顺便说一句,您的 xml 永远不会被您的警报对话框调用。因为 setTitle() 和 setMessage 方法由警报对话框提供。

    如果您想提供自定义对话框,请调用 setCustomeView(layout)。

    有任何问题,请告诉我。

    【讨论】:

    • 谢谢,这很有效,它使我免于重写我的应用程序。上面的布局用于活动而不是警报对话框。我的投票被拒绝了,因为我没有足够的声望,否则你会得到 2 票。
    【解决方案2】:

    不是错误 - 在这种情况下,仅提供了 onClick(),因此您可以在单击按钮时更新 UI/执行操作。

    如果您想在单击“确定”按钮时保留对话框,您可以尝试使用确定/取消按钮创建具有透明背景的自定义活动。

    【讨论】:

    • 我确实把保存对话框写成了一个活动。我想我必须回到布局,看看我做错了什么让 Droid Bionic 看起来很奇怪。无论如何,如果是设计使然,那么在 onClick 中调用dismiss 是多余的,不是吗?
    • 正确,您不必从侦听器中调用dismiss。如果用户在显示对话框时点击“返回”按钮,onDismiss 可能会被单独调用。
    猜你喜欢
    • 2012-09-18
    • 2012-03-25
    • 2010-12-22
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2011-03-23
    相关资源
    最近更新 更多