web-dev-qa-db-fra.com

Largeur de colonne GridLayout

J'ai 2 colonnes dans ma GridLayout. Ce que je veux faire, c'est que ces colonnes occupent chacune la moitié de la largeur de l'écran, puis que son contenu enfant remplisse leurs propres cellules largeur/hauteur. J'ai essayé de régler les enfants sur fill_parent, mais le premier prend en charge l'intégralité de la présentation. Et il semble que GridLayout ne supporte pas weight? Il y a peut-être une meilleure mise en page à utiliser, mais je veux une mise en page de style Grille qui semble être le choix naturel.

40
bwoogie

Ce code est disponible sur pré API21 avec la bibliothèque de support!

J'ai un simple morceau de code pour montrer 4 boutons dans une grilleLayout de 2 colonnes qui prennent 50% de l'espace disponible: Peut-être que cela peut aider

<GridLayout
    Android:id="@+id/grid"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:columnCount="2"
    >


    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Button"
        Android:layout_gravity="fill"
        Android:layout_columnWeight="1"
        />

       <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Button"
        Android:layout_gravity="fill"
        Android:layout_columnWeight="1"
        />

       <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Button"
        Android:layout_gravity="fill"
        Android:layout_columnWeight="1"
        />

       <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Button"
        Android:layout_gravity="fill"
        Android:layout_columnWeight="1"
        />



</GridLayout>

La solution est peut-être ceci:

Android:layout_gravity="fill"
Android:layout_columnWeight="1"
46
Tobliug

Pour la pré API 21, utilisez la bibliothèque de support:

ajouter 

compile 'com.Android.support:appcompat-v7:23.1.1'
compile 'com.Android.support:design:23.1.1'

à vos dépendances. 

Puis dans votre fichier XML:

<Android.support.v7.widget.GridLayout
                    xmlns:app="http://schemas.Android.com/apk/res-auto"
                    Android:layout_width="match_parent"
                    Android:layout_height="wrap_content"
                    app:columnCount="2"
                    app:orientation="horizontal"
                    app:rowCount="1">

                    <TextView
                        Android:text="1"
                        Android:textStyle="bold"
                        app:layout_columnWeight="1"
                        />

                    <TextView
                        Android:text="2"
                        Android:textStyle="bold"
                        app:layout_columnWeight="1" />

</Android.support.v7.widget.GridLayout>

Ici, notez l'utilisation du préfixe "app" et n'oubliez pas d'ajouter

xmlns:app="http://schemas.Android.com/apk/res-auto"

à votre fichier xml

12
Mehmet Katircioglu

Ok, alors j’ai abandonné la vue grille et je viens d’utiliser une mise en page linéaire. J'ai fait un vertical et ensuite ajouté 2 horizontaux. C'est un peu plus compliqué que la vue en grille ... mais jusqu'à ce que je sache au moins ça marche.

<LinearLayout
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent" >

    <LinearLayout
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="1"
        Android:orientation="vertical" >

        <ImageButton
            Android:id="@+id/btn_mybutton"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_margin="5dp"
            Android:background="@color/pomegranate"
            Android:contentDescription="@string/contentDescriptionmybutton"
            Android:src="@drawable/ic_launcher" />

    </LinearLayout>

    <LinearLayout
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="1"
        Android:orientation="vertical" >

        <ImageButton
            Android:id="@+id/btn_prefs"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_margin="5dp"
            Android:background="@color/pomegranate"
            Android:contentDescription="@string/contentDescriptionSettings"
            Android:src="@drawable/ic_settings" />

    </LinearLayout>

</LinearLayout>

Et puis j'ajoute ceci pour rendre les boutons carrés :)

@Override
 public void onWindowFocusChanged(boolean hasFocus) {
  super.onWindowFocusChanged(hasFocus);

  btnPrefs.setMinimumHeight(btnPrefs.getWidth());
  btnVerse.setMinimumHeight(btnMyButton.getWidth());

 }
5
bwoogie

ajout dynamique de vues dans une grille Disposition de 2 colonnes occupant 50% de l'espace disponible:

GridLayout gridLayout = new GridLayout();

View view; //it can be any view

GridLayout.LayoutParams param = new GridLayout.LayoutParams();

param.columnSpec = GridLayout.spec(GridLayout.UNDEFINED,GridLayout.FILL,1f);

param.width = 0;

view.setLayoutParams(param);

