web-dev-qa-db-fra.com

Android Fragment ne respecte pas match_parent comme hauteur

Désolé pour l'immense vidage de code, mais je suis vraiment perdu.

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;

Notes: mRootView est un ViewGroup global, pas de problème, je crois. PlacesFragment est un ListFragment.

Disposition:

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>

Problème: comme vous pouvez le voir, le comportement attendu serait que le TextView vide ci-dessus apparaisse centré sur l'écran. Sur l'aperçu de la conception dans Eclipse, c'est OK. Ce n'est que lorsqu'il est ajouté à root_view en tant que fragment que FrameLayout ne remplira pas tout l'écran.

root_container est bleu et FrameLayout est jaunâtre, voir ci-dessous à des fins de débogage. Le volet jaune ne doit-il pas remplir tout l'écran?!?!?!?

enter image description here

40
davidcesarino

J'ai eu le même problème et je pense que cela se produit lorsque vous gonflez la mise en page dans onCreateView du fragment avec null, comme vous l'avez fait ici:

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

Au lieu de cela, vous devez faire ceci:

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

Où conteneur est le groupe de vues. Au moins, cela a résolu le problème pour moi.

73
Norman
<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>

J'ai dû changer layout_height = "wrap_content" en "match_parent" pour le faire fonctionner.

5
user1070356

Pour une raison quelconque, FrameLayout ne tire pas sa mise en page du XML.

Je dois le définir également dans le code (onCreateView de Fragment):

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;
4
davidcesarino

La façon dont je l'ai fait était de créer une image transparente dans du code xml, de faire du fragment une disposition relative et de makelayout_alignParentBottom="true" dans le ImageView, de cette façon l'image colle au bas et fait que le fragment remplisse le parent

Code ici:

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_my_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" />
0
Diogo Peres