25

リクエストごとに変更される可能性がある 1 つのオプションを含む AlertDialog を表示したいと考えています。たとえば、あるときは「連絡先に追加」オプションを表示したいのに、別のときは「連絡先から削除」する必要があります。

私のコードは初めて動作しますが、Android は AlertDialog をキャッシュしているようで、次回は onCreateDialog が実行されません。したがって、オプションはもう変更されません。このキャッシングを防ぐことはできますか、それともオプションを変更する別の方法がありますか?

SDK 1.5 を使用していますが、1.1 を使用しています。

@Override
protected Dialog onCreateDialog(final int id) {
    ...
    String add_remove_contact = res.getString(R.string.profile_add_to_contacts);
    if (user.getContacts().contains(profileID)) {
        add_remove_contact = res.getString(R.string.profile_remove_from_contacts);
        // TODO: this string is not changed when contact status changes 
    }
    final CharSequence[] items = {res.getString(R.string.view_profile),
                                  res.getString(R.string.profile_send_message),
                                  add_remove_contact};
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    ...
    return builder.create();
}
4

8 に答える 8

34

ダイアログが表示される前に呼び出されるonPrepareDialogメソッドを見てください。そこでリクエストタイプに基づいて必要な値を変更できます。

日付ピッカーの例

@Override
protected Dialog onCreateDialog(final int id) {
  switch (id) {
  case DIALOG_DATE_ID:
    final Calendar c = Calendar.getInstance();
    return new DatePickerDialog(this, this, c.get(Calendar.YEAR),
                                c.get(Calendar.MONTH), 
                                c.get(Calendar.DAY_OF_MONTH));
  default:
    return super.onCreateDialog(id);
  }
}

@Override
protected void onPrepareDialog(final int id, final Dialog dialog) {
  switch (id) {
  case DIALOG_DATE_ID:
    //update to current time
    final Calendar c = Calendar.getInstance();
    ((DatePickerDialog) dialog).updateDate(c.get(Calendar.YEAR), 
                                           c.get(Calendar.MONTH), 
                                           c.get(Calendar.DAY_OF_MONTH));
    break;
  }
}
于 2009-06-05T09:23:32.763 に答える
19

アクティビティのremoveDialog(int)関数を使用することもできます。ダイアログが閉じられると、アクティビティは基本的にダイアログの状態を保存します(パフォーマンス上の理由から)。ダイアログでremoveDialog(int)を呼び出すと、アクティビティはダイアログのすべての参照を強制的にアンロードし、ダイアログが表示されている場合は画面から閉じます。

ダイアログの作成
Activity#removeDialog(int)

于 2009-06-09T19:13:59.700 に答える
4

これはこの質問の重複です: Android:AlertDialogに表示されるテキストを変更できません

次の方法でも実行できます:http: //andmobidev.blogspot.com/2010/03/modifying-alert-dialogs-list-items.html

長押しメニューの表示が遅くなるようですが...

于 2010-06-06T01:09:40.623 に答える
4

上記の一貫性のない動作を修正したと思います。最初にダイアログを作成するとき (まだ AlertDialog.Builder のとき)、メッセージを初期状態 (null ではない) に設定する必要があります。そうしないと、onPrepareDialog はそれを意図した値で上書きしません。したがって、ダイアログを作成するときは、次のようなことを行って、メッセージに常に null 以外の値を含めます。私はこれに何日も苦労し、偶然この解決策を見つけました:

AlertDialog.Builder resultAlert = new AlertDialog.Builder(context);

if ( message == null ) {
    resultAlert.setMessage("");
} else {
    resultAlert.setMessage(message);
}
于 2011-10-31T20:36:39.157 に答える
2

カスタム ダイアログがある場合、dialog.getWindow().findViewById(...) を使用してカスタム項目を変更できます。

この例では、最後に表示されたテキストを保存し、次にダイアログを表示したときに再度表示します。

// custom dialog
final Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.customized);

dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
    @Override
    public void onDismiss(DialogInterface dialogInterface) {
       EditText dialogText = (EditText)dialog.getWindow().findViewById(R.id.customText);
       savedText = dialogText.getText();
    }
});

dialog.show();
EditText dialogText = (EditText)dialog.getWindow().findViewById(R.id.customText);
dialogText.setText(savedText);

カスタマイズされたダイアログの xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<Button
    android:id="@+id/buttonOK"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="OK"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginBottom="16dp" />

<EditText
    android:id="@+id/customText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="19dp"
    android:hint="Message"
    android:ems="10"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />

于 2016-12-02T08:29:38.890 に答える
1

アクティビティ管理ダイアログを使用するパフォーマンス上の理由は理解していますが、単純な場合を除いて使用しないことをお勧めします。この理由は次のとおりです。

  1. Bundle引数はAPIレベル8でのみ追加されたため、下位互換性のために採用することはできません。これは事実上、「onPrepareDialog」が状態の違いを非ローカル変数に依存する必要があることを意味します。

  2. 練習は、「onPrepareDialog」の本文で行われたダイアログの変更に応じて、動作が不十分で一貫性がないことを示します。

ダイアログが必要に応じてサブクラス化および作成されている場合、これらの問題は発生しません。必要に応じて、「setOwnerActivity」を呼び出すことができます。

于 2010-12-03T12:34:14.800 に答える
-3

まさに。で作成された AlertDialog の場合、役に立ちませBuilder.create()onPrepareDialog()。ビルダーは、ダイアログが作成されると更新できないという点で一方向です。大まかに言うことはできません。ビューのハンドルを取得してすべて手動で実行できると確信していますが、そもそもビルダーを使用するポイントが無効になります。

onCreateDialog()私が見つけた唯一の解決策は、、などを使用する代わりに、ダイアログを手動で作成/表示/閉じることでした。showDialog()呼び出してみremoveDialog()ましたが、うまくいかないようでした。

于 2009-10-26T07:52:46.330 に答える