Подтвердить что ты не робот

Как сделать размер экрана GridLayout подходящим

Документы API GridLayout очень трудны для изучения......
есть ли кто-нибудь, кто может научить меня, как установить дочерний элемент View, чтобы иметь что-то вроде "веса" LinearLayout?

Сейчас похоже, что все расположены слева,
Я пробовал много раз и все еще не могу сделать так, чтобы каждая из них была полушириной экрана.

Отредактировано: Я не знаю, что я могу сделать, когда все дети являются wrap_content......   даже если я хочу установить какое-то изображение в определенном размере, этот класс помогает мне сделать ImageView wrap_content......... он не может работать нормально, я пропустил некоторые настройки?!?

4b9b3361

Ответ 1

Примечание. Информация ниже горизонтальной линии больше не точна с введением Android "Lollipop" 5, так как GridLayout поддерживает принцип веса с уровня API 21.

Цитата из Javadoc:

Распределение избыточного пространства

Как и в случае API 21, распределение избыточного пространства GridLayout принцип веса. Если весы не указаны, предыдущие соглашения соблюдаются, а столбцы и строки берутся как гибкие, если их взгляды указывают на некоторую форму выравнивания в пределах их групп. Таким образом, гибкость взгляда зависит от его выравнивание, которое, в свою очередь, обычно определяется установкой силы тяжести свойство параметров макета ребенка. Если либо вес, либо выравнивание определялось вдоль данной оси, тогда компонент был взят как гибкий в этом направлении. Если вес или выравнивание не были установлены, вместо этого предполагается, что компонент является негибким.

Несколько компонентов в той же группе строк или столбцов считаются действуют параллельно. Такая группа является гибкой, только если все компоненты в нем гибкие. Группы строк и столбцов, которые обе стороны общей границы вместо этого считаются действующими в серии. Композитная группа, состоящая из этих двух элементов, является гибкой, если один из его элементов является гибким.

Чтобы сделать растяжку столбца, убедитесь, что все компоненты внутри него определить вес или гравитацию. Чтобы предотвратить растяжение столбца, убедитесь, что один из компонентов в столбце не определяет веса или тяжести.

Если принцип гибкости не обеспечивает полного значения, алгоритмы GridLayout благоприятствуют строкам и столбцам, которые ближе к его правым и нижним краям. Если быть более точным, GridLayout обрабатывает каждый из параметров макета как ограничение в набор переменных, которые определяют линии сетки вдоль данной оси. Во время компоновки GridLayout решает ограничения, чтобы вернуть уникальное решение для тех ограничений, для которых все переменные меньше или равно - к соответствующему значению в любом другом действительном Решение.

Также стоит отметить, что android.support.v7.widget.GridLayout содержит ту же информацию. К сожалению, он не упоминает, какую версию библиотеки поддержки он представил, но фиксация, которая добавляет функциональность, может быть отслежена до июля 2014 года В ноябре 2014 года улучшения в вычислении веса и исправлена ​​ошибка.

Чтобы быть в безопасности, обязательно импортируйте последнюю версию библиотеки gridlayout-v7.


Принцип "веса", как вы его описываете, не существует с GridLayout. Это ограничение четко указано в документации ; выдержка ниже. При этом есть некоторые возможности использовать "гравитацию" для избыточного распределения пространства. Я предлагаю вам прочитать связанную документацию.

Ограничения

GridLayout не поддерживает принцип веса, поскольку определенный по весу. В общем, поэтому невозможно настроить GridLayout для распределения лишнего пространства в нетривиальных пропорции между несколькими строками или столбцами. Некоторые распространенные прецеденты тем не менее, могут быть учтены следующим образом. Для размещения равных количеств пространство вокруг компонента в группе ячеек; используйте выравнивание CENTER (или сила тяжести). Для полного контроля над распределением избыточного пространства подряд или столбец; используйте подстраницу LinearLayout для хранения компонентов в ассоциированной группы клеток. При использовании любой из этих методик что группы ячеек могут быть перекрыты.

Для примера и некоторых практических указателей взгляните на в блоге в прошлом году, в котором представлен виджет GridLayout.


