Ich brauche Hilfe bei der Arbeit an Fragmenten innerhalb von Fragmenten. Tatsächlich habe ich ein Problem beim Drücken der Zurück-Taste. Anwendung Der Hauptbildschirm verfügt über Schaltflächen und das Drücken auf jede Schaltflächenansicht wird durch ein neues Fragment ersetzt (und dieses Fragment enthält in einem anderen Fragment). Das dynamische Hinzufügen / Ersetzen von Fragmenten funktioniert einwandfrei. Durch Drücken von Schaltfläche1 wird das Fragment ersetzt der Knopf wieder, bekam eine Ausnahme:
"Duplicate id 0x7f05000a, tag null, or parent id 0x7f050009 with
another fragment for com........ fragmentname"
bedeutet, dass bereits Fragmente oder innere Fragmente hinzugefügt wurden und ich versuche, sie erneut hinzuzufügen. Jeder hat eine Idee, wie er mit Fragmenten innerhalb des Fragments arbeiten und sich problemlos hin und her bewegen kann, danke für die Unterstützung.
MainActivity, bei der Fragmente dynamisch hinzugefügt und ersetzt werden.
public class FragmentInsideFragmentTestActivity extends Activity {
private Button button1;
private Button button2;
private Button button3;
private Button button4;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button1 =(Button) this.findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
onButtonClick(view);
}
});
button2 =(Button) this.findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
onButtonClick(view);
}
});
button3 =(Button) this.findViewById(R.id.button3);
button3.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
onButtonClick(view);
}
});
button4 =(Button) this.findViewById(R.id.button4);
button4.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
onButtonClick(view);
}
});
}
public void onButtonClick(View v) {
Fragment fg;
switch (v.getId()) {
case R.id.button1:
fg=FirstFragment.newInstance();
replaceFragment(fg);
break;
case R.id.button2:
fg=SecondFragment.newInstance();
replaceFragment(fg);
break;
case R.id.button3:
fg=FirstFragment.newInstance();
replaceFragment(fg);
break;
case R.id.button4:
fg=SecondFragment.newInstance();
replaceFragment(fg);
break;
}
}
private void replaceFragment(Fragment newFragment) {
FragmentTransaction trasection = getFragmentManager().beginTransaction();
if(!newFragment.isAdded()) {
try {
//FragmentTransaction trasection =
getFragmentManager().beginTransaction();
trasection.replace(R.id.linearLayout2, newFragment);
trasection.addToBackStack(null);
trasection.commit();
} catch (Exception e) {
// TODO: handle exception
// AppConstants.printLog(e.getMessage());
} else {
trasection.show(newFragment);
}
}
}
Hier ist Layout: main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button1" />
<Button
android:id="@+id/button2"
android:text="Button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button3"
android:text="Button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button4"
android:text="Button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" />
</LinearLayout>
Ich hoffe, ich habe versucht, mein Problem zu lösen.
quelle
Antworten:
AFAIK, Fragmente können keine anderen Fragmente enthalten.
AKTUALISIEREN
Mit aktuellen Versionen des Android Support-Pakets - oder nativen Fragmenten auf API Level 17 und höher - können Sie Fragmente mithilfe von verschachteln
getChildFragmentManager()
. Beachten Sie, dass dies bedeutet, dass Sie die Android Support-Paketversion von Fragmenten auf API-Ebenen 11-16 verwenden müssen, da diese Version keine native Version von Fragmenten auf diesen Geräten hatgetChildFragmentManager()
.quelle
getChildFragmentManager()
und EntfernensetRetainInstance(true)
aus dem inneren Fragment (Mitleid) hat es behoben. Vielen Dank, dass Sie meinen Speck wieder gespeichert haben, @CommonsWare.Ich brauchte etwas mehr Kontext, also machte ich ein Beispiel, um zu zeigen, wie das gemacht wird. Das Hilfreichste, was ich während der Vorbereitung gelesen habe, war Folgendes:
Aktivität
activity_main.xml
Fügen Sie
FrameLayout
Ihrer Aktivität ein hinzu, um das übergeordnete Fragment zu speichern.MainActivity.java
Laden Sie das übergeordnete Fragment und implementieren Sie die Fragment-Listener. (Siehe Fragmentkommunikation .)
Übergeordnetes Fragment
fragment_parent.xml
Fügen Sie einen weiteren
FrameLayout
Container für das untergeordnete Fragment hinzu.ParentFragment.java
Verwenden Sie
getChildFragmentManager
inonViewCreated
, um das untergeordnete Fragment einzurichten.Kinderfragment
fragment_child.xml
Hier gibt es nichts Besonderes.
ChildFragment.java
Auch hier gibt es nichts Besonderes.
Anmerkungen
quelle
Seit Android 4.2 (API 17) sind verschachtelte Fragmente verfügbar: http://developer.android.com/about/versions/android-4.2.html#NestedFragments
Verwenden Sie getChildFragmentManager (), um ein Fragment in ein anderes Fragment zu platzieren.
Es ist auch in der Support-Bibliothek erhältlich!
quelle
Fragmente können in andere Fragmente eingefügt werden. Sie müssen sie jedoch jedes Mal aus dem übergeordneten Fragment entfernen, wenn die
onDestroyView()
Methode des übergeordneten Fragments aufgerufen wird. Fügen Sie es erneut in dieonCreateView()
Methode des übergeordneten Fragments ein .Mach einfach so:
quelle
onActivityCreated()
wurden zwei Fragmente hinzugefügt, eines in jede der Ansichten mitgetFragmentManager()
. Dies funktionierte beim ersten Mal, aber bei Rotation und Wiederaufnahme war nur eines der Fragmente sichtbar.getChildFragmentManager()
Stattdessen war das Verhalten korrekt . Der hier vorgeschlagene Ansatz warf eine Ausnahme auf, da die AktivitätonSaveInstanceState()
bereits aufgerufen wurde. Durch das Festschreiben der Transaktion mit wurdecommitAllowingStateLoss()
die Ausnahme vermieden, das ursprüngliche Problem jedoch nicht gelöst.Ich habe dieses Problem gelöst. Sie können die Support-Bibliothek und verwenden
ViewPager
. Wenn Sie nicht per Geste wischen müssen, können Sie das Wischen deaktivieren. Hier ist ein Code, um meine Lösung zu verbessern:PSIt ist hässlicher Code zum Testen, aber es verbessert, dass es möglich ist.
PPS Inside Fragment
ChildFragmentManager
sollte an übergeben werdenViewPagerAdapter
quelle
Sie können die
getChildFragmentManager()
Funktion verwenden.Beispiel:
Übergeordnetes Fragment:
Übergeordnetes Layout (
parent_fragment.xml
):Kinderfragment:
quelle
Es ist nichts kompliziertes. Wir können hier nicht verwenden
getFragmentManager()
. Für die Verwendung von Fragmenten innerhalb eines Fragments verwenden wirgetChildFragmentManager()
. Die Ruhe wird gleich sein.quelle
Sie können
FrameLayout
das Fragment hinzufügen und bei der Initialisierung durch ein anderes Fragment ersetzen.Auf diese Weise können Sie das andere Fragment als innerhalb des ersten Fragments befindlich betrachten.
quelle
Verwenden Sie getChildFragmentManager () und folgen Sie dem Link: Verschachteltes Fragment
quelle
Derzeit werden in verschachtelten Fragmenten die verschachtelten nur unterstützt, wenn sie programmgesteuert generiert werden! Derzeit werden also keine verschachtelten Fragmentlayouts im XML-Layoutschema unterstützt!
quelle
Das kann denjenigen helfen, die mit Kotlin arbeiten. Sie können die Erweiterungsfunktion verwenden. Erstellen Sie also eine Kotlin-Datei, sagen wir "util.kt", und fügen Sie diesen Code hinzu
Nehmen wir an, dies ist die Klasse des Kindes
Jetzt können Sie die Kinder zum hinzufügen Vater Fragment wie folgt
Dabei ist R.id.fragmet_field die ID des Layouts, das das Fragment enthält. Dieses Lyout befindet sich natürlich im Vaterfragment. Hier ist ein Beispiel
dad_fragment.xml :
quelle
Es gibt keine Unterstützung für
MapFragment
, sagt Android-Team arbeitet daran seit Android 3.0. Hier weitere Informationen über das Thema Was aber Sie können es tun , indem ein Fragment zu schaffen , die eine zurückgibtMapActivity
. Hier ist ein Codebeispiel. Danke an inazaruk:Wie es funktioniert :
FragmentActivity
die zwei MapFragments erweitert und hostet.MapView.
LocalActivityManagerFragment
hostet LocalActivityManager.LocalActivityManagerFragment
und erstellt mithilfe vonTabHost
eine interne Instanz von MyMapActivity.Wenn Sie irgendwelche Zweifel haben, lassen Sie es mich bitte wissen
quelle
Hallo, ich habe dieses Problem gelöst, indem ich pro Fragment ein bestimmtes Layout erstellt habe. Und ich habe nur das zugehörige Layout sichtbar gemacht und die anderen Sichtbarkeiten verloren.
Ich meine:
Ich ging davon aus, dass Sie Ihre Seite öffnen, wenn auf Schaltfläche 1 geklickt wird. Sie können die Sichtbarkeit Ihres Fragments beim Klicken steuern. Sie können das zugehörige Layout sichtbar machen und die anderen verschwinden. Mit Fragment Manager können Sie Ihr Fragment übernehmen. Dieser Ansatz hat bei mir funktioniert. Und da eine Ansicht mit Sichtbarkeit: weg unsichtbar ist und für Layoutzwecke keinen Platz benötigt, verursacht dieser Ansatz meines Erachtens keine Platzprobleme.
PS: Ich habe gerade versucht zu erklären, dass mein Lösungscode möglicherweise Syntaxfehler oder eine unvollständige Struktur aufweist.
quelle