Ho una domanda sulla "programmazione corretta" in Android.Fondamenti di Android Fragments: perché? Questo è concettualmente sbagliato?
Attualmente sto sviluppando un'applicazione utilizzando frammenti. Include i frammenti dinamicamente aggiunti a Attività, i frammenti gonfiati da XML, i frammenti nidificati da XML o aggiunti dinamicamente. Diciamo solo un po 'di tutto.
Il concetto su cui si concentra questa domanda è il processo di comunicazione coinvolto con i frammenti. Quindi, ho letto i documenti e questa non è la prima volta che provo a usare i frammenti.
Il buon senso (e i documenti) dicono che se un frammento vuole parlare o comunicare con la sua attività, dovremmo usare un'interfaccia.
Esempio:
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() {
..
}
}
Tutto bene qui.
Ciò migliora la riutilizzabilità, poiché il mio TestFragment in questo modo può interagire con qualsiasi tipo di attività, data l'attività implementa l'interfaccia che dichiaro.
Al contrario, l'attività può interagire con il frammento tenendo un riferimento e chiamando i suoi metodi pubblici. Questo è anche il modo suggerito per la comunicazione frammento-frammento, usando l'attività come un ponte.
Questo è bello, ma a volte è come se l'uso di un'interfaccia fosse un po '"troppo".
Domanda A
Nello scenario frammenti ho collegare avere un ruolo abbastanza concentrata, nel senso che sono fatto per quella particolare attività e non sarebbero stati utilizzati in caso contrario, è concettualmente sbagliato ignorare l'implementazione dell'interfaccia e basta fare qualcosa come
((TestActivity) getActivity().myCustomMethod();
?
Questo vale anche per lo scenario in cui (non è il mio caso, ma lo considero come "al massimo") la mia attività ha a che fare con un'ampia varietà di questi DIVERSI frammenti, il che significa che dovrebbe implementare un metodo per ogni frammento che dovrebbe gestire. Ciò porta il codice a un gran casino di "linee potenzialmente non necessarie".
Andando avanti: ancora con l'uso di frammenti "mirati", mirati a lavorare solo in un certo modo, che cosa è con l'uso di frammenti annidati?
li aggiunse come
public class TestFragment extends Fragment {
private void myTestMethod() {
NestedFragment nested = new NestedFragment();
getChildFragmentManager()
.beginTransaction()
.add(R.id.container, nested)
.commit();
}
}
questo si lega NestedFragment a TestFragment. Lo ripeto, NestedFragment, proprio come TestFragment, deve essere usato solo in questo modo, non ha alcun significato per funzionare diversamente.
Torna alla domanda, come dovrei comportarmi in questa situazione?
Domanda B
1) dovrei fornire un'interfaccia in NestedFragment, e fare in modo che TestFragments implementa NestedFragmentInterface? In questo caso vorrei agire come segue
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) dovrebbe (o potrebbe) ignoro l'interfaccia, e basta chiamare
getParentFragment().publicParentMethod();
?
3) dovrei creare l'interfaccia in NestedFragment, ma lasciare che il attività lo implementa, in modo che l'attività di chiamerà TestFragment?
Domanda C
Per quanto riguarda l'idea di utilizzare l'attività come un ponte tra i frammenti, credo che sia fatto in modo per la gestione corretta del ciclo di vita di tutti questi oggetti. È ancora possibile fare un frammento diretto al frammento (usando l'interfaccia o chiamare direttamente metodi pubblici) mentre si cerca di gestire manualmente l'eccezione che il sistema potrebbe lanciare?
Vedere se questo aiuta: https://corner.squareup.com/2014/10/advocating-against-android-fragments.html –
Ho letto il collegamento che hai postato, e mentre era davvero un articolo interessante con molte informazioni, temo che non risponda alle mie domande. Grazie comunque – FrancescoC