2012-02-09 6 views
29

Я использую фрагмент только внутри одной конкретной родительской активности. Теперь мне интересно, если есть какие-либо недостатки, если я вызываю методы в родительской активности непосредственно из включенного фрагмента, как это:.Вызов методов деятельности из фрагмента

getActivity() someMethodInParentActivitiy()

Более распространенным решением было бы определить интерфейс формального прослушивателя в фрагменте, чтобы вернуться к родительскому действию, а затем сделать действие реализацией этого интерфейса.

Существуют ли какие-либо причины (например, надежность или скорости), почему следует использовать второе более сложное решение, вместо непосредственного вызова методов из фрагмента с активностью?

ответ

21

Не смотрите на производительность в начале. Помните: «преждевременная оптимизация - это корень всего зла». Второй подход лучше, потому что ваш фрагмент можно использовать в разных действиях. Первый подход вводит больше зависимостей в ваш код, фрагмент зависит от типа активности. Вы теряете способность тестировать, повторно использовать, небольшой комплекс. Может показаться, что проще прямо сейчас, но в будущем вы увидите ;-)

+0

Спасибо, я также замечаю, что доступ к методу активности непосредственно через getActivity() не так просто. Возможно, мне нужен дополнительный бросок? – Anguel

+0

Да, к реализации, которая содержит 'someMethodInParentActivitiy()'. Но, как я писал, это не рекомендуется. – pawelzieba

+0

На самом деле я немного смутился, потому что Диана Хакборн заявляет, что использование таких вызовов методов в порядке: http://markmail.org/thread/sgvnc7bjtjfbh5rx#query:+page:1+mid:6kakhwquxdigf7om+state:results – Anguel

24

Дополнительная потребность произнесения быть сделано:

Activity activity123 = getActivity(); 

if(activity123 instanceof ParentActivity) { 
    ((ParentActivity) activity123).someMethodInParentActivity(); 
} 

однако, как @pawelzieba писал, если и хотят использовать этот фрагмент в других действиях, которые, вероятно, так не будут работать. Cheers

+0

хорошая работа ........ !!! –

9

Когда мне нужно сделать что-то подобное, я просто использую BroadcastReceiver, чтобы я мог его вызвать из любого места.

BroadcastReceiver receiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (action != null) { 
      if (action.equals("WHATEVER_ACTION")) { 
       // Do stuff 
      } 
     } 
    } 
}; 

Тогда в моем фрагменте я просто использовать:

activity.sendBroadcast (новый Intent() SetAction ("WHATEVER_ACTION").);

+1

Похож на лучшую практику для меня. Основной шаблон дизайна тоже. – rwst

+0

Нужно ли регистрировать вещатель в манифесте, чтобы использовать его только для связи между активностью и фрагментом? – Max

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