2014-01-27 3 views
2

Я использовал DialogFragment для обработки диалоговых окон в приложении.Каков наилучший способ обработки обратных вызовов DialogFragment?

Я прочитал this, который дает несколько примеров о том, как использовать его, но он всегда использует такие вещи, как:

((FragmentAlertDialog)getActivity()).doPositiveClick(); 
((FragmentAlertDialog)getActivity()).doNegativeClick(); 

Я не очень нравится такой реализации, как это обязывает слепок к предварительно -known Activity, поэтому он не очень надежный.

Я также знаю, что передачи и хранение обратного вызова внутри FragmentDialog не является хорошим вариантом, потому что, если он ссылается на активности, после поворота, например, что активность могла быть уничтожена ... и обратный вызов не обновлено.

Также обновление обратного вызова, когда активность проходит onResume, также не очень жизнеспособный вариант, так как он должен был знать, какой диалог отображается и установить обратный вызов, связанный с ним, что делает логику немного сложной в более крупных приложениях.

Какую реализацию вы предлагаете избегать приведения при сохранении всегда самого последнего обратного вызова?

ответ

1

Вы указали причины, по которым обратные вызовы нельзя использовать, очень красноречиво. К сожалению, я считаю, что актерский состав (или нечто подобное) неизбежно. Честно говоря, вся парадигма довольно неудобна.

Вы можете использовать интерфейс, если вы планируете разделить фрагмент диалога между несколькими действиями.

((IXyzDialogHost)GetActivity())->onSomethingHappened() 

Что-то, что можно сказать о таком подходе, я полагаю. Я не могу сказать, что сам использовал этот подход лично, но, думая об этом, у меня может возникнуть соблазн сделать это. По крайней мере, вы можете обеспечить соблюдение договора о вызывающей деятельности с соответствующим статическим методом DialogFragment.Create, которая занимается установкой расслоения фрагмент менеджера транзакций и другими неприятностями:

class XyzDialogFragment { 
    { 
     public static DialogFragment Create(IXyzDialogHost activity, ...) 
     { 
      ... 
     } 

    } 

Но есть еще слепок.

Смежные вопросы