1

私のアプリは、ユーザーが保存する名前を入力する AlertDialog を作成します。ユーザーが保存ボタンをクリックすると、 onClickListener が重複した名前をチェックします。名前が既に存在する場合は、別のダイアログ ボックスがポップアップして、既存のデータが置き換えられることをユーザーに警告します。ユーザーは、キャンセルして新しい名前に変更するか、先に進んでデータを置き換えるかを選択できます。
2 番目のダイアログが表示されたとき、最初のダイアログ ボックスは、dismiss を呼び出すまで表示されたままになると思います。ただし、最初の AlertDialog は、2 番目の AlertDialog が表示される前に消えました。つまり、ボタンがクリックされると、却下が自動的に呼び出されます。これはバグですか、それとも仕様ですか?
以下に、Nexus S android 4.0、HTC Rezound android 2.3、および Motorola Droid Bionic android 2.3 の 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 ではひどく見えます (編集ボックスとボタンは幅の半分しか占めておらず、残りの半分は空白です)。

4

2 に答える 2

3

これは仕様によるものです。ボタンをクリックしてダイアログをキャンセルしたくない場合は、以下にいくつかのコードを示します。ダイアログをキャンセルしたくない場合は、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) を呼び出します。

ご不明な点がございましたら、お知らせください。

于 2012-05-20T02:29:54.017 に答える
1

バグではありません。この場合、onClick() が提供されているだけなので、UI を更新したり、ボタンがクリックされたときにアクションを実行したりできます。

「OK」ボタンがクリックされたときにダイアログを保持したい場合は、Ok/Cancel ボタンで透明な背景を持つカスタム アクティビティを作成してみてください。

于 2012-05-20T01:18:24.680 に答える