Ширина столбца GridLayout

У меня есть 2 столбца в моем GridLayout . Я хочу сделать, чтобы эти столбцы занимали половину ширины экрана каждый, а затем его дочернее содержимое заполняло свои собственные ячейки шириной / высотой. Я попробовал настроить детей на fill_parent но это просто заставляет первый захватить весь макет. И похоже, что GridLayout не поддерживает weight ? Может быть, лучше использовать макет, но мне нужен макет стиля Grid, который кажется естественным выбором.

###РЕДАКТИРОВАТЬ###

Этот код доступен в pre API21 с поддержкой библиотеки!

##########

У меня есть простой кусок кода, чтобы показать 4 кнопки в gridLayout из 2 столбцов, которые занимают 50% доступного пространства: возможно, это может помочь

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

Решение, возможно, таково:

  android:layout_gravity="fill" android:layout_columnWeight="1" 

Для pre API 21 используйте библиотеку поддержки:

Добавить

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

К вашим зависимостям.

Затем в файле 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> 

Здесь обратите внимание на использование префикса «приложение» и не забудьте добавить

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

В ваш XML-файл

Хорошо, поэтому я отказался от вида сетки и просто использовал некоторые линейные макеты. Я сделал вертикальный, а затем добавил 2 горизонтали. Это немного более активное участие, чем представление сетки … но пока я не понял, что, по крайней мере, это работает.

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

И тогда я добавляю это, чтобы сделать квадраты кнопок 🙂

 @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); btnPrefs.setMinimumHeight(btnPrefs.getWidth()); btnVerse.setMinimumHeight(btnMyButton.getWidth()); } 

Вы можете расширить класс RelativeLayout (или использовать LinearLayout, если хотите), чтобы убедиться, что высота элемента будет такой же, как высота.

 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()); } } 

Родительский вид макета элемента должен быть представлением GridItem, чтобы убедиться, что он работает. Это должен быть файл макета, который вы будете раздувать в getView вашего 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> 

И установите для параметра stretchMode GridView значение columnWidth. Это приведет к тому, что все элементы будут соответствовать ширине указанного количества столбцов. В новом представлении убедитесь, что они также будут иметь одинаковую высоту.

 <GridView android:id="@+id/gridList" android:numColumns="2" android:stretchMode="columnWidth" /> 

Когда вы используете GridLayoutManager вы можете использовать setSpanSizeLookup . Вот фрагмент моего проекта, который должен помочь правильно использовать этот метод:

 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(); 
Intereting Posts
Как отличить перемещение и щелчок в onTouchEvent ()? Показывать пароль с помощью EditText Gmail 5.0+: как получить информацию о ярлыках для функции Exchange Gmail Как тренировать сеть тензорного потока с использованием JNI на Android? GetView вызывается только при прокрутке на уровне 8 андроида. Android: Security Concern: classes.dex Публично открытое имя WebService отображается в файле Как добавить кнопки в верхней части фрагмента карты API v2 layout Как получить правильные границы представления после преобразования Матрица Android. Избегайте масштабирования фона Вы обнаружите, что вы работаете с контейнером Android for Work? Использование onConfigurationChanged в фрагменте В чем преимущество использования Space over View Скриншот сборки скрипта для Android возвращает ошибку 137 в preDexDebug Получение линий из GL10, рисующих изображения рядом друг с другом, решение? Orm Lite – Не удалось найти публичный конструктор, который имеет один (Контекст) аргумент для вспомогательного класса