Solidny sposób na przekazanie wartości z Dialog do Activity na Androida?

To pytanie pojawiło się kilka razy i przeczytałem wszystkie odpowiedzi, ale nie widziałem naprawdę solidnego sposobu na to. W moim rozwiązaniu używam słuchaczy z połączeniaActivity doAlertDialog w ten sposób:

public class MyDialogFragment extends DialogFragment {

    public interface MyDialogFragmentListener {
        public void onReturnValue(String foo);
    }

    public void init(boolean someValue)
    {
        sSomeValue = someValue;
        listeners = new ArrayList<MyDialogFragmentListener>();
    }
    static boolean sSomeValue;
    private static ArrayList<MyDialogFragmentListener> listeners;

    public void addMyDialogFragmentListener(MyDialogFragmentListener l)
    {
        listeners.add(l);
    }

    public void removeMyDialogFragmentListener(MyDialogFragmentListener l)
    {
        listeners.remove(l);
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle(R.string.title)
           .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int id) {
                   for (MyDialogFragmentListener listener : listeners) {
                       listener.onReturnValue("some value");
                   }
               }
           })
           .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   // User cancelled the dialog
                   // Nothing to do but exit
               }
           });
        if (sSomeValue) {
            builder.setMessage(R.string.some_value_message);
        } else {
            builder.setMessage(R.string.not_some_value_message);
        }
        // Create the AlertDialog object and return it
        return builder.create();
    }
}

Potem w powołaniuActivity, Normalnie tworzę obiekt, przekazuję wszystkie argumentyinit i ustaw mojego słuchacza.

Oto problem: po obróceniu urządzenia i zmianie orientacji, gdy okno dialogowe jest otwarte, obaActivity iMyDialogFragment obiekty zostaną ponownie utworzone. Aby upewnić się, że wartości wejściowe nie zostaną zepsute, ustawiam moje zainicjowane wartości jakostatic. To jest dla mnie hacky, ale ponieważ w danym momencie będzie tylko jeden taki dialog, wszystko jest w porządku. Gdzie pojawia się problem, to wartość zwracana. Zostanie wywołany oryginalny słuchacz. To dobrze, ponieważ obiekt nadal istnieje, ale jeśli istnieje potrzeba aktualizacji interfejsu użytkownika na stronieActivity (który tam jest), nie zostanie zaktualizowany, ponieważNowy Activity instancja kontroluje teraz interfejs użytkownika.

Jedno rozwiązanie, które rozważam, to castinggetActivity() w klasie dialogowej do mojejActivity i zmuszanie samego okna dialogowego do dodania słuchacza, a nie do wywołaniaActivity Zrób to. Ale to po prostu przypomina śnieżne hacki.

Jaka jest najlepsza praktyka postępowania z wdziękiem?

questionAnswers(3)

yourAnswerToTheQuestion