Автоматическая подгонка в соответствии с размером экрана в макете

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

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

Я хочу вывести что-то вроде этого

image ] 2

imag2 Это не работает в соответствии с моей потребностью. Пожалуйста помоги. Заранее спасибо.

Ответ 1

Здесь пользовательская реализация GridLayout, которая будет делать то, что вам нужно: 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);
        }
    }
}

Просто добавьте в свой XML-макет файл следующим образом:

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

Использование columnWidth будет пытаться подсчитать, сколько столбцов может поместиться, и автоматически установить оптимальный счетчик пробега. Если не используется (или не удалось измерить по какой-либо причине), будет использоваться атрибут columnCount.

Надеюсь это поможет!

Ответ 2

Для gridlayout

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

программно:

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

пример: fooobar.com/questions/181059/...

для настройки gridview используйте этот метод:

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

Ответ 3

Сделайте следующее;

  • Используйте свой код для вычисления количества столбцов в onCreate или onCreateView. Учитывайте расстояние между столбцами.

  • Вызов setColumnCount на GridLayout с указанным выше счетчиком

  • В xml добавьте атрибут android:layout_columnWeight="1" ко всем элементам в GridLayout. Это приведет к расширению столбцов в API 21 и выше.

  • В pre API 21 вы можете либо горизонтально центрировать GridView, чтобы он выглядел прилично. Или еще лучше вычислить предпочтительную ширину столбца (gridWidth/columnCount) и выполнить итерацию всех элементов в сетке (ViewGroup) и установить их ширину в столбце Ширина.

Ответ 4

Было бы сложно сделать GridLayout делать то, что вам нужно:

  • Несмотря на то, что вы можете прочитать ширину экрана из DisplayMetrics, этот метод будет несовместим с новыми версиями Android, поддерживающими разделенный экран. Вам нужна ширина родительского представления, а не весь экран.

  • Даже если предположить, что показатели отображения дают вам надежную ширину для окна, отображающего вашу активность, эта логика будет разорваться, как только вы поместите макет в фрагмент рядом с другим фрагментом. Не имеет смысла создавать что-то настолько негибкое.

  • Ширина родительского представления неизвестна до завершения макета. Это не делает невозможным использование, просто сложно.

Простая вещь, которую нужно сделать, это использовать GridView который лучше разработан для этой цели, потому что у него есть опция autofit для количества столбцов.