gridLayout.add(view);

de manière statique (dans un fichier .xml).

<Android.support.v7.widget.GridLayout
   xmlns:app="http://schemas.Android.com/apk/res-auto"
   Android:layout_width="match_parent"
   Android:layout_height="match_parent"
   app:alignmentMode="alignBounds"
   app:columnCount="2"
   app:columnOrderPreserved="false"
   app:orientation="horizontal"
   Android:layout_margin="20dp"
   Android:layout_marginBottom="30dp"
   Android:padding="4dp"
   app:rowCount="2">

<TextView
    Android:layout_marginTop="2dp"
    Android:id="@+id/edit_profile_username"
    Android:layout_width="0dp"
    Android:layout_height="wrap_content"
    app:layout_column="0"
    app:layout_row="0"
    app:layout_gravity="fill"
    app:layout_columnWeight="1"
    Android:text="@string/user_name" />

<TextView
    Android:layout_marginTop="2dp"
    Android:id="@+id/edit_profile_first_name"
    Android:layout_width="0dp"
    Android:layout_height="wrap_content"
    app:layout_column="1"
    app:layout_row="0"
    app:layout_gravity="fill"
    app:layout_columnWeight="1"
    Android:text="@string/first_name" />

<TextView
    Android:layout_marginTop="2dp"
    Android:id="@+id/edit_profile_middle_name"
    Android:layout_width="0dp"
    Android:layout_height="wrap_content"
    app:layout_column="0"
    app:layout_gravity="fill"
    app:layout_columnWeight="1"
    app:layout_row="1"
    Android:text="@string/middle_name" />

<TextView
    Android:layout_marginTop="2dp"
    Android:id="@+id/edit_profile_last_name" 
    Android:layout_width="0dp"
    Android:layout_height="wrap_content"
    app:layout_column="1"
    app:layout_gravity="fill"
    app:layout_columnWeight="1"
    app:layout_row="1"
    Android:text="@string/last_name" />

</Android.support.v7.widget.GridLayout>
3
Naresh Palle

Lorsque vous utilisez une GridLayoutManager, vous pouvez utiliser setSpanSizeLookup. Voici un extrait de mon projet qui devrait vous aider à utiliser cette méthode correctement:

if (mAdapter == null) {
    final int columnCount = getResources().getInteger(R.integer.numberGridColumns);
    mLayoutManager = new GridLayoutManager(getActivity(), columnCount);
    mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            switch (mAdapter.getItemViewType(position)) {
                case ListAdapter.VIEW_TYPE_ONE_COLUMN:
                    return columnCount;
                case RecipeListAdapter.VIEW_TYPE_FULL_COLUMN:
                default:
                    return 1;
            }
        }
    });
    mRecyclerView.setLayoutManager(mLayoutManager);

    mAdapter = new RecipeListAdapter(mPresenter);
    mRecyclerView.setAdapter(mAdapter);
}
mAdapter.notifyDataSetChanged();
0
Stefan Medack

Vous pouvez étendre la classe RelativeLayout (ou utiliser LinearLayout si vous le souhaitez) pour vous assurer que la hauteur de l'élément sera la même que la hauteur.

public class GridItem extends RelativeLayout {

        public GridItem(Context context) {
                super(context);
        }

        public GridItem(Context context, AttributeSet attr) {
                super(context, attr);
        }

        public GridItem(Context context, AttributeSet attr, int integer) {
                super(context, attr, integer);
        }

        // Override onMeasure to give the view the same height as the specified width
        @Override
        public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, widthMeasureSpec);
            setMeasuredDimension(getMeasuredWidth(), getMeasuredWidth());
        }

}

La vue parent de la présentation de l'élément doit être la vue GridItem pour vous assurer qu'elle fonctionne. Ce doit être le fichier de présentation que vous allez gonfler dans le getView de votre ListAdapter

<?xml version="1.0" encoding="utf-8"?>
<my.packagename.GridItem xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <!-- The content of the item -->

</my.packagename.GridItem>

Et définissez le stretchMode de GridView sur columnWidth. Cela fera en sorte que tous les éléments s’adaptent au nombre de colonnes spécifié. La nouvelle vue s'assurera qu'ils auront également la même hauteur.

<GridView
    Android:id="@+id/gridList"
    Android:numColumns="2"
    Android:stretchMode="columnWidth"
/>
0
se_bastiaan