Изменить: Я не думаю, что существует xml-подход для масштабирования таких фрагментов, как в приложении Google Play, для квадратов или прямоугольников вдвое больше этих квадратов. Однако это возможно, если вы создадите свой макет программным путем. Все, что вам действительно нужно знать, чтобы выполнить два измерения, это размеры экрана устройства.

Ниже (очень!) быстрое 'n грязное приближение мозаичного макета в приложении Google Play.

Point size = new Point();
getWindowManager().getDefaultDisplay().getSize(size);
int screenWidth = size.x;
int screenHeight = size.y;
int halfScreenWidth = (int)(screenWidth *0.5);
int quarterScreenWidth = (int)(halfScreenWidth * 0.5);

Spec row1 = GridLayout.spec(0, 2);
Spec row2 = GridLayout.spec(2);
Spec row3 = GridLayout.spec(3);
Spec row4 = GridLayout.spec(4, 2);

Spec col0 = GridLayout.spec(0);
Spec col1 = GridLayout.spec(1); 
Spec colspan2 = GridLayout.spec(0, 2);

GridLayout gridLayout = new GridLayout(this);
gridLayout.setColumnCount(2);
gridLayout.setRowCount(15);

TextView twoByTwo1 = new TextView(this);
GridLayout.LayoutParams first = new GridLayout.LayoutParams(row1, colspan2);
first.width = screenWidth;
first.height = quarterScreenWidth * 2;
twoByTwo1.setLayoutParams(first);
twoByTwo1.setGravity(Gravity.CENTER);
twoByTwo1.setBackgroundColor(Color.RED);
twoByTwo1.setText("TOP");
twoByTwo1.setTextAppearance(this, android.R.style.TextAppearance_Large);
gridLayout.addView(twoByTwo1, first);

TextView twoByOne1 = new TextView(this);
GridLayout.LayoutParams second = new GridLayout.LayoutParams(row2, col0);
second.width = halfScreenWidth;
second.height = quarterScreenWidth;
twoByOne1.setLayoutParams(second);
twoByOne1.setBackgroundColor(Color.BLUE);
twoByOne1.setText("Staff Choices");
twoByOne1.setTextAppearance(this, android.R.style.TextAppearance_Large);
gridLayout.addView(twoByOne1, second);

TextView twoByOne2 = new TextView(this);
GridLayout.LayoutParams third = new GridLayout.LayoutParams(row2, col1);
third.width = halfScreenWidth;
third.height = quarterScreenWidth;
twoByOne2.setLayoutParams(third);
twoByOne2.setBackgroundColor(Color.GREEN);
twoByOne2.setText("Games");
twoByOne2.setTextAppearance(this, android.R.style.TextAppearance_Large);
gridLayout.addView(twoByOne2, third);

TextView twoByOne3 = new TextView(this);
GridLayout.LayoutParams fourth = new GridLayout.LayoutParams(row3, col0);
fourth.width = halfScreenWidth;
fourth.height = quarterScreenWidth;
twoByOne3.setLayoutParams(fourth);
twoByOne3.setBackgroundColor(Color.YELLOW);
twoByOne3.setText("Editor Choices");
twoByOne3.setTextAppearance(this, android.R.style.TextAppearance_Large_Inverse);
gridLayout.addView(twoByOne3, fourth);

TextView twoByOne4 = new TextView(this);
GridLayout.LayoutParams fifth = new GridLayout.LayoutParams(row3, col1);
fifth.width = halfScreenWidth;
fifth.height = quarterScreenWidth;
twoByOne4.setLayoutParams(fifth);
twoByOne4.setBackgroundColor(Color.MAGENTA);
twoByOne4.setText("Something Else");
twoByOne4.setTextAppearance(this, android.R.style.TextAppearance_Large);
gridLayout.addView(twoByOne4, fifth);

TextView twoByTwo2 = new TextView(this);
GridLayout.LayoutParams sixth = new GridLayout.LayoutParams(row4, colspan2);
sixth.width = screenWidth;
sixth.height = quarterScreenWidth * 2;
twoByTwo2.setLayoutParams(sixth);
twoByTwo2.setGravity(Gravity.CENTER);
twoByTwo2.setBackgroundColor(Color.WHITE);
twoByTwo2.setText("BOTOM");
twoByTwo2.setTextAppearance(this, android.R.style.TextAppearance_Large_Inverse);
gridLayout.addView(twoByTwo2, sixth);

