Hinzufügen von Fragmenten zu einem layout
Ich versuche, meine app mehr tablet-freundlich, und so bin ich versucht zu lernen, Fragmente. Ich will die typische zwei-Fenster-layout, wobei die linke Seite die "navigation", und klicken Sie auf eines der Elemente, und es ändert sich das fragment auf der rechten Seite.
Kann ich duplizieren Sie die tutorials, die mit einem ListFragment für die Links, und wenn Sie auf einer von Ihnen aktualisiert es den "details" - fragment auf der rechten Seite.
Habe ich versucht, das beste ich kann, um doppelten code, und verwenden Sie einfach ein LinearLayout mit Tasten für die linke Seite, so dass, wenn auf eine Schaltfläche geklickt wird, lädt er das entsprechende fragment auf der rechten Seite, aber es funktioniert nicht.
Wenn ich versuche, mir die FragmentTransaction, bekomme ich java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
Was ist Elternteil des Kindes, und warum muss ich call removeView drauf?
Ich versuche, laden Sie das fragment in ein FrameLayout, aber ich habe auch gerade versucht, anstelle ein weiteres Fragment im layout, und bekomme immer noch den Fehler.
Idealerweise möchte ich die linke fragment-zu nehmen, bis der gesamte Bildschirm, bis eine Taste gedrückt wird, die erfordert, dass ein fragment von der linken Seite, aber es ist ein problem in einer Zeit, nehme ich an.
Code
Haupttätigkeit
public class FragmentExample2Activity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
SelectorFragment (Linke Seite)
public class SelectorFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
View fragment = inflater.inflate(R.layout.selector, container);
Button button1 = (Button) fragment.findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
getFragmentManager().beginTransaction().replace(R.id.detail_holder, new DetailsFragment(), "stuff").commit();
}
});
return fragment;
}
}
DetailsFragment
public class DetailsFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
return inflater.inflate(R.layout.details, container);
}
}
main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<fragment class="com.coreno.testfragment.SelectorFragment"
android:id="@+id/select"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
/>
<fragment class="com.coreno.testfragment.DetailsFragment"
android:id="@+id/detail_holder"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="2"
/>
<!--
<FrameLayout
android:id="@+id/detail_holder"
android:layout_width="0px"
android:layout_height="match_parent"
android:layout_weight="2"
/>
-->
</LinearLayout>
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim aufblasen eine layout-xml-Datei nicht angeben, wird die übergeordnete Ansicht. Es klingt sehr counter-intuitive, um nicht angeben, wo Sie setzen diese übertriebene Ansicht, aber es funktioniert.
So, zum Beispiel, in Ihrem SelectorFragment ändern Sie die Zeile:
zu
oder noch besser
Vergessen Sie nicht, das gleiche zu tun in Ihrem DetailsFragment zu.
Beim aufblasen eines Layouts innerhalb der getView-Methode ein Fragment verwenden, müssen Sie die nächsten aufblasen Methode:
inflater.inflate(R. layout.details, container, false);
Der Schlüssel ist der Dritte parameter. Es muss falsch sein, nicht zu befestigen, die aufgeblasen layout der container, da das system es schon getan. Wenn es wahr ist oder nicht indiziert ist eine redundante Gruppe-Ansicht erstellt wird.