2015-06-09 4 views
5

Ich entwickle eine App, die Fragmente verwendet, letzte Woche nahm mein Testgerät Lolipop Update. Als ich meine App auf einem Lolipop-Gerät getestet habe, habe ich gesehen, dass die Ersetzungsmethode von Fragment Transaction nicht ordnungsgemäß funktioniert.Fragments Transaktion ersetzen auf API-21 bleibt hinter

Es funktioniert mit verwirrend in Lolipop Version obwohl alles gut auf Kitkat Version.

Um meine Situation zu erklären, habe ich ein paar Bilder hinzugefügt.

- Erster Bildschirm ---------------------------- KitKat ------------- ------------------------ Lollipop -------------

enter image description here enter image description here enter image description here

Wie Sie sehen können, wenn ich kitkat benutze, ist alles in Ordnung, aber sobald ich lolipop Fragment Transaktion verwenden, ist das Ersetzen verwirrend.

Hier ist mein Tastencode;

mButtonOk.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       FeedbackFragment mFragmentFeedBack = new FeedbackFragment(); 
       android.app.FragmentManager fm = getFragmentManager(); 
       fm.executePendingTransactions(); 
       android.app.FragmentTransaction fragmentTransaction = fm.beginTransaction(); 
       if (mFragmentFeedBack.isVisible()) { 
        fragmentTransaction.hide(mFragmentFeedBack); 
       } else { 

        if (!mFragmentFeedBack.isAdded()) { 
         fragmentTransaction.replace(R.id.containerfragment, mFragmentFeedBack); 
        } 


        fragmentTransaction.show(mFragmentFeedBack); 
       } 
       fragmentTransaction.addToBackStack(null); 
       fragmentTransaction.commit(); 

      } 
     }); 

hier ist meine xml;

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
android:layout_height="match_parent" tools:context=".MainActivity"> 


<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="New Button" 
    android:id="@+id/button" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="117dp" /> 

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/containerfragment"> 

</FrameLayout> 

EDIT: Kitkat-Version auf einem Tablet läuft, aber ich versuchte, meine App auf dem Telefon (Kitkat-Version) Ergebnis ist das gleiche. Keine Änderungen.

Danke.

+0

hast du in tablet (mit lollipop) die gleiche app? –

+0

Ja. es verhält sich genauso. Beim Testen der Lollipop-Version bleibt das ersetzte Fragment zurück. – salih

+0

Sie haben gesagt: "Ich habe gesehen, dass die Ersetzungsmethode von Fragment Transaction nicht ordnungsgemäß funktioniert". Aber es scheint mir fragmentTransaction.hide wird anstelle von replace() ausgeführt, aufgrund von Code if (mFragmentFeedBack.isVisible()). Denkst du, dass das möglich ist? Überprüfen Sie in diesem Fall KitKat mindestens. –

Antwort

0

Das mögliche Problem kann der Code sein:

if (mFragmentFeedBack.isVisible()) 

ich für die Überprüfung Sichtbarkeit nicht mit dieser Methode empfehlen. Laut Dokumentation @Fragment isVisible(), heißt es

... Das bedeutet, es: (1) hinzugefügt wurde, (2) hat seine Sicht auf das Fenster angebracht ist, und (3) nicht verborgen ist.

Dieser Teil des Satzes ist nicht sehr klar. Ich vermute, dass KitKat sagt, dass es NICHT sichtbar ist, aber Lollipop sagt, dass es das ist, und ich stimme der Implementierung von Lollipop zu. KitKat sagt, dass das Fragment hinzugefügt wurde (ja), die Ansicht ist angehängt (ja), versteckt (nicht wirklich!). Dies ist eigentlich ein GUI-Problem mit anderen GUI-Bibliotheken, ob Sie es glauben oder nicht!

Mögliche Lösungen, denn jetzt:

  1. erstellen boolean Flagge und die Flagge zwischen den zwei Fragmente erhalten. Wenn das einfach ist, ist das das Beste.
  2. Überprüfen Sie, ob eine Schaltfläche oder eine Ansicht anklickbar ist, welche nicht. Dies ist solider, als nach isVisible() zu suchen.
  3. Ich denke, das Code-Design ist ein bisschen komplizierter als es sein sollte. Für jetzt ist das mein Vorschlag. Wenn der Benutzer auf "Neue Schaltfläche" klickt, rufen Sie einfach die replace() -Methode auf, verwenden Sie nicht die Methoden "hide/show". Wenn Benutzer die Schaltfläche SENDEN im Feedback-Fragment drücken, rufen Sie entweder die Methoden popBackStack() oder replace() auf.Wie ist es damit?
+0

Ihre Lösung scheint mir gut, aber ich kann nicht überprüfen, ob Taste klickbar oder nicht anklickbar. Weil Button jederzeit anklickbar ist. Daher kann ich diese Lösung nicht auf meinem Projekt implementieren. :( – salih

+0

Wie wäre es mit möglichen Lösung # 1? –

+0

Ich fügte eine weitere mögliche Lösung auf # 3. Wenn Sie einverstanden sind, können Sie Beispielcode dafür finden? –

Verwandte Themen