Chcę dodać fragment do działania, które programowo implementuje jego układ. Przejrzałem dokumentację Fragmentu, ale nie ma wielu przykładów opisujących to, czego potrzebuję. Oto typ kodu, który próbowałem napisać:
public class DebugExampleTwo extends Activity {
private ExampleTwoFragment mFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FrameLayout frame = new FrameLayout(this);
if (savedInstanceState == null) {
mFragment = new ExampleTwoFragment();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(frame.getId(), mFragment).commit();
}
setContentView(frame);
}
}
...
public class ExampleTwoFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
Button button = new Button(getActivity());
button.setText("Hello There");
return button;
}
}
Ten kod kompiluje się, ale ulega awarii na początku, prawdopodobnie dlatego, że mój FragmentTransaction.add()
jest niepoprawny. Jaki jest właściwy sposób to zrobić?
źródło
ft.add(android.R.id.content, newFragment)
. Konieczne jest utworzenie niestandardowego układu i ustawienie jego identyfikatora, jeśli kontener fragmentu nie jest widokiem zawartości działania.Oto, co wymyśliłem po przeczytaniu komentarza Tony'ego Wonga :
...
...
Kotlin
Jeśli korzystasz z Kotlin, sprawdź, jakie rozszerzenia Google Kotlin oferują lub po prostu napisz własne.
źródło
if (savedInstanceState == null)
przed utworzeniem fragmentu lub po obróceniu ekranu będziesz mieć dwa fragmenty lub fragmenty zmieniające kolejność. W ogóle nie używajadd
metody! Tylkoreplace
. Albo będziesz miał dziwne zachowanie.backStackStateName
ciąg znaków jest czymś zdefiniowanym przez Ciebie.main.xml
źródło
Po przeczytaniu wszystkich odpowiedzi wymyśliłem elegancki sposób:
Zasadniczo nie musisz dodawać frameLayout jako kontenera swojego fragmentu, zamiast tego możesz dodać prosto fragment do katalogu głównego Androida Wyświetl kontener
WAŻNE: nie używaj zastępowania fragmentu, jak w większości pokazanych tutaj podejść, chyba że nie masz nic przeciwko utracie stanu instancji zmiennej fragmentu podczas procesu rekonstrukcji .
źródło
posługiwać się
źródło
W przypadku interfejsu API na poziomie 17 lub wyższym
View.generateViewId()
rozwiąże ten problem. Metoda narzędzia zapewnia unikalny identyfikator, który nie jest używany w czasie kompilacji.źródło
Aby dołączyć fragment do działania programowo w Kotlinie, możesz spojrzeć na następujący kod:
MainActivity.kt
Activity_main.xml
FragmentName.kt
Jeśli znasz rozszerzenia w Kotlin, możesz ulepszyć ten kod, postępując zgodnie z tym artykułem.
źródło