Android DialogFragment ve Dialog Karşılaştırması


244

Google , kullanarak DialogFragmentbasit yerine kullanılmamızı önerir , ancak basit bir Evet-Hayır onay mesajı kutusu için yalıtılmış bir yöntem kullanmak saçmadır . Bu durumda en iyi uygulama nedir?DialogFragments APIDialogFragment


5
Kısacası, diğer şeylerin yanı sıra, basit Dialogveya AlertDialog.Builder::create()::show()ekranı döndürdüğünüzde kaybolan bir iletişim kutusu oluşturur.
user1032613

Yanıtlar:


83

Evet, kullanın DialogFragmentve içinde Evet / Hayır onay düğmeleriyle onCreateDialogbasit bir oluşturmak için bir AlertDialog oluşturucuyu kullanabilirsiniz AlertDialog. Çok fazla kod yok.

Senin fragmanı olaylarını işleme Saygılarımızla bunu yapmanın çeşitli yolları var olacağını ama sadece bir ileti tanımlamak ile Handlerde benim Fragment, içine geçmesi DialogFragmentonun kurucusuna yoluyla ve daha sonra mesajları çeşitli tıklama olaylara approprirate olarak benim veridiliminin işleyicisi geri geçmektedir. Yine bunu yapmanın çeşitli yolları var ama aşağıdakiler benim için çalışıyor.

İletişim kutusunda bir iletiyi tutun ve yapıcıda başlatın:

private Message okMessage;
...
okMessage = handler.obtainMessage(MY_MSG_WHAT, MY_MSG_OK);

onClickListenerİletişim kutunuza uygulayın ve ardından işleyiciyi uygun şekilde arayın:

public void onClick(.....
    if (which == DialogInterface.BUTTON_POSITIVE) {
        final Message toSend = Message.obtain(okMessage);
        toSend.sendToTarget();
    }
 }

Düzenle

MessageParcelable olarak , onu kaydedip onSaveInstanceStategeri yükleyebilirsiniz

outState.putParcelable("okMessage", okMessage);

Daha sonra onCreate

if (savedInstanceState != null) {
    okMessage = savedInstanceState.getParcelable("okMessage");
}

4
Sorun okMessage değil - sorun targetbir Bundle yüklerseniz null olacak okMessage 's . İletinin hedefi null ise ve kullanırsanız sendToTarget, İletinin boş olduğu için değil, hedefi olduğu için bir NullPointerException elde edersiniz.
hrnt

2
Dialog yerine DialogFragment kullanmanın avantajları nelerdir?
Raphael Petegrosso

80
DialogFragment kullanmanın avantajı, iletişim kutusunun tüm yaşam döngüsünün sizin için ele alınmasıdır. Bir daha asla 'iletişim kutusu sızdırıldı ...' hatasını almayacaksınız. DialogFragment'a gidin ve Dialog'ları unutun.
Snicolas

6
Yapıcı aracılığıyla okMessage iletmek yerine setArguments () ve getArguments () kullanılması gerektiğini düşünüyorum.
pjv

1
Ben kullanıcı Builder oldukça kolay ve bu android ile aktivite yönetimi ele: configChanges = "locale | keyboardHidden | orientation | screenSize" ve ben uygulamalarda herhangi bir sorun görmüyorum ...
Renetik

67

YesNoDialog ve OkDialog gibi genel DialogFragment alt sınıfları oluşturabilir ve uygulamanızda çok fazla iletişim kutusu kullanıyorsanız başlık ve mesajı iletebilirsiniz.

public class YesNoDialog extends DialogFragment
{
    public static final String ARG_TITLE = "YesNoDialog.Title";
    public static final String ARG_MESSAGE = "YesNoDialog.Message";

    public YesNoDialog()
    {

    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        Bundle args = getArguments();
        String title = args.getString(ARG_TITLE);
        String message = args.getString(ARG_MESSAGE);

        return new AlertDialog.Builder(getActivity())
            .setTitle(title)
            .setMessage(message)
            .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which)
                {
                    getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, null);
                }
            })
            .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which)
                {
                    getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_CANCELED, null);
                }
            })
            .create();
    }
}

Ardından aşağıdakileri kullanarak arayın:

    DialogFragment dialog = new YesNoDialog();
    Bundle args = new Bundle();
    args.putString(YesNoDialog.ARG_TITLE, title);
    args.putString(YesNoDialog.ARG_MESSAGE, message);
    dialog.setArguments(args);
    dialog.setTargetFragment(this, YES_NO_CALL);
    dialog.show(getFragmentManager(), "tag");

