Mam pytanie dotyczące "właściwego programowania" w systemie Android.Podstawy Android Fragments: dlaczego? Czy to jest koncepcyjnie błędne?
Obecnie pracuję nad aplikacją przy użyciu fragmentów. Obejmuje dynamicznie dodawane fragmenty do działania, fragmenty zawyżone z XML, zagnieżdżone fragmenty z XML lub dynamicznie dodawane. Powiedzmy, trochę wszystkiego.
Pojęcie, na które koncentruje się to pytanie, to proces komunikacji z fragmentami. Tak, czytałem dokumenty i nie pierwszy raz próbuję używać fragmentów.
Zdrowy rozsądek (i docs) mówią, że jeśli Fragment chce mówić lub komunikować się z jego aktywnością, powinniśmy użyć interfejsu.
przykład:
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();
}
}
działanie testowe
public class Test implements TestFragmentInterface {
@Override
public void actionMethod() {
..
}
}
Wszystko tu dobrze.
Poprawia to ponowną użyteczność, ponieważ mój TestFragment w ten sposób może wchodzić w interakcję z dowolnym rodzajem Aktywności, biorąc pod uwagę, że Aktywność implementuje deklarowany przeze mnie interfejs.
Odwrotnie, działanie może wchodzić w interakcję z fragmentem, przytrzymując odnośnik i wywołując jego publiczne metody. Jest to również sugerowany sposób komunikacji fragmentacji z fragmentem, wykorzystujący działanie jako pomost.
To jest fajne, ale czasami wydaje się, że korzystanie z interfejsu jest po prostu trochę "za dużo".
Pytanie A
W scenariuszu fragmenty załączam mają dość skupiony rolę, co oznacza, że są wykonywane dla danej działalności i nie będą wykorzystywane w inny sposób, to jest koncepcyjnie źle ignorować realizacji interfejsu i po prostu zrób coś takiego, jak
((TestActivity) getActivity().myCustomMethod();
?
Dotyczy to również scenariusza, w którym (nie moja sprawa, ale po prostu potraktowanie go jako "w najgorszym"), moja działalność musi dotyczyć wielu różnych RÓŻNYCH fragmentów, co oznacza, że powinna wdrożyć jedną metodę dla każdego. fragment powinien obsłużyć. To sprawia, że kod staje się wielkim bałaganem "potencjalnie niepotrzebnych linii".
Idąc dalej: nadal za pomocą fragmentów "skupionych", których celem jest praca tylko w określony sposób, z wykorzystaniem zagnieżdżonych fragmentów?
Dodano je jak
public class TestFragment extends Fragment {
private void myTestMethod() {
NestedFragment nested = new NestedFragment();
getChildFragmentManager()
.beginTransaction()
.add(R.id.container, nested)
.commit();
}
}
ten wiąże NestedFragment do TestFragment. Powtarzam to raz, NestedFragment, podobnie jak TestFragment, ma być używany tylko w ten sposób, nie ma sensu pracować inaczej.
Wracając do pytania, jak mam się zachować w tej sytuacji?
Pytanie B
1) powinien zapewniać interfejs w NestedFragment i zrobić tak, że TestFragments realizuje NestedFragmentInterface? W tym przypadku chciałbym pełnić następujące
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) powinien (lub może) ignoruję interfejs i zadzwoń
getParentFragment().publicParentMethod();
?
3) należy utworzyć interfejs w NestedFragment, ale niech aktywnośćrealizuje go, tak że aktywnośćwezwie TestFragment?
Pytanie C
odniesieniu do koncepcji z wykorzystaniem aktywności jako pomostu pomiędzy fragmentami wierzę, to jest tak, dla prawidłowego cyklu obsługi wszystkich tych obiektów. Czy nadal jest możliwe wykonanie bezpośredniego fragmentu od fragmentu (za pomocą interfejsu lub bezpośrednie wywoływanie metod publicznych) podczas próby ręcznego obsługiwania wyjątku, który system może mi wyrzucić?
Sprawdź, czy to pomaga: https://corner.squareup.com/2014/10/advocating-against-android-fragments.html –
Przeczytałem opublikowany przez Ciebie link i chociaż był to rzeczywiście interesujący artykuł z Wiele informacji, obawiam się, że po prostu nie odpowiada na moje pytania. I tak dziękuję – FrancescoC