Fragment mit neuen Fragment ersetzen

  • Antworten:12
  • Bentwortet
Hanno Wallah
  • Forum-Beiträge: 49

01.03.2016, 09:18:12 via Website

Ich habe 5 Frgamnts, die ich mit StatePagerAdapter anzeige. Auf dem fünften habe ich ein Button, welches ein sechstes Fragment anzeigen soll. Das fünfte soll dann mit dem sechsten ausgetauscht werden. Also Fagment replace mit Fragment.
Ich habe mit FragmentManager, FragmentTransaction und FragmentTransaction.replace ausprobiert, funktioniert nicht.

— geändert am 01.03.2016, 13:27:37

Antworten
Lackyluuk
  • Forum-Beiträge: 138

01.03.2016, 10:06:54 via App

Poste bitte deinen Code :)

Antworten
Hanno Wallah
  • Forum-Beiträge: 49

01.03.2016, 10:18:31 via Website

kann kein code hizufügen, da ich folgnede FM bekomme:

Um Spam in unserem Forum zu vermeiden, können neue Mitglieder vorerst keine Links auf externe Webseiten veröffentlichen.

Wie kann ich code hizufügen?

— geändert am 01.03.2016, 10:19:03

Antworten
Hanno Wallah
  • Forum-Beiträge: 49

01.03.2016, 10:19:33 via Website

Vielen Dank; und hier mein Code.

public class YogaMeineBuecher extends Fragment implements View.OnClickListener{
View vFussball;
View vReise;
View meineBuecher;
Fragment frag;
android.support.v4.app.FragmentTransaction fragTrans;

public  View onCreateView(final LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState){
    // Layout meineBücher anzeigen
    meineBuecher = inflater.inflate(R.layout.yoga_meine_buecher, container, false);

    // Layout Buttons mit listener versehen
    Button btnFussball = (Button) meineBuecher.findViewById(R.id.lesenF);
    btnFussball.setOnClickListener(this);
    Button btnReise = (Button) meineBuecher.findViewById(R.id.lesenR);
    btnReise.setOnClickListener(this);

    return meineBuecher;
}

@Override
public void onClick(View view) {

    switch (view.getId()){
        case (R.id.lesenF):
            Fragment fragment2 = new YogaBuchFussball();
            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.container, fragment2);
            fragmentTransaction.commit();

        case (R.id.lesenR):

// vReise.setVisibility(View.VISIBLE);
default:
}

Inhalt YogaMeineBuecher.XML

Wenn ich auf dem Button klicke, dann dird die View unter der vorhandenen Vieeew hizugefügt. Ich möchte, dass die View überschrieben wird und die neue angezeigt wird.

— geändert am 01.03.2016, 10:21:46

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

01.03.2016, 11:40:07 via Website

Also ohne jetzt groß ins Detail zu gehen:
Du möchtest ein Fragment im ViewPager austauschen. Dein Code tauscht aber vermutlich den gesamten ViewPager selbst aus.
Wenn du erst im ViewPager austauschen willst, müsstest Du natürlich über den ViewPager bzw. den ViewPagerAdapter gehen.
Davon würde ich dir aber abraten, weil das zum einen sehr umständlich ist und zum anderen der ViewPager sowieso schon ein Graus ist, wenn es darum geht mit dem Lifecycle der enthaltenen Fragmente zu hantieren.

Mein Vorschlag:
Packe alle Views, die du für beide Zustände benötigst in EIN Layout und somit in EIN Fragment.
Nach dem Klick auf den Button blendest Du halt andere Views ein. Z.B. über einen ViewSwitcher.

Antworten
Andy N.
  • Forum-Beiträge: 22.375

01.03.2016, 13:07:05 via Website

Hallo Hanno

Bitte beachte, dass Threads mit nicht aussagekräftigem Titel bei uns üblicherweise den Regeln entsprechend entfernt werden. Ich bitte dich daher, deinen Threadtitel innerhalb der nächsten 24 Stunden, spätestens jedoch bei deinem nächsten Besuch noch etwas aussagekräftiger zu gestalten (Hierfür einfach unter deinem ersten Beitrag auf 'bearbeiten' klicken, dann kannst du oben noch mal den Titel anpassen)

Danke :)

Viele Grüße,
Andy


OnePlus 3 (Resurrection Remix 5.8.2)
LG G Watch

Regeln | unsere Mods & Admins

Antworten
Hanno Wallah
  • Forum-Beiträge: 49

01.03.2016, 13:19:48 via Website

Da View nur 2 views zu hin- und hersschalten zulässt, ist leider nicht die Lösung. Da ich mehrere Button auf mein Fragment habe und entsprechend möchte ich das Fragment einblenden. Ferner habe ich das ganze mit TabLayout und addTab in MainActivity realisiert, so dass ich die Tabs oben ansehe und auch direkt z.B auf Tab 1 oder auf Tab 5 drucken kann.
Bei ViewSwitcher wird mir die View angezigt aber wenn ich auf Tab 5 drucke, dann bleibet diese (sechste View) stehen und ich weiss nicht wie ich diese Fraagment (View 5) erneut anzeigen kann.
Ferner möchte ich diesen Fragment( den sechsten) nicht über MainActivity relaisieren, da dann im ViewPagen sofort angezeigt wird, Ich möchte diesen erst beim ButtonClick angezeigt haben.
Viele Wünsche auf ein Mal!

