Невозможно установить гравитацию с помощью setGravity вертикально программно.Это ошибка Android или функция? - PullRequest
1 голос
/ 11 января 2012

У меня есть пользовательский вид с четырьмя кнопками.Я создал представление в Java, потому что я хочу анимировать кнопки.Я хочу центрировать текст на кнопках, но я могу сделать это только по горизонтали (слева направо), но не по вертикали.Текст прилипает к вершине.

Вот самый основной код, который я мог бы получить:

public class CopyOfGameView extends ViewGroup implements View.OnClickListener {

    private Main main;

    public CopyOfGameView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

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

    public void reset(Main main) {
        this.main = main;
        removeAllViews();

        for (int c = 0; c < 4; c++) {
            ButtonView buttonView = new ButtonView(getContext(), c);
            buttonView.setText("x");
            buttonView.setTextSize(6);
            buttonView.setGravity(Gravity.CENTER);
            addView(buttonView);
        }
    }
        @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        int w = getWidth();
        int h = getHeight();
        int oneFourth = h / 4;

        int count = getChildCount();
        for (int i = 0; i < count; i++) {
            ButtonView buttonView = (ButtonView) getChildAt(i);
            int left = 0;
            int top = oneFourth * buttonView.getRow();
            int right = w;
            int bottom = oneFourth * buttonView.getRow() + oneFourth;
            buttonView.layout(left, top, right, bottom);
        }
    }

    public void onClick(View v) {}

    protected ButtonView findButtonView(int row) {
        int count = getChildCount();
        for (int i = 0; i < count; i++) {
            View v = getChildAt(i);
            if (v instanceof ButtonView) {
                ButtonView buttonView = (ButtonView) v;
                if (buttonView.getRow() == row) {
                    return buttonView;
                }
            }
        }
        return null;
    }

    protected class ButtonView extends Button {
        private int row;

        protected ButtonView(Context context, int row) {
            super(context);
            this.row = row;

            Drawable image = getResources().getDrawable(R.drawable.btn_black);
            setBackgroundDrawable(image);
            setClickable(true);
            setOnClickListener(CopyOfGameView.this);
        }

        public int getRow() {
            return row;
        }

        public void setRow(int row) {
            this.row = row;
        }
    }
}

Это нормально или это ошибка в Android?Как я могу центрировать текст по вертикали?

Ответы [ 4 ]

1 голос
/ 04 февраля 2013

Проект был восстановлен под другим именем, и за один год работы я смог решить эту проблему. Я также реализовал AutoResizeTextView, потому что это соответствует проекту. Я взял AutoResizeTextView из следующего поста: Автоматическое масштабирование текста TextView для размещения в границах

Но мне пришлось изменить его, так как это решение применяет измеренные размеры в методе onLayout. Но мне нужны были размеры при измерении, поэтому я переместил эту логику с onLayout на onMeasure.

По сути, я унаследовал ButtonView от LinearLayout, дал ему дочерний элемент AutoResizeTextView и поиграл с Android Measureuring (onMeasure, onLayout и layout).

Помните, я не мог использовать решение Чейза унаследовать весь View от LinearLyout, потому что я анимировал ButtonViews.

Подробности об измерении: я измерил ButtonView в onMeasure CopyOfGameView, затем измерил AutoResizeTextView в onMeasure ButtonView. Затем в методе разметки ButtonView я отцентрировал TextView вертикально.

0 голосов
/ 17 сентября 2012

Можете ли вы добавить больше деталей? я считаю, что вам нужно указать это

setLayoutParams (новый LayoutParams ( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

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

setLayoutParams (новый LayoutParams ( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); так что вам больше не нужно его настраивать ....

пожалуйста, добавьте скриншот ... чтобы мы могли вам помочь:)

0 голосов
/ 06 ноября 2012

вам нужно установить параметры макета следующим образом

LayoutParams lp;lp = (LayoutParams) buttonView.getLayoutParams(); lp.gravity = Gravity.CENTER; buttonView.setLayoutParams(lp);

0 голосов
/ 11 января 2012

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

Что, вероятно, происходит с вашими кнопками, так это то, что высота макета установлена ​​для переноса содержимого, что делает их только такими же высокими, как и текст при измерении. Это приведет к тому, что текст будет выровнен вертикально вверх, даже если вы укажете центр тяжести. Чтобы это исправить, вам нужно будет рассчитать и установить размеры (высоту и ширину LayoutParams) ваших представлений кнопок (вызов buttonView.layout() не сделает этого).

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

...