سؤال

أريد أن أظهر alertdialog مع خيار واحد قد يتغير في كل طلب. لذلك على سبيل المثال في وقت واحد، أريد إظهار الخيار "أضف إلى جهات الاتصال" أثناء وقت آخر يجب أن يكون "إزالة من جهات الاتصال".

لا يعمل التعليمات البرمجية الخاصة بي في المرة الأولى، ولكن يبدو أن الروبوت ذاكرة التخزين المؤقتة 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();
}
هل كانت مفيدة؟

المحلول

يمكنك أيضا استخدام cilletialog (int) وظيفة النشاط. عند رفض مربع حوار، يتخزن النشاط أساسا حالة مربع الحوار (لأسباب الأداء التي أتخيلها). دعا cilletialog (int) في مربع الحوار يجبر النشاط على تفريغ جميع المراجع عن مربع الحوار ويرفضها من الشاشة إذا تم عرضها.

إنشاء حوار
النشاط # ciltialog (int)

نصائح أخرى

إلقاء نظرة على 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;
  }
}

هذا هو Dup من هذا السؤال:Android: لا يمكن تغيير النص يظهر في AlertDialog

يمكنك أيضا القيام بذلك بهذه الطريقة:http://andmobidev.blogspot.com/0/0/modifying-alert-dialogs-list-items.html.

يبدو أن تبطئ عرض قائمة Longpress على الرغم من ...

أعتقد أن لدي إصلاح للسلوك غير المتناقش المذكور أعلاه. عند إنشاء مربع الحوار في البداية (عندما لا يزال alertdialog.builder)، يجب عليك تعيين الرسالة إلى حالة أولية (غير فارغة) أو لن يقوم OnPreparedIalog بالكتابة فوقها بالقيمة المقصودة. لذلك عند إنشاء مربع الحوار، قم بعمل شيء مثل هذا دائما له قيمة غير فارغة في الرسالة. كافحت مع هذا لعدة أيام ووجدت هذا الحل عن طريق الصدفة:

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

if ( message == null ) {
    resultAlert.setMessage("");
} else {
    resultAlert.setMessage(message);
}

أنا أفهم أسباب الأداء لاستخدام مربعات الحوار المدارة للنشاط، ولكنها نوصي أنها لا تستخدم باستثناء الحالات البسيطة. أسباب ذلك:

  1. تمت إضافة حجة الحزمة فقط في API المستوى 8، لذلك لا يمكن اعتماده للتوافق مع الوراء. هذا يعني بشكل فعال أن "OnPreparedialog" يجب الاعتماد على المتغيرات غير المحلية للاختلافات الدولة؛

  2. تشير الممارسة إلى السلوك الفقراء وغير المتسابق استجابة لأي تغييرات حوار مصنوعة في جسم "OnPreparedialog".

لا تنشأ أي من هذه الصعوبات إذا كانت مربعات الحوارات مصفحة وخلق حسب الحاجة. يمكن استدعاء "SetOwneractivity" إذا لزم الأمر.

عندما يكون لديك مربع حوار مخصص، يمكنك تغيير عناصر مخصصة باستخدام 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" />

وحصلت على فكرة ولكن ليس جيدا. *يستخدم هذا عندما لا يستخدم المستخدمون الحوار في كثير من الأحيان!* الحل: أولا، يجب أن تعلن متغير (نوع int) وإجراء القيمة الافتراضية كما 0.Such كما private int i=0;وقبل استخدام طرق نشاط ShowDialog للنشاط، قم بزيادة المتغير INT I ونشر القيمة التي أقيمتها مع المعلمة كطريقة ShowDialog. قد يعجبك القانون هذا

private int i=0;

//before you show the dialog
this.i++;
this.showDialog(this.i);

بالضبط. بالنسبة إلى Alertdialog، تم إنشاء W / Builder.create(), onPrepareDialog() لا طائل منه. Builder هو اتجاه واحد في ذلك بمجرد إنشاء مربع الحوار، لا يمكنك التحديث. أعني أنه لا يمكنني فضفاضة، أنا متأكد من أنك يمكن أن تحصل على مقبض للعرض والقيام بكل ذلك يدويا، ولكن هذا يهزم نقطة استخدام البناء في المقام الأول.

الحل الوحيد الذي وجدته هو إنشاء / إظهار / إظهار / إظهار / استبداله يدويا بدلا من استخدام onCreateDialog(), showDialog(), ، وما إلى ذلك حاولت الاتصال removeDialog(), ، ولكن هذا لا يبدو أن العمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top