2011-10-28 19 views
36

Ci scusiamo per l'enorme discarica del codice, ma sono davvero perso.Android Fragment non rispetta match_parent come altezza

MyActivity.java onCreate:

super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_singlepane_empty); 
mFragment = new PlacesFragment(); 
getSupportFragmentManager().beginTransaction() 
        .add(R.id.root_container, mFragment) 
        .commit(); 

PlacesFragment.java onCreateView:

mRootView = (ViewGroup) inflater.inflate(R.layout.list_content, null); 
return mRootView; 

Note: mRootView è un ViewGroup globale, nessun problema a questo proposito, credo. PlacesFragment è un ListFragment.

Layout:

activity_singlepane_empty.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/root_container" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#00f"> 
    <include layout="@layout/actionbar"/> 

    <!-- FRAGMENTS COME HERE! See match_parent above --> 

</LinearLayout> 

list_content.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/listContainer" 
     android:background="#990" 
     > 

     <ListView android:id="@android:id/list" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:drawSelectorOnTop="false" /> 

     <TextView android:id="@id/android:empty" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center" 
       android:gravity="center" 
       android:textAppearance="?android:attr/textAppearanceMedium" 
       android:text="@string/no_data_suggest_connection"/> 

</FrameLayout> 

Problema: come si può vedere, il comportamento previsto sarebbe di avere il vuoto TextView sopra per apparire centrato sullo schermo. Nell'anteprima di progettazione in Eclipse, è OK. Solo quando aggiunto a root_view come frammento, FrameLayout non riempirà l'intero schermo.

root_container è blu e FrameLayout è giallastro, vedere sotto per scopi di debug. Il riquadro giallo non dovrebbe riempire l'intero schermo?!?!?!?

enter image description here

+0

Se si utilizza il controllo ScrollView, consultare: http://stackoverflow.com/questions/10211338/view-inside-scrollview-doesnt-take-all-place –

risposta

69

Ho avuto lo stesso problema e penso che succede quando si gonfia il layout in onCreateView del Frammento con nulla, come hai fatto qui:

mRootView = (ViewGroup) inflater.inflate(R.layout.list_content, null); 

Invece si hanno a che fare questo:

mRootView = (ViewGroup) inflater.inflate(R.layout.list_content,container, false); 

Dove contai ner è il Viewgroup. Almeno, questo ha risolto il problema per me.

+2

http://developer.android.com/reference/android/view/LayoutInflater.html Vista facoltativa per essere il genitore della gerarchia generata (se attachToRoot è true), oppure semplicemente un oggetto che fornisce un set di LayoutParams valori per la radice della gerarchia restituita (se attachToRoot è false.) Risposta accettata. Grazie. – davidcesarino

+1

vedere anche http://stackoverflow.com/questions/5026926/making-sense-of-layoutinflater – Stevie

3

Per qualche motivo il FrameLayout non ottiene il suo layout dal XML.

ho bisogno di metterlo anche nel codice (di Fragment onCreateView):

mRootView = (ViewGroup) inflater.inflate(R.layout.list_content, null); 
FrameLayout fl = (FrameLayout) mRootView.findViewById(R.id.listContainer); 
fl.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 
return mRootView; 
+0

Questa è una vecchia risposta. Da allora, ho acceso il marchio di accettazione alla risposta di Norman. Ovviamente questa risposta fornisce una maggiore flessibilità, ma sono lieto di accettarlo poiché questa domanda ha chiaramente garantito una soluzione di facile utilizzo. – davidcesarino

0

nello stesso modo visto che era di creare un'immagine trasparente nel codice XML, fare il frammento un layout relativa e rendere layout_alignParentBottom="true" nel ImageView, questo modo l'immagine attacca al fondo e rende il frammento riempire il genitore

Codice Qui:

temp_transparent.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:thickness="0dp" 
    android:shape="rectangle"> 
<gradient 
    android:startColor="#00000000" 
    android:endColor="#00000000" 
    android:type="linear" 
    android:angle="270"/> 

fragment_m y_invites.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:orientation="vertical" 
      android:id="@+id/my_invites_fragment" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="#ffffff"> 


<ListView 
    android:id="@+id/list_invites" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:divider="@color/list_divider" 
    android:dividerHeight="1dp" 
    android:layout_alignParentTop="true" > 
</ListView> 

<ImageView 
    android:id="@+id/transparent_image" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_alignParentBottom="true" 
    android:layout_below="@id/list_invites" 
    android:src="@drawable/temp_transparent" /> 

4
<android.support.v4.widget.NestedScrollView 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    android:fillViewport="true" 
    > 

    <include layout="@layout/screen_main_fragment" /> 

</android.support.v4.widget.NestedScrollView> 

ho dovuto cambiare layout_height = "wrap_content" a "match_parent" per farlo funzionare.

Problemi correlati