Результат будет выглядеть примерно так (на моем Galaxy Nexus):

Tiled layout using GridLayout

Ответ 2

После многих попыток я нашел то, что искал в этом макете. Даже отдельные LinearLayouts с автоматически установленными ImageViews с сохраненным соотношением сторон. Работает с пейзажем и портретом с любым разрешением экрана и изображения.

Nexus 7Nexus 5Nexus 10

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffcc5d00" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical">


        <LinearLayout
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">

            <LinearLayout
                android:orientation="horizontal"
                android:layout_width="fill_parent"
                android:layout_weight="1"
                android:layout_height="wrap_content">

                <LinearLayout
                    android:orientation="vertical"
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:padding="10dip"
                    android:layout_height="fill_parent">

                    <ImageView
                        android:id="@+id/image1"
                        android:layout_height="fill_parent"
                        android:adjustViewBounds="true"
                        android:scaleType="fitCenter"
                        android:src="@drawable/stackoverflow"
                        android:layout_width="fill_parent"
                        android:layout_gravity="center" />
                </LinearLayout>

                <LinearLayout
                    android:orientation="vertical"
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:padding="10dip"
                    android:layout_height="fill_parent">

                    <ImageView
                        android:id="@+id/image2"
                        android:layout_height="fill_parent"
                        android:adjustViewBounds="true"
                        android:scaleType="fitCenter"
                        android:src="@drawable/stackoverflow"
                        android:layout_width="fill_parent"
                        android:layout_gravity="center" />
                </LinearLayout>
            </LinearLayout>

            <LinearLayout
                android:orientation="horizontal"
                android:layout_weight="1"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content">

                <LinearLayout
                    android:orientation="vertical"
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:padding="10dip"
                    android:layout_height="fill_parent">

                    <ImageView
                        android:id="@+id/image3"
                        android:layout_height="fill_parent"
                        android:adjustViewBounds="true"
                        android:scaleType="fitCenter"
                        android:src="@drawable/stackoverflow"
                        android:layout_width="fill_parent"
                        android:layout_gravity="center" />
                </LinearLayout>

                <LinearLayout
                    android:orientation="vertical"
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:padding="10dip"
                    android:layout_height="fill_parent">

                    <ImageView
                        android:id="@+id/image4"
                        android:layout_height="fill_parent"
                        android:adjustViewBounds="true"
                        android:scaleType="fitCenter"
                        android:src="@drawable/stackoverflow"
                        android:layout_width="fill_parent"
                        android:layout_gravity="center" />
                </LinearLayout>
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
</FrameLayout>

Ответ 3

Начиная с API 21, понятие веса было добавлено к GridLayout.

Для поддержки старых устройств Android вы можете использовать GridLayout из библиотеки поддержки v7.

compile 'com.android.support:gridlayout-v7:22.2.1'

Следующий XML дает пример того, как вы можете использовать веса для заполнения ширины экрана.

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.GridLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:grid="http://schemas.android.com/apk/res-auto"

    android:id="@+id/choice_grid"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:padding="4dp"

    grid:alignmentMode="alignBounds"
    grid:columnCount="2"
    grid:rowOrderPreserved="false"
    grid:useDefaultMargins="true">

    <TextView
        android:layout_width="0dp"
        android:layout_height="100dp"
        grid:layout_columnWeight="1"
        grid:layout_gravity="fill_horizontal"
        android:gravity="center"
        android:background="#FF33B5E5"
        android:text="Tile1" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="100dp"
        grid:layout_columnWeight="1"
        grid:layout_gravity="fill_horizontal"
        android:gravity="center"
        android:background="#FF33B5E5"
        android:text="Tile2" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="100dp"
        grid:layout_columnWeight="1"
        grid:layout_gravity="fill_horizontal"
        android:gravity="center"
        android:background="#FF33B5E5"
        android:text="Tile3" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="100dp"
        grid:layout_columnWeight="1"
        grid:layout_gravity="fill_horizontal"
        android:gravity="center"
        android:background="#FF33B5E5"
        android:text="Tile4" />

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

Ответ 4

Если вы используете фрагменты, вы можете подготовить XML-макет и программно программировать критические элементы

int thirdScreenWidth = (int)(screenWidth *0.33);

