web-dev-qa-db-fra.com

Ajustement automatique en fonction de la taille de l'écran dans la disposition de la grille android

J'ai créé une grille contenant plein de textes. Je souhaite que le texte s'adapte automatiquement à la taille de l'écran. J'ai essayé le code suivant,

    DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
    float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
    int noOfColumns = (int) (dpWidth / 50);
    return noOfColumns;

Je veux sortir quelque chose comme ça

image ] 2

imag2 Cela ne fonctionne pas selon mes besoins. Veuillez aider. Merci d'avance.

12
Anusha

Voici une implémentation personnalisée de GridLayout qui fera ce dont vous avez besoin: AutoGridLayout

public class AutoGridLayout extends GridLayout {

    private int defaultColumnCount;
    private int columnWidth;

    public AutoGridLayout(Context context) {
        super(context);
        init(null, 0);
    }

    public AutoGridLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(attrs, 0);
    }

    public AutoGridLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(attrs, defStyleAttr);
    }

    private void init(AttributeSet attrs, int defStyleAttr) {
        TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.AutoGridLayout, 0, defStyleAttr);
        try {
            columnWidth = a.getDimensionPixelSize(R.styleable.AutoGridLayout_columnWidth, 0);

            int[] set = { Android.R.attr.columnCount /* id 0 */ };
            a = getContext().obtainStyledAttributes(attrs, set, 0, defStyleAttr);
            defaultColumnCount = a.getInt(0, 10);
        } finally {
            a.recycle();
        }

        /* Initially set columnCount to 1, will be changed automatically later. */
        setColumnCount(1);
    }

    @Override
    protected void onMeasure(int widthSpec, int heightSpec) {
        super.onMeasure(widthSpec, heightSpec);

        int width = MeasureSpec.getSize(widthSpec);
        if (columnWidth > 0 && width > 0) {
            int totalSpace = width - getPaddingRight() - getPaddingLeft();
            int columnCount = Math.max(1, totalSpace / columnWidth);
            setColumnCount(columnCount);
        } else {
            setColumnCount(defaultColumnCount);
        }
    }
}

Ajoutez simplement à votre fichier de disposition XML comme ceci:

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

    <com.km.myproject.customview.AutoGridLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:columnCount="5"
        app:columnWidth="50dp"/>

</FrameLayout>

L'utilisation de columnWidth tentera de calculer le nombre de colonnes pouvant tenir et de définir automatiquement le nombre optimal de plages. S'il n'est pas utilisé (ou n'a pas réussi à mesurer pour une raison quelconque), l'attribut columnCount sera utilisé.

J'espère que cela t'aides!

4
km.

Pour la grille

 <?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_gravity="center"
    Android:columnCount="4"
    Android:orientation="horizontal" >
    <Button Android:text="1" />
    <Button Android:text="2" />
    <Button Android:text="3" />
    <Button Android:text="4" />
    <Button Android:text="5" />
    <Button Android:text="6" />
    <Button Android:text="7" />
    <Button Android:text="8" />
    <Button Android:text="9" />
    <Button Android:text="10" />
    <Button Android:text="11" />
    <Button Android:text="12" />
    <Button Android:text="13" />
    <Button Android:text="14" />
    <Button Android:text="15" />
    <Button Android:text="16" />
</GridLayout>

par programme:

GridLayout gridLayout = new GridLayout(this);
gridLayout .setColumnCount(4);
///...

un exemple: https://stackoverflow.com/a/14715333/1979882

pour ajuster gridview utilisez cette méthode:

private void adjustGridView() {
  gv.setNumColumns(GridView.AUTO_FIT);
  gv.setColumnWidth(70);
}
0
Vyacheslav

Il serait difficile de faire faire à GridLayout ce dont vous avez besoin:

  • Même si vous pouvez lire la largeur de l'écran à partir d'un DisplayMetrics, cette méthode serait incompatible avec les nouvelles versions de Android qui prennent en charge l'écran partagé. Vous avez besoin de la largeur de la vue parent , pas tout l'écran.

  • Même en supposant que les métriques d'affichage vous donnent une largeur fiable pour la fenêtre affichant votre activité, cette logique se brisera dès que vous placerez la disposition dans un fragment à côté d'un autre fragment. Cela n'a pas de sens de créer quelque chose d'aussi rigide.

  • La largeur de la vue parent n'est pas connue tant que la mise en page n'est pas terminée. Cela ne le rend pas impossible à utiliser, juste délicat.

La chose simple à faire à la place est d'utiliser un GridView qui est mieux conçu à cet effet car il a l'option autofit pour le nombre de colonnes.

0
x-code

Faites ce qui suit;

  • Utilisez votre code pour calculer le nombre de colonnes dans onCreate ou onCreateView. Gardez à l'esprit l'espacement entre les colonnes.

  • Appelez setColumnCount sur le GridLayout avec un nombre supérieur

  • Dans votre xml, ajoutez l'attribut Android:layout_columnWeight="1" à tous les éléments de GridLayout. Cela entraînera l'étirement des colonnes dans l'API 21 et au-dessus.

  • Dans la pré API 21, vous pouvez soit centrer horizontalement le GridView lui-même, afin qu'il ait l'air décent. Ou mieux encore, calculez la largeur de colonne préférée (gridWidth/columnCount), parcourez tous les éléments de la grille (ViewGroup) et définissez leur largeur sur columnWidth.

0
lionscribe