2015-06-09 9 views
5

Sto sviluppando un'applicazione che utilizza frammenti, la settimana scorsa il mio dispositivo di test ha preso l'aggiornamento di lolipop. Quando provo la mia app su un dispositivo lolipop, ho visto che il metodo di sostituzione di Fragment Transaction non funzionava correttamente.La sostituzione delle transazioni di Fragment su API-21 rimane

Funziona con confusione nella versione Lolipop sebbene tutto vada bene nella versione Kitkat.

Per spiegare la mia situazione, ho aggiunto alcune immagini.

--Primo schermo ---------------------------- KitKat ------------- ------------------------ Lollipop -------------

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

Come potete vedere, quando uso kitkat, tutto bene, ma non appena uso la sostituzione della transazione frammento lolipop funziona in modo confuso.

Ecco il mio codice pulsante;

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(); 

      } 
     }); 

ecco il mio 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: versione Kitkat è in esecuzione su un tablet, ma ho provato la mia app sul telefono cellulare (versione KitKat) risultato è lo stesso. Nessun cambiamento.

Grazie.

+0

hai fatto il check in tablet (con lecca-lecca) stessa app ?? –

+0

Sì. agisce lo stesso. Durante il test del dispositivo versione lecca-lecca, il frammento sostituito rimane indietro. – salih

+0

Hai detto "Ho visto che il metodo di sostituzione di Fragment Transaction non funzionava correttamente". Ma mi sembra che frammentTransaction.hide sia eseguito invece di replace(), a causa del codice if (mFragmentFeedBack.isVisible()). Pensi che sia possibile? In questo caso, controlla almeno KitKat. –

risposta

0

Il problema possibile potrebbe essere il codice:

if (mFragmentFeedBack.isVisible()) 

Non consiglio di utilizzare questo metodo per controllare la visibilità. Secondo la documentazione @Fragment isVisible(), si dice

... Questo significa che: (1) è stato aggiunto, (2) ha la vista attaccata alla finestra , e (3) non è nascosto.

Questa parte della frase non è molto chiara. Sospetto che KitKat dica che NON è visibile ma Lollipop dice che lo è, e sono d'accordo con l'implementazione di Lollipop. KitKat dice che il Frammento è stato aggiunto (sì), la vista è allegata (sì), nascosta (non proprio!). Questo è in realtà un problema con la GUI con altre librerie GUI, che ci crediate o no!

Possibili soluzioni, per ora:

  1. Crea una flag booleano, e mantengono la bandiera tra i 2 frammenti. Se questo è semplice da fare, questo è il migliore.
  2. Controlla se un pulsante o una vista è selezionabile, non so quale. Questo è più solido del controllo di isVisible().
  3. Penso che la progettazione del codice sia un po 'più complicata di quanto dovrebbe essere. Per ora, questo è il mio suggerimento. Quando l'utente preme "Nuovo pulsante", chiama semplicemente il metodo replace(), non utilizzare i metodi hide/show. Quando l'utente preme il pulsante SEND nel frammento di feedback, chiama i metodi popBackStack() o replace().Che ne dici di quello?
+0

La tua soluzione mi sembra buona ma, non riesco a verificare se il pulsante è selezionabile o non selezionabile. Perché, pulsante Evertime cliccabile. Quindi non sono in grado di implementare queste soluzioni sul mio progetto. :( – salih

+0

Che ne dici di una possibile soluzione n. 1? –

+0

Ho aggiunto un'altra soluzione possibile al n. 3. Se sei d'accordo, puoi trovare un codice di esempio per questo? –

Problemi correlati