Пользовательский элемент управления Layout - PullRequest
0 голосов
/ 28 июля 2011

Я пытаюсь сделать пользовательский элемент управления макетом похожим на LinearLayout, но я хочу, чтобы все элементы управления внутри переносились.Это как LinearLayout, но с упаковкой.Итак, я взял пример с Android, который является FixedGridControl и начал изменять его.Это работает, но у меня есть проблема.

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

enter image description here

Источник моего класса FixedGridLayout:

package com.projects;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;

public class FixedGridLayout extends ViewGroup {

    int mCellWidth = 160;
    int mCellHeight = 120;

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

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int cellWidthSpec = MeasureSpec.makeMeasureSpec(mCellWidth, MeasureSpec.AT_MOST);
        int cellHeightSpec = MeasureSpec.makeMeasureSpec(mCellHeight, MeasureSpec.AT_MOST);

        int count = getChildCount();
        for (int index = 0; index < count; index++) {
            final View child = getChildAt(index);
            child.measure(cellWidthSpec, cellHeightSpec);
        }
        int minCount =  count > 3 ? count : 3;
        setMeasuredDimension(resolveSize(mCellWidth * minCount, widthMeasureSpec),
                resolveSize(mCellHeight * minCount, heightMeasureSpec));
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        int cellWidth = mCellWidth;
        int cellHeight = mCellHeight;
        int columns = (right - left) / cellWidth;
        if (columns < 0) {
            columns = 1;
        }
        int x = 0;
        int y = 0;
        int i = 0;
        int count = getChildCount();
        for (int index = 0; index < count; index++) {
            final View child = getChildAt(index);
            child.layout(x, y , x + cellWidth, y + cellHeight);
            if (i >= (columns - 1)) {
                i = 0;
                x = 0;
                y += cellHeight;
            } else {
                i++;
                x += cellWidth;
            }
        }
    }
}

XML-код макета, который я использую для тестирования:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
    <com.projects.FixedGridLayout android:layout_width="600dp" android:layout_height="300dp">
       <Button android:text="Line1 Line2" android:gravity="center_horizontal|center_vertical" />
       <Button android:text="Line1 Line2 Line3" android:gravity="center_horizontal|center_vertical" />
       <Button android:text="Line1" android:gravity="center_horizontal|center_vertical" />
       <Button android:text="Line1" android:gravity="center_horizontal|center_vertical" />
       <Button android:text="Line1 Line2" android:gravity="center_horizontal|center_vertical" />
       <Button android:text="Line1 Line2 Line3" android:gravity="center_horizontal|center_vertical" />
       <Button android:text="Line1" android:gravity="center_horizontal|center_vertical" />
       <Button android:text="Line1" android:gravity="center_horizontal|center_vertical" />
    </com.projects.FixedGridLayout>
</LinearLayout>

Код класса FixedGridLayout является раздетым, слегка измененным и упрощенным для целей моего приложения, и этот вопрос: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/animation/FixedGridLayout.html

1 Ответ

1 голос
/ 29 июля 2011

Если вы хотите сделать что-то подобное, вам следует рассмотреть использование Grid View.http://developer.android.com/resources/tutorials/views/hello-gridview.html

Кроме того, вы можете просто сделать android: gravity = "center", и вы получите как center_horizontally, так и center_vertical

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...