2011-10-28 10 views
36

Lo siento por el gran volcado de código, pero estoy realmente perdido.Android Fragment no respeta match_parent como altura

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; 

Notas: mRootView es un ViewGroup mundial, no hay problema en ello, creo. PlacesFragment es un ListFragment.

diseños:

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: como se puede ver, el comportamiento esperado sería tener el vacío TextView arriba para que aparezca centrado en la pantalla. En la vista previa del diseño en Eclipse, está bien. Solo cuando se agrega a root_view como un fragmento, FrameLayout no ocupará toda la pantalla.

root_container es azul, y FrameLayout es amarillento, ver a continuación con fines de depuración. ¿No debería el panel amarillo llenar toda la pantalla?!?!?!?

enter image description here

+0

Si utiliza ScrollView, descargue esto: http://stackoverflow.com/questions/10211338/view-inside-scrollview-doesnt-take-all-place –

Respuesta

69

que tenían el mismo problema y piensan que sucede cuando se infla el diseño en onCreateView del fragmento con nula, como lo hizo aquí:

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

lugar que tiene que hacer esto:

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

Dónde contai ner es el grupo de vista. Al menos, eso resolvió el problema para mí.

+2

http://developer.android.com/reference/android/view/LayoutInflater.html Vista opcional para ser el padre de la jerarquía generada (si attachToRoot es verdadero), o simplemente un objeto que proporciona un conjunto de LayoutParams valores para la raíz de la jerarquía devuelta (si attachToRoot es falso) Respuesta aceptada. Gracias. – davidcesarino

+1

vea también http://stackoverflow.com/questions/5026926/making-sense-of-layoutinflater – Stevie

3

Por alguna razón el FrameLayout no obtiene su diseño del XML.

que tenga que configurar también en el código (onCreateView del fragmento):

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

Esta es una respuesta anterior. Desde entonces, cambié la marca de aceptación a la respuesta de Norman. Por supuesto, esta respuesta proporciona más flexibilidad, pero estoy contento de aceptar la suya, ya que esta pregunta claramente justifica una solución para fácil de usar. – davidcesarino

0

La forma en que lo hice fue crear una imagen transparente en el código XML, hacer que el fragmento de una disposición relativa y hacer layout_alignParentBottom="true" en el ImageView, de esta manera la imagen se pega a la parte inferior y hace que el fragmento de llenar la matriz

Aquí

Código:

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> 

que tenía que cambiar layout_height = "wrap_content" a "match_parent" para hacer que funcione.

Cuestiones relacionadas