— geändert am 01.03.2016, 13:30:55

Antworten
Hanno Wallah
  • Forum-Beiträge: 49

01.03.2016, 13:23:41 via Website

wie kann ich den Titel anpassen?

Antworten
Hanno Wallah
  • Forum-Beiträge: 49

01.03.2016, 13:51:50 via Website

Habe gemacht. Ist der Titel jetzt OK?Danke

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

01.03.2016, 14:09:50 via Website

Hanno Wallah

Da View nur 2 views zu hin- und hersschalten zulässt, ist leider nicht die Lösung. Da ich mehrere Button auf mein Fragment habe und entsprechend möchte ich das Fragment einblenden. Ferner habe ich das ganze mit TabLayout und addTab in MainActivity realisiert, so dass ich die Tabs oben ansehe und auch direkt z.B auf Tab 1 oder auf Tab 5 drucken kann.
Bei ViewSwitcher wird mir die View angezigt aber wenn ich auf Tab 5 drucke, dann bleibet diese (sechste View) stehen und ich weiss nicht wie ich diese Fraagment (View 5) erneut anzeigen kann.
Ferner möchte ich diesen Fragment( den sechsten) nicht über MainActivity relaisieren, da dann im ViewPagen sofort angezeigt wird, Ich möchte diesen erst beim ButtonClick angezeigt haben.
Viele Wünsche auf ein Mal!

Mehr als einen View kann aber ViewFlipper.
Wie gesagt ist es aber echt eine Welt der Schmerzen im ViewPager zur Laufzeit Dinge dynamisch zu ändern. Stell dich drauf ein viel Zeit damit zu verbringen um die kleinen Unzulänglichkeiten in der ViewPager Implementierung herum zu improvisieren.
Wenn es unbedingt ein neuer Tab sein muss, dann füge den halt zur Laufzeit hinzu, genauso wie du die ersten Tabs beim Start hinzufügst. Vermutlich wirst Du dazu den ViewPagerAdapter austauschen müssen.
Falls irgendwie möglich würde ich versuchen es anders zu machen. Views in einem Fragment tauschen, einen Tab hinzufügen, aber deaktivieren, oder initial leer lassen ... oder oder oder.
Du wirst es noch verfluchen. I guarantee it :D

Antworten
Hanno Wallah
  • Forum-Beiträge: 49

01.03.2016, 15:42:46 via Website

Ich habe zwei weitere Ideen. Bevor ich damit anfange, will ich die Meinung holen.
1. eine weitere Activity anlegen, in dem die Views implementiert sind , die mit den Buttons (bis zu 4 oder 5) aus dem 5. Fragment nach dem angezeigt werden sollen. Und diese Activity mit Intent anstossen. Auf dem View dieser neuen Activity zrrück Button implemeieren, damit man zurück zum ursprünglichen Activity mit Fragments gelangt.
2. Ein leers Fragment anlegen, in dem dann das entsprechende (dem Button zugehöriges) Fragment dynamisch erzeugt und angezeigt wird. Um auf dem 5. Fargment zu gelangen mus jedes neue Fragment Zurück Button verfügen.

Kann das überhaupt funktionieren und ist es so sinnvoll. Oder hast du eine andere Idee!!!!!!!!!!!!!!!!!!!!!

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

01.03.2016, 16:16:14 via Website

Es dürfte beides gehen.

Bei 1) solltest Du aufpassen, wie du etwaige Rückgabewerte von der Activity in die Fragmente zurückbekommst.
Merke dir zwei Dinge dafür als Hinweise, auch wenn sie jetzt noch keinen Sinn machen, wenn du auf das Problem stößt, erinnerst Du dich vielleicht daran:

  • onActivityResult() wird NICHT bis in die Fragmente weitergeleitet,
    die im ViewPager liegen, sondern nur an das Fragment, das den
    ViewPager enthält. Du kannst das Event aber manuell an die Fragmente im ViewPager weiterleiten und den Intent mit getParentFragment().startActivity() auslösen.
  • Wenn du mit setTargetFragment arbeiten solltest, nimm auch das Fragment, das den Pager enthält (getParentFragment()), NICHT das Fragment im Pager. Das wird bei Drehung des Geräts und Neuerstellung der Activity NICHT korrekt wiederhergestellt.

Bei 2) kannst Du doch im 5ten Fragment einfach einen ViewFlipper nehmen und in den einzelnen Teilen "Zurück" Buttons hinzufügen, die beim Klick zum Child mit dem Index 0 im ViewFlipper springen.

— geändert am 01.03.2016, 16:19:55

Antworten
Hanno Wallah
  • Forum-Beiträge: 49

02.03.2016, 14:40:11 via Website

Ich habe den ViewFlipper implemtiert und baue den zweiten View (für Next im XML) dynamisch auf. Es funktioniert hervorragen.

Vielen Dank für die Tips und Hinweise.

Nun habe ich ein weitere Problem:

wenn ich mit dem ViewFlipper die eine oder andere View angezeigt habe, dann möchte ich den Back Button vom Android Gerät benutzen und nicht eigenes BackButton darstellen.
Ist dies in diesem Fall möglich?????
Ich habe einiges probiert funktioniert n ichts!!!!!!!!!!!!!!

— geändert am 06.03.2016, 18:05:10

Antworten