RecyclerView не отображает настраиваемую кнопку

Я создал собственный подкласс AppCompatButton под названием SquareButton, который заставляет кнопку быть квадратной. Код этого подкласса был найден здесь: https://stackoverflow.com/a/36991823/7648952.

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

SquareButton.java:

import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.support.v7.widget.AppCompatButton;
import android.util.AttributeSet;

public class SquareButton extends AppCompatButton {

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

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

    public SquareButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int width = MeasureSpec.getSize(widthMeasureSpec);
        int height = MeasureSpec.getSize(heightMeasureSpec);
        int size = width > height ? height : width;
        setMeasuredDimension(size, size);
    }
}

Снимок экрана, на котором SquareButton работает при накачивании за пределами RecyclerView: RecyclerView не отображает настраиваемую кнопку

Снимок экрана SquareButton, который не отображается внутри RecyclerView: RecyclerView не отображает настраиваемую кнопку

Снимок экрана обычной кнопки, работающей внутри RecyclerView: RecyclerView не отображает настраиваемую кнопку

Мне кажется такое поведение странным. Любая помощь приветствуется.

0
0
45
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте этот блок кода:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int width = MeasureSpec.getSize(widthMeasureSpec);
    int height = MeasureSpec.getSize(heightMeasureSpec);
    if (width > height){
        setMeasuredDimension(getMeasuredHeight(), getMeasuredHeight());
    }else {
        setMeasuredDimension(getMeasuredWidth(), getMeasuredWidth());
    }
}

В этом случае вы установите widthMeasureSpec или heightMeasureSpec вместо прямого значения ширина или высота.

Это сработало! Единственное, что я изменил в вашем коде, - это заменить getMeasuredHeight () и getMeasured \ width () в операторе if / else внизу. Ценю вашу помощь.

sbearben 01.05.2018 20:57

Другие вопросы по теме