View view = inflater.inflate(R.layout.fragment_second, null);
View _container = view.findViewById(R.id.rim1container);
_container.getLayoutParams().width = thirdScreenWidth * 2;

_container = view.findViewById(R.id.rim2container);
_container.getLayoutParams().width = screenWidth - thirdScreenWidth * 2;

_container = view.findViewById(R.id.rim3container);
_container.getLayoutParams().width = screenWidth - thirdScreenWidth * 2;

Этот макет для 3 равных столбцов. Первый элемент принимает 2x2 Результат на картинке enter image description here

Ответ 5

Просто быстро просмотрите и обратите внимание, что теперь можно использовать библиотеку поддержки с взвешенным интервалом в GridLayout для достижения желаемого результата:

Как и в случае API 21, распределение избыточного пространства GridLayout сочетает в себе принцип веса. В случае отсутствия весов предыдущие соглашения соблюдаются, а столбцы и строки считаются гибкими, если в их представлениях указывается некоторая форма выравнивания внутри их групп. Таким образом, на гибкость представления влияет его выравнивание, которое, в свою очередь, обычно определяется путем установки свойства тяжести параметров детского макета. Если для данной оси был задан либо вес, либо выравнивание, то этот компонент считается гибким в этом направлении. Если вес или выравнивание не были установлены, вместо этого компонент считается негибким.

Ответ 6

Я архивирую это, используя LinearLayout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:height="166dp"
            android:text="Tile1"
            android:gravity="center"
            android:background="#6f19e5"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:text="Tile2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:height="126dp"
            android:gravity="center"
            android:layout_weight=".50"
            android:background="#f1d600"/>

        <TextView
            android:text="Tile3"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:height="126dp"
            android:gravity="center"
            android:layout_weight=".50"
            android:background="#e75548"/>

    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:text="Tile4"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:height="126dp"
            android:gravity="center"
            android:layout_weight=".50"
            android:background="#29d217"/>

        <TextView
            android:text="Tile5"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:height="126dp"
            android:gravity="center"
            android:layout_weight=".50"
            android:background="#e519cb"/>

    </LinearLayout>
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:height="176dp"
            android:text="Tile6"
            android:gravity="center"
            android:background="#09eadd"/>
    </LinearLayout>
</LinearLayout>

Здесь модальный

Ответ 7

Для других подглядываний: Если вам нужно использовать GridLayout из-за требований проекта, используйте его, но я бы предложил попробовать TableLayout, так как кажется, что гораздо проще работать и добиваться аналогичного результата.

Документы: https://developer.android.com/reference/android/widget/TableLayout.html

Пример:

<TableLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TableRow>

        <Button
            android:id="@+id/test1"
            android:layout_width="wrap_content"
            android:layout_height="90dp"
            android:text="Test 1"
            android:drawableTop="@mipmap/android_launcher"
            />

        <Button
            android:id="@+id/test2"
            android:layout_width="wrap_content"
            android:layout_height="90dp"
            android:text="Test 2"
            android:drawableTop="@mipmap/android_launcher"
            />

        <Button
            android:id="@+id/test3"
            android:layout_width="wrap_content"
            android:layout_height="90dp"
            android:text="Test 3"
            android:drawableTop="@mipmap/android_launcher"
            />

        <Button
            android:id="@+id/test4"
            android:layout_width="wrap_content"
            android:layout_height="90dp"
            android:text="Test 4"
            android:drawableTop="@mipmap/android_launcher"
            />

    </TableRow>

    <TableRow>

        <Button
            android:id="@+id/test5"
            android:layout_width="wrap_content"
            android:layout_height="90dp"
            android:text="Test 5"
            android:drawableTop="@mipmap/android_launcher"
            />

        <Button
            android:id="@+id/test6"
            android:layout_width="wrap_content"
            android:layout_height="90dp"
            android:text="Test 6"
            android:drawableTop="@mipmap/android_launcher"
            />

    </TableRow>

</TableLayout>

Ответ 8

Знаете ли вы View.getViewTreeObserver(). addOnGlobalLayoutListener()

Под этим вы можете рассчитать размеры.

Я получаю эффект пользовательского интерфейса от GridView:

GridView g;
g.setNumColumns(2);
g.setStretchMode(GridView.STRETCH_SPACING_UNIFORM);