2013-05-09 14 views
8

Come funziona? Ho layout in seguito:Frammento di Android: visibilità nella definizione del layout xml

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <fragment 
     android:id="@+id/search_form_fragment" 
     android:name="FragmentClass" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

    <fragment 
     android:id="@+id/result_list_fragment" 
     android:name="FragmentClass" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:visibility="gone" /> 
</LinearLayout> 

Nota secondo frammento ha android:visibility="gone" e infatti non è visibile sullo schermo. Ma questo codice:

boolean bothVisible = firstFrag.isVisible() && secondFrag.isVisible(); 

rendimenti true, che non era previsto da me. Mi chiedo se l'uso di android:visibility sia corretto perché non sono riuscito a trovare alcuna informazione a riguardo nella documentazione.

+0

State di inizializzare (sempre riferimento a) '' firstFrag' e secondFrag' correttamente? – zbr

+0

Sì, ottengo riferimento da 'getFragmentById()'. – Michal

+0

Come in 'firstFrag = getFragmentManager(). FindFragmentById (R.id.search_form_fragment);' e 'secondFrag = setFragmentManager(). FindFragmentById (R.id.result_list_fragment);'? – zbr

risposta

6

Per la Fragment source, isVisible è definito come:

final public boolean isVisible() { 
    return isAdded() && !isHidden() && mView != null 
      && mView.getWindowToken() != null && 
       mView.getVisibility() == View.VISIBLE; 
} 

Cioè, è collegato all'attività, non viene nascosta (tramite il FragmentTransaction.hide), la vista è gonfiato, la vista è attaccato ad un finestra, e la vista interna del frammento è View.VISIBLE.

Credo che il problema è che per gonfiare il frammento, il sistema crea un layout per contenere la vista del frammento. È quella vista che stai impostando su View.GONE, non sulla vista interna creata da Fragment.

Potrei suggerire cambiando la sua condizione di essere:

findViewById(R.id.result_list_fragment).getVisibility() == View.VISIBLE 
0

Ho provato a fare questo

XML

<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/lateral_login_frame" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:visibility="gone"/> 

Codice

LoginFrag = LoginFragment.newIstance();  
FragmentTransaction LoginTransaction = fm.beginTransaction(); 
LoginTransaction.replace(R.id.lateral_login_frame, LoginFrag); 
LoginTransaction.commit(); 

Log.d("visibility", String.valueOf(LoginFrag.isVisible())); 

E il mio registro è stato:

05-09 19:07:54.236: D/visibility(3483): false 

da Android documentation, Return IsVisible() true se il frammento è attualmente visibile all'utente. Ciò significa che: (1) è stato aggiunto, (2) ha la sua vista collegata alla finestra e (3) non è nascosto.

Forse non hai ancora aggiunto il frammento? dal codice che non posso dire. Spero che questo ti aiuti.

+2

Ok, ma si aggiunge il frammento in modo programmatico. Mi stavo chiedendo in che modo Android: la visibilità funziona sul tag in xml. – Michal

+0

Quindi penso che la risposta di ianhanniballake sia ciò che stai cercando. –

Problemi correlati