У меня есть вопрос о "правильном программировании" в Android.
В настоящее время я разрабатываю приложение, используя фрагменты. Он включает в себя динамически добавленные фрагменты для Activity, фрагменты, завышенные от XML, вложенные фрагменты из XML или динамически добавленные. Скажем, немного всего.
Концепция, на которой этот вопрос фокусируется, - это процесс коммуникации, связанный с фрагментами. Итак, я прочитал документы, и я не первый раз пытаюсь использовать фрагменты.
Здравый смысл (и документы) говорят, что если Фрагмент хочет говорить или общаться с ним, мы должны использовать интерфейс.
Пример:
TestFragment
public class TestFragment extends Fragment {
private TestFragmentInterface listener;
public interface TestFragmentInterface {
void actionMethod();
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
if (getActivity() instanceof TestFragmentInterface) {
listener = (TestFragmentInterface) getActivity();
}
// sending the event
if (listener != null) listener.actionMethod();
}
}
TestActivity
public class Test implements TestFragmentInterface {
@Override
public void actionMethod() {
..
}
}
Здесь все прекрасно.
Это улучшает повторное использование, так как мой TestFragment таким образом может взаимодействовать с любым видом Activity, поскольку Activity реализует интерфейс, который я объявляю.
Другой способ: активность может взаимодействовать с фрагментом, удерживая ссылку и вызывая ее общедоступные методы. Это также предложенный способ обмена фрагментарно-фрагментацией с использованием Activity как моста.
Это классно, но иногда кажется, что использование интерфейса для этого немного "слишком много".
Вопрос A
В сценарии фрагменты, которые я прикрепляю, имеют довольно целенаправленную роль, то есть они выполняются для этого конкретного действия и не будут использоваться иначе, концептуально неправильно игнорировать реализацию интерфейса и просто делать что-то вроде
((TestActivity) getActivity().myCustomMethod();
?
Это также относится к сценарию, где (не в моем случае, но просто принимая его как "в худшем случае" ), моя деятельность должна иметь дело с широким спектром этих РАЗЛИЧНЫХ фрагментов, то есть он должен реализовывать один метод для каждого фрагмента он должен справиться. Это приводит код к большому беспорядку "потенциально не необходимых строк".
Двигаемся дальше: все еще с использованием "сфокусированных" фрагментов, направленных на то, чтобы работать только определенным образом, что такое использование вложенных фрагментов?
Добавлено их как
public class TestFragment extends Fragment {
private void myTestMethod() {
NestedFragment nested = new NestedFragment();
getChildFragmentManager()
.beginTransaction()
.add(R.id.container, nested)
.commit();
}
}
это связывает NestedFragment с TestFragment. Я говорю это снова, NestedFragment, как и TestFragment, должен использоваться только таким образом, у него нет смысла работать иначе.
Вернемся к вопросу, как я должен себя вести в этой ситуации?
Вопрос B
1) должен ли я предоставить интерфейс в NestedFragment и сделать так, чтобы TestFragments реализовывал NestedFragmentInterface? В этом случае я буду действовать следующим образом
NestedFragment
public class NestedFragment extends Fragment {
private NestedFragmentInterface listener;
public interface NestedFragmentInterface {
void actionMethodNested();
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
if (getParentFragment() instanceof NestedFragmentInterface) {
listener = (NestedFragmentInterface) getParentFragment();
}
// sending the event
if (listener != null) listener.actionMethodNested();
}
}
2) должен (или мог) игнорировать интерфейс и просто вызывать
getParentFragment().publicParentMethod();
?
3) должен ли я создать интерфейс в NestedFragment, но пусть активность реализует его, чтобы активность вызывала TestFragment?
Вопрос C
Что касается идеи использования Activity как моста между фрагментами, я считаю, что это сделано для правильного управления жизненным циклом всех этих объектов. Сохраняется ли возможность делать прямой фрагмент-фрагмент (используя интерфейс или напрямую вызывать общедоступные методы), пытаясь вручную обработать исключение, которое система может выбросить меня?