Ve sonucu ele alın onActivityResult.


Evet, DialogFragment tüm yaşam döngüsü olaylarını sizin için işler.
ashishduh

1
Ben dönme sonra eski Dialog hala var ve eski var olmayan parçası (dialog.setTargetFragment (bu, YES_NO_CALL);) atama tutar çünkü bence öyle değil rotasyon getTargetFragment ().
OnActivityResult

7
nelerdir YES_NO_CALL, getFragmentManager()ve onActivityResult?
15'te msysmilu

2
YES_NO_CALListek kodu olan özel bir int'dir. getFragmentManager()etkinlik için parça yöneticisi alır ve onActivityResult()bir parça yaşam döngüsü geri arama yöntemidir.
ashishduh

3
GetFragmentManager () öğesini getSupportFragmentManager () ile değiştirin;
Avinash Verma

33

AlertDialog üzerinden DialogFragment kullanın:


  • API seviye 13'ün tanıtımından bu yana :

    showDialog Activity yöntem olup kullanımdan kaldırıldı . İletişim kutusunu kendiniz yönetmeniz gerekeceğinden, kodun başka bir yerinde bir iletişim kutusu çağırmanız önerilmez (örn. Yön değiştirme).

  • Fark İletişim KutusuFragman - AlertDialog

    Çok mu farklılar? DialogFragment ile ilgili Android referansından :

    DialogFragment, etkinlik penceresinin üstünde yüzen bir iletişim penceresi görüntüleyen bir parçadır. Bu parça, parçanın durumuna göre uygun şekilde görüntülenen bir Dialog nesnesi içerir. İletişim kutusunun kontrolü (ne zaman gösterileceğini, gizleneceğini, kapatılacağını belirleyen) , iletişim kutusundaki doğrudan çağrılarla değil, burada API aracılığıyla yapılmalıdır .

  • Diğer notlar

    • Parçalar, farklı ekran boyutlarına sahip cihazların çeşitliliği nedeniyle Android çerçevesinde doğal bir evrimdir.
    • DialogFragments ve Fragments, sınıfın mevcut tüm Android sürümlerinde kullanılabilir olmasını sağlayan destek kitaplığında bulunur.

28

Kullanmanızı tavsiye ederim DialogFragment .

Elbette, onunla bir "Evet / Hayır" iletişim kutusu oluşturmak oldukça basit bir iş olması gerektiği göz önüne alındığında oldukça karmaşıktır, ancak Dialog da şaşırtıcı derecede karmaşıktır.

(Etkinlik yaşam döngüsü karmaşık hale getirir - Activityiletişim kutusunun yaşam döngüsünü yönetmenize izin vermelisiniz - ve özel parametreleri, örneğin özel iletiyiActivity.showDialog 8'den küçük API düzeylerini kullanıyorsanız )

Güzel olan şey, genellikle kendi soyutunuzu DialogFragmentkolayca oluşturabilmenizdir.


Uyarı iletişim kutusu geri çağrılarını nasıl ele alacaksınız (evet, hayır)?
Alexey Zakharov

En kolay yol, barındırma etkinliğinde bir Stringparametre alan bir yöntem uygulamak olacaktır . Örneğin kullanıcı "Evet" i tıkladığında, iletişim kutusu Aktivitenin yöntemini "kabul" parametresiyle çağırır. İletişim kutusu gösterilirken bu parametreler belirtilir, örneğin AskDialog.ask ("Bu şartları kabul ediyor musunuz?", "Kabul ediyorum", "katılmıyorum");
11:54

5
Ama aktivite içinde değil, parça içinde geri aramaya ihtiyacım var. SetTargetFragment'ı kullanabilir ve arayüze atabilirim. Ama cehennem.
Alexey Zakharov

Ayrıca, hedefe bir etiket ayarlayıp FragmentManager's' ı kullanarak hedef parçasını getirebilirsiniz findFragmentByTag. Ama evet, biraz kod gerektiriyor.
09:53

@AlexeyZakharov ben bu geç 5 yıl ile ilgili olduğunu biliyorum ama sen geçebileceği Fragment this ve sizin sahip Activity extendsŞu Verilerinizi Interface. Gerçi iş parçacığına dikkat edin, eşzamanlılığınız kontrol altında değilse, mutlaka istemediğinizde arayüz çağrılarını patlatabilirsiniz. Ama bunun bellek ve dairesel bağımlılık spagetti ile ne yaptığından emin değilim, başka biri chime ister misiniz? Diğer seçenek Message/ Handlerancak yine de eşzamanlılık sorunlarınız olabilir.
tricknology

8

Oluşturucu Desenli Genel AlertDialogFragment

Projemde, ben zaten kullanılan AlertDialog.Builderzaten çok ben sorunlu olduğunu öğrendim önce. Ancak, benim app herhangi bir yerinde bu kadar kod değiştirmek istemiyordu. Buna ek olarak, aslında OnClickListenersanonim sınıflar olarak ihtiyaç duyuldukları yerlerde (yani, kullanırken setPositiveButton(),setNegativeButton() bir iletişim kutusu parçası ve tutucu parçası arasında iletişim kurmak için binlerce geri çağırma yöntemi uygulamak zorunda vb.) Bence çok kafa karıştırıcı ve karmaşık bir kod ortaya çıkıyor. Özellikle, bir parçada birden fazla farklı diyalogunuz varsa ve o anda hangi diyalogun gösterildiği geri arama uygulamalarında ayrım yapmanız gerekiyorsa.

Bu nedenle, tam olarak aşağıdaki gibiAlertDialogFragment kullanılabilecek genel bir yardımcı sınıf oluşturmak için farklı yaklaşımları birleştirdim : AlertDialog


ÇÖZÜM

( LÜTFEN kodumda Java 8 lambda ifadeleri kullandığımı unutmayın, bu yüzden henüz lambda ifadeleri kullanmıyorsanız kodun bölümlerini değiştirmeniz gerekebilir .)

/**
 * Helper class for dialog fragments to show a {@link AlertDialog}. It can be used almost exactly
 * like a {@link AlertDialog.Builder}
 * <p />
 * Creation Date: 22.03.16
 *
 * @author felix, http://flx-apps.com/
 */
public class AlertDialogFragment extends DialogFragment {
    protected FragmentActivity activity;
    protected Bundle args;
    protected String tag = AlertDialogFragment.class.getSimpleName();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        activity = getActivity();
        args = getArguments();
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = setDialogDefaults(new AlertDialog.Builder(getActivity())).create();

        if (args.containsKey("gravity")) {
            dialog.getWindow().getAttributes().gravity = args.getInt("gravity");
        }

        dialog.setOnShowListener(d -> {
            if (dialog != null && dialog.findViewById((android.R.id.message)) != null) {
                ((TextView) dialog.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());
            }
        });
        return dialog;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);

        if (args.containsKey("onDismissListener")) {
            Parcelable onDismissListener = args.getParcelable("onDismissListener");
            if (onDismissListener != null && onDismissListener instanceof ParcelableOnDismissListener) {
                ((ParcelableOnDismissListener) onDismissListener).onDismiss(this);
            }
        }
    }

    /**
     * Sets default dialog properties by arguments which were set using {@link #builder(FragmentActivity)}
     */
    protected AlertDialog.Builder setDialogDefaults(AlertDialog.Builder builder) {
        args = getArguments();
        activity = getActivity();

        if (args.containsKey("title")) {
            builder.setTitle(args.getCharSequence("title"));
        }

        if (args.containsKey("message")) {
            CharSequence message = args.getCharSequence("message");
            builder.setMessage(message);
        }

        if (args.containsKey("viewId")) {
            builder.setView(getActivity().getLayoutInflater().inflate(args.getInt("viewId"), null));
        }

        if (args.containsKey("positiveButtonText")) {
            builder.setPositiveButton(args.getCharSequence("positiveButtonText"), (dialog, which) -> {
                onButtonClicked("positiveButtonListener", which);
            });
        }

        if (args.containsKey("negativeButtonText")) {
            builder.setNegativeButton(args.getCharSequence("negativeButtonText"), (dialog, which) -> {
                onButtonClicked("negativeButtonListener", which);
            });
        }

        if (args.containsKey("neutralButtonText")) {
            builder.setNeutralButton(args.getCharSequence("neutralButtonText"), (dialog, which) -> {
                onButtonClicked("neutralButtonListener", which);
            });
        }

        if (args.containsKey("items")) {
            builder.setItems(args.getStringArray("items"), (dialog, which) -> {
                onButtonClicked("itemClickListener", which);
            });
        }

        // @formatter:off
        // FIXME this a pretty hacky workaround: we don't want to show the dialog if onClickListener of one of the dialog's button click listener were lost
        //       the problem is, that there is no (known) solution for parceling a OnClickListener in the long term (only for state changes like orientation change,
        //       but not if the Activity was completely lost)
        if (
                (args.getParcelable("positiveButtonListener") != null && !(args.getParcelable("positiveButtonListener") instanceof ParcelableOnClickListener)) ||
                (args.getParcelable("negativeButtonListener") != null && !(args.getParcelable("negativeButtonListener") instanceof ParcelableOnClickListener)) ||
                (args.getParcelable("neutralButtonListener") != null && !(args.getParcelable("neutralButtonListener") instanceof ParcelableOnClickListener)) ||
                (args.getParcelable("itemClickListener") != null && !(args.getParcelable("itemClickListener") instanceof ParcelableOnClickListener))
        ) {
            new DebugMessage("Forgot onClickListener. Needs to be dismissed.")
                    .logLevel(DebugMessage.LogLevel.VERBOSE)
                    .show();
            try {
                dismissAllowingStateLoss();
            } catch (NullPointerException | IllegalStateException ignored) {}
        }
        // @formatter:on

        return builder;
    }

    public interface OnDismissListener {
        void onDismiss(AlertDialogFragment dialogFragment);
    }

    public interface OnClickListener {
        void onClick(AlertDialogFragment dialogFragment, int which);
    }

    protected void onButtonClicked(String buttonKey, int which) {
        ParcelableOnClickListener parcelableOnClickListener = getArguments().getParcelable(buttonKey);
        if (parcelableOnClickListener != null) {
            parcelableOnClickListener.onClick(this, which);
        }
    }

    // region Convenience Builder Pattern class almost similar to AlertDialog.Builder
    // =============================================================================================

    public AlertDialogFragment builder(FragmentActivity activity) {
        this.activity = activity;
        this.args = new Bundle();
        return this;
    }

    public AlertDialogFragment addArguments(Bundle bundle) {
        args.putAll(bundle);
        return this;
    }

    public AlertDialogFragment setTitle(int titleStringId) {
        return setTitle(activity.getString(titleStringId));
    }

    public AlertDialogFragment setTitle(CharSequence title) {
        args.putCharSequence("title", title);
        return this;
    }

    public AlertDialogFragment setMessage(int messageStringId) {
        return setMessage(activity.getString(messageStringId));
    }

    public AlertDialogFragment setMessage(CharSequence message) {
        args.putCharSequence("message", message);
        return this;
    }

    public AlertDialogFragment setPositiveButton(int textStringId, OnClickListener onClickListener) {
        return setPositiveButton(activity.getString(textStringId), onClickListener);
    }

    public AlertDialogFragment setPositiveButton(CharSequence text, AlertDialogFragment.OnClickListener onClickListener) {
        args.putCharSequence("positiveButtonText", text);
        args.putParcelable("positiveButtonListener", createParcelableOnClickListener(onClickListener));
        return this;
    }

    public AlertDialogFragment setNegativeButton(int textStringId, AlertDialogFragment.OnClickListener onClickListener) {
        return setNegativeButton(activity.getString(textStringId), onClickListener);
    }

    public AlertDialogFragment setNegativeButton(CharSequence text, AlertDialogFragment.OnClickListener onClickListener) {
        args.putCharSequence("negativeButtonText", text);
        args.putParcelable("negativeButtonListener", createParcelableOnClickListener(onClickListener));
        return this;
    }

    public AlertDialogFragment setNeutralButton(int textStringId, AlertDialogFragment.OnClickListener onClickListener) {
        return setNeutralButton(activity.getString(textStringId), onClickListener);
    }

    public AlertDialogFragment setNeutralButton(CharSequence text, AlertDialogFragment.OnClickListener onClickListener) {
        args.putCharSequence("neutralButtonText", text);
        args.putParcelable("neutralButtonListener", createParcelableOnClickListener(onClickListener));
        return this;
    }

    public AlertDialogFragment setOnDismissListener(OnDismissListener onDismissListener) {
        if (onDismissListener == null) {
            return this;
        }

        Parcelable p = new ParcelableOnDismissListener() {
            @Override
            public void onDismiss(AlertDialogFragment dialogFragment) {
                onDismissListener.onDismiss(dialogFragment);
            }
        };
        args.putParcelable("onDismissListener", p);
        return this;
    }

    public AlertDialogFragment setItems(String[] items, AlertDialogFragment.OnClickListener onClickListener) {
        args.putStringArray("items", items);
        args.putParcelable("itemClickListener", createParcelableOnClickListener(onClickListener));
        return this;
    }

    public AlertDialogFragment setView(int viewId) {
        args.putInt("viewId", viewId);
        return this;
    }

    public AlertDialogFragment setGravity(int gravity) {
        args.putInt("gravity", gravity);
        return this;
    }

    public AlertDialogFragment setTag(String tag) {
        this.tag = tag;
        return this;
    }

    public AlertDialogFragment create() {
        setArguments(args);
        return AlertDialogFragment.this;
    }

    public AlertDialogFragment show() {
        create();
        try {
            super.show(activity.getSupportFragmentManager(), tag);
        }
        catch (IllegalStateException e1) {

            /**
             * this whole part is used in order to attempt to show the dialog if an
             * {@link IllegalStateException} was thrown (it's kinda comparable to
             * {@link FragmentTransaction#commitAllowingStateLoss()} 
             * So you can remove all those dirty hacks if you are sure that you are always
             * properly showing dialogs in the right moments
             */

            new DebugMessage("got IllegalStateException attempting to show dialog. trying to hack around.")
                    .logLevel(DebugMessage.LogLevel.WARN)
                    .exception(e1)
                    .show();

            try {
                Field mShownByMe = DialogFragment.class.getDeclaredField("mShownByMe");
                mShownByMe.setAccessible(true);
                mShownByMe.set(this, true);
                Field mDismissed = DialogFragment.class.getDeclaredField("mDismissed");
                mDismissed.setAccessible(true);
                mDismissed.set(this, false);
            }
            catch (Exception e2) {
                new DebugMessage("error while showing dialog")
                        .exception(e2)
                        .logLevel(DebugMessage.LogLevel.ERROR)
                        .show();
            }
            FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
            transaction.add(this, tag);
            transaction.commitAllowingStateLoss(); // FIXME hacky and unpredictable workaround
        }
        return AlertDialogFragment.this;
    }

    @Override
    public int show(FragmentTransaction transaction, String tag) {
        throw new NoSuchMethodError("Please use AlertDialogFragment.show()!");
    }

    @Override
    public void show(FragmentManager manager, String tag) {
        throw new NoSuchMethodError("Please use AlertDialogFragment.show()!");
    }

    protected ParcelableOnClickListener createParcelableOnClickListener(AlertDialogFragment.OnClickListener onClickListener) {
        if (onClickListener == null) {
            return null;
        }

        return new ParcelableOnClickListener() {
            @Override
            public void onClick(AlertDialogFragment dialogFragment, int which) {
                onClickListener.onClick(dialogFragment, which);
            }
        };
    }

    /**
     * Parcelable OnClickListener (can be remembered on screen rotation)
     */
    public abstract static class ParcelableOnClickListener extends ResultReceiver implements AlertDialogFragment.OnClickListener {
        public static final Creator<ResultReceiver> CREATOR = ResultReceiver.CREATOR;

        ParcelableOnClickListener() {
            super(null);
        }

        @Override
        public abstract void onClick(AlertDialogFragment dialogFragment, int which);
    }

    /**
     * Parcelable OnDismissListener (can be remembered on screen rotation)
     */
    public abstract static class ParcelableOnDismissListener extends ResultReceiver implements AlertDialogFragment.OnDismissListener {
        public static final Creator<ResultReceiver> CREATOR = ResultReceiver.CREATOR;

        ParcelableOnDismissListener() {
            super(null);
        }

        @Override
        public abstract void onDismiss(AlertDialogFragment dialogFragment);
    }


    // =============================================================================================
    // endregion
}

KULLANIM

// showing a normal alert dialog with state loss on configuration changes (like device rotation)
new AlertDialog.Builder(getActivity())
        .setTitle("Are you sure? (1)")
        .setMessage("Do you really want to do this?")
        .setPositiveButton("Yes", (dialog, which) -> Toast.makeText(getContext(), "Yes clicked", Toast.LENGTH_SHORT).show())
        .setNegativeButton("Cancel", null)
        .show();

// showing a dialog fragment using the helper class with no state loss on configuration changes
new AlertDialogFragment.builder(getActivity())
        .setTitle("Are you sure? (2)")
        .setMessage("Do you really want to do this?")
        .setPositiveButton("Yes", (dialog, which) -> Toast.makeText(getContext(), "Yes clicked", Toast.LENGTH_SHORT).show())
        .setNegativeButton("Cancel", null)
        .show();

Bunu sadece çözümümü paylaşmak için değil, aynı zamanda sizden insanlardan sizin fikrinizi sormak istediğim için de gönderiyorum: Bu yaklaşım yasal mı yoksa bir dereceye kadar sorunlu mu?


3
Bu çok ilginç bir fikir, ancak API tasarımının işe yaradığını düşünmüyorum. SetPositiveButton () öğesine bir OnClickListener iletirseniz, aygıt döndürüldüğünde ve parça Bundle bağımsız değişkenlerinden yeniden oluşturulduğunda, OnClickListeners Parcelable öğesinden düzgün bir şekilde yeniden oluşturulmaz. Temel sorun, döndürme sırasında bir dinleyiciyi yeniden oluşturamamanızdır, ancak API arabirimi (arayüzleri alır) talep eder. Keşke durum böyle olmasaydı (fikri sevdiğim gibi).
Xargs

1
Güzel fikir, ama @Xargs'ın dediği gibi, işe yaramıyor. Aktarılan dinleyiciler dönüşte doğru şekilde yeniden oluşturulmaz.
Graham Borland

Sonuçlarım aslında rotasyon ve uygulamaya devam etme (örneğin ana ekrana gittikten sonra) üzerinde çalışıyor, ancak etkinlik tamamen yok edildikten sonra geri yüklendiğinde değil (OnClickListeners gerçekten kaybolur). (Android 4.4.4 ve Android
5.1.1'de

Bu tam uygulamayı test etmedim, ancak test ettiğimden, bir parça paketine geçirilen parcelable dinleyici yeniden oluşturma sırasında doğru şekilde çağrıldı. Neden olduğu hakkında hiçbir fikrim yok ama işe yarıyor gibi görünüyor.
Saad Farooq

@flxapps, özel görünüm durumunda, çocuk görünümlerini nasıl alabilir ve özelliklerini değiştirebilir veya dinleyici uygulayabilirsiniz? Sınıfınızda herhangi bir iletişim kutusu örneği döndürmüyorsunuz ve birisi çocuk görüntülemeye çalışacaksa bir istisnaya neden olabilir
Zubair Rehman

5

@ Ashishduh'un cevabını biraz basitleştirebilir miyim:

public class AlertDialogFragment extends DialogFragment {
public static final String ARG_TITLE = "AlertDialog.Title";
public static final String ARG_MESSAGE = "AlertDialog.Message";

public static void showAlert(String title, String message, Fragment targetFragment) {
    DialogFragment dialog = new AlertDialogFragment();
    Bundle args = new Bundle();
    args.putString(ARG_TITLE, title);
    args.putString(ARG_MESSAGE, message);
    dialog.setArguments(args);
    dialog.setTargetFragment(targetFragment, 0);
    dialog.show(targetFragment.getFragmentManager(), "tag");
}

public AlertDialogFragment() {}

@NonNull
@Override
public AlertDialog onCreateDialog(Bundle savedInstanceState)
{
    Bundle args = getArguments();
    String title = args.getString(ARG_TITLE, "");
    String message = args.getString(ARG_MESSAGE, "");

    return new AlertDialog.Builder(getActivity())
            .setTitle(title)
            .setMessage(message)
            .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which)
                {
                    getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, null);
                }
            })
            .create();
}

Kullanıcının (sınıfın) bileşenin iç bileşenlerine aşina olması ihtiyacını ortadan kaldırır ve kullanımı gerçekten basitleştirir:

AlertDialogFragment.showAlert(title, message, this);

PS Benim durumumda basit bir uyarı iletişim kutusuna ihtiyacım vardı, bu yüzden yarattığım şey bu. Yaklaşımı bir Evet / Hayır veya ihtiyacınız olan diğer herhangi bir türe uygulayabilirsiniz.


1

Basit evet veya hayır iletişim kutuları için İletişim Kutusunu kullanın.

Oncreate, istek izinleri, herhangi bir yaşam döngüsü geçersiz kılma gibi yaşam döngüsünü tutmanız gereken daha karmaşık görünümlere ihtiyacınız olduğunda bir iletişim parçası kullanacağım. Böylece iletişim kutusunun çalışması için gerekli olan izinleri ve diğer kodları çağrı etkinliğiyle iletişim kurmadan ayırırsınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.