Mai mult
Cum adaug un Fragment de la o Activitate cu o programatic conținutul creat de vedere
Vreau să adaug un Fragment de la o Activitate care implementează aspectul său programatic. M-am uitat peste Fragmentul de documentare, dar nu sunt't de multe exemple care descriu ceea ce am nevoie. Aici este tipul de cod am incercat sa scriu:
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;
}
}
Acest cod compilează, dar se blochează la pornire, probabil din cauza mea FragmentTransaction.adaugă()
este incorect. Ce este modul corect de a face acest lucru?
224
6
Se pare ca nu's mai mult de o problema cu acel cod. Un fragment nu poate fi declarat acest fel, în interiorul aceluiași fișier java ca activitate, dar nu ca un public clasă internă. Cadrul se așteaptă ca fragment's constructor (fără parametri) de a fi public și vizibil. Se deplasează fragmentul în Activitate ca o clasă internă, sau crearea unui nou fișier java pentru fragmentul stabilește că.
A doua problemă este că, atunci când te're adăugarea unui fragment de acest fel, trebuie să treacă o trimitere la fragmentul's conțin vedere, și acest punct de vedere trebuie să aibă un id personalizat. Folosind implicit id-ul se va prăbuși app. Aici's a actualizat de cod:
Aici este ceea ce mi-a venit după ce a citit Tony Wong's comentariu:
...
...
Kotlin
Dacă utilizați Kotlin asigurați-vă că pentru a lua o privire la ceea ce Kotlin extensiile de către Google a oferi sau scrie opinia ta.
main.xml
După ce a citit toate Raspunsurile am venit cu mod elegant:
practic tu nu't nevoie pentru a adăuga un frameLayout ca recipient de fragment în schimb, puteți adăuga direct fragmentul în root android recipient de Vedere
IMPORTANT: don't folosi înlocui fragment ca de cele mai multe abordări prezentate aici, dacă nu't mintea să-și piardă fragment variabilă exemplu de stat în timpul onrecreation proces.
utilizarea
Pentru API de nivel 17 sau mai mare,
View.generateViewId()
va rezolva această problemă. Utilitarul metodă oferă un id unic, care nu este utilizat în timp construi.