Надежный способ передать значение обратно из диалога в активность на Android?

Этот вопрос поднимался несколько раз, и япрочитал все ответы, но у меня нетЯ видел действительно надежный способ справиться с этим. В моем решении я использую слушателей от вызоваActivity кAlertDialog вот так:

public class MyDialogFragment extends DialogFragment {

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

    public void init(boolean someValue)
    {
        sSomeValue = someValue;
        listeners = new ArrayList();
    }
    static boolean sSomeValue;
    private static ArrayList 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();
    }
}

Тогда в призванииActivityЯ обычно создаю экземпляр объекта, передавая любые аргументы черезinit и установить мой слушатель.

Вот'Проблема заключается в том, что при вращении устройства и изменении ориентации при открытом диалоговом окнеActivity а такжеMyDialogFragment объекты восстанавливаются. Чтобы убедиться, что входные значения необлажаться, я устанавливаю свои начальные значения какstatic, Мне это кажется хакерским, но так как одновременно будет только один такой диалог, я согласен с этим. Проблема заключается в возвращаемом значении. Оригинальный слушатель будет вызван. Тот'Это нормально, потому что объект все еще существует, но если есть необходимость обновить пользовательский интерфейс наActivity (который есть), он выигралT обновляется, потому чтоновый Activity Экземпляр теперь контролирует пользовательский интерфейс.

Одним из решений, которое я рассматриваю, является кастингgetActivity() в диалоговом классе к моемуActivity и заставляя сам диалог добавить слушателя, вместо того, чтобы вызыватьActivity сделай это. Но это похоже на снежный ком хаков.

Какова лучшая практика для обработки этого изящно?

Ответы на вопрос(3)

Ваш ответ на вопрос