2013-03-19 13 views
35

Beh, ho una semplice <FrameLayout>:Ottieni Frammento dinamicamente collegato a <FrameLayout>?

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/FragmentContainer" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" /> 

Poi, nel mio codice, ho aggiunto un frammento di esso:

FragClass aFrag = new FragClass(); 
getSupportFragmentManager().beginTransaction() 
     .replace(R.id.FragmentContainer, aFrag).commit(); 

E da qualche altra parte nel mio codice, voglio ottenere che FragClass (extends Fragment) oggetto dall'ID R.id.FragmentContainer.

ho provato

((ViewGroup) findViewById(R.id.FragmentContainer)).getChildAt(0) 

o

((FrameLayout) findViewById(R.id.FragmentContainer)).getChildAt(0) 

ma sono restituire il View, invece del Fragment collegato ad esso.

so che posso mantenere la variabile aFrag da qualche parte, quindi non ho bisogno di trovarlo di nuovo. Ma credo che ci dovrebbe essere un modo per recuperarlo.

+1

http://developer.android.com/reference/android/app/FragmentManager.html#findFragmentById%28int%29 – Luksprog

+0

Grazie per la risposta @Luksprog. Ma non posso aggiungere un ID a aFrag. – midnite

+0

Neanche se si utilizza il metodo precedente con 'R.id.FragmentContainer'? – Luksprog

risposta

74

Lasciatemi avvolgetelo con una risposta completa :)

In questo caso, il aggiunti dinamicamente Fragment utilizza l'ID del contenitore View (ViewGroup).

ref: http://developer.android.com/guide/components/fragments.html#Adding

Nota: Ogni frammento richiede un identificatore univoco che il sistema può utilizzare per ripristinare il frammento se l'attività viene riavviato (e che è possibile utilizzare per catturare il frammento di effettuare transazioni, come ad come rimuoverlo). Esistono tre modi per fornire un ID per un frammento:

  • Fornire l'attributo android: id con un ID univoco.
  • Fornire l'attributo android: tag con una stringa univoca.
  • Se non si fornisce nessuno dei due precedenti, il sistema utilizza l'ID della vista Contenitore.

È perché è un Fragment dopotutto, dobbiamo usare getSupportFragmentManager().findFragmentById() per recuperarlo, che restituisce un Fragent, invece di findViewById() che restituisce un View.

Quindi la risposta a questo problema sarebbe:

((aFrag) getSupportFragmentManager().findFragmentById(R.id.FragmentContainer)) 

Grazie a @Luksprog.

+0

Potrebbe restituire un valore null quando viene avviata l'attività del contenitore? –

+0

@HassanMakarov - Grazie per il commento. Mi dispiace di non aver programmato Android per alcuni anni. Quindi, per favore, prendi la mia risposta con un pizzico di sale. Come ho allegato a FRrag a FragmentContainer, perché restituirà null? Potresti spiegarci di più? – midnite

+0

Il frammento non è una sottoclasse di View, quindi una vista container può avere lo stesso id con un Fragment. Destra? – Chao

Problemi correlati