#android #android_textview #android_linearlayout #height #width
У меня есть компоновка LinearLayout вертикальной ориентации, в которой находятся
9 компоновок LinearLayout горизонтальной ориентации, в каждой из которых по 9 TextView
(итого 9 * 9 = 81 элемент TextView). Для грамотной реализации этого творчества я создаю
по 9 горизонтальных компоновок LinearLayout и по 9 TextView в каждой из них в Java-коде,
а затем, соответственно, добавляю их в основную компоновку компонента Activity примерно так:
for (int y = 8; y >= 0; y--) {
LinearLayout mLinearLayout_row = ...//компоновка горизонтальной ориентации
for (x = 0; x < 9; x++) {
TextView mTextView = layoutInflater.inflate(R.layout.mtextview, ...
mLinearLayout_row.addView(mMTextView);
}
myMainActivityLayout.addView(mLinearLayout_row, 0);
}
Все компоновки имеют длину MATCH_PARENT, а высоту WRAP_CONTENT. Вот код mtextview.xml:
На экране ширИны всех элементов TextView выглядят равными (если не вглядываться).
Но на самом деле система Android задаёт ширину нескольким последним элементам с правой
стороны во всех рядах чуть меньшую ширину - это система вычисляет алгоритмом за счёт
известного значения атрибута layout_weight у всех TextView.
Теперь перейду к проблеме. У меня не получается сделать элементы TextView квадратными,
таблица выглядит приплюснутой.
Я пробовал следующие способы:
Использовать кастомный TextView, в классе которого переопределив метод onMeasure:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, widthMeasureSpec);
}
Метод очень плох, так как элементы то делаются квадратными, но слева они большие,
а справа маленькие - это очень некрасиво выглядит.
Использовать кастомную основную компоновку LinearLayout, в классе которой переопределив
метод onMeasure (так же, как в п.1) и установив значение атрибута layout_height у TextView
на match_parent - вообще никаких изменений.
В коде компонента Activity, в которой всё это происходит, переопределить метод onResume,
в котором пытаться получить ширину всех TextView и задать им высоту, равную известной
ширине... в общем-то способ не профессиональный и не оптимальный, по моему мнению,
но, несмотря на это, я попробовал использовать этот способ, а оказалось, что, когда
вызывается метод onResume система ещё не знает ширину элементов!!! (значение функции
mTextView.getWidth(), полученное в этом методе равно 0).
Сожалею, что нереально тяжело въехать, в чём же у меня заключается проблема, но я
постарался максимально подробно и корректно описать её :).
Ответы
Ответ 1
Для того, чтобы сделать ячейки масшатбируемыми и квадратными, можно использовать свойство соотношения сторон app:layout_constraintDimensionRatio в ConstraintLayout:Это позволит вам сделать ячейки квадратными, вне зависимости от расширения экрана, т.к. они просто ужмутся по высоте и ширине Но я предлагаю пойти вам дальше и переверстать экран с помощью recyclerView (как предложил Виталий в комментариях). Во-первых, это избавит вас от проблемы адресации к этим ячейкам, ведь их нужно будет заполнять и считывать. А во-вторых, реализация с RecycelerView будет эстетичнее (в разметке RecyclerView + адаптер + ViewHolder - вы сами убедитесь в простоте такой реализации). Установив размер 1 в item RecyclerView, вы автоматически его установите всем ячейкам. Адаптер для RecyclerView стандартный, но нужно переопределить LayouManager. Создаете LayoutManager, наследуете его от GridLayoutManager (можно внутри адаптера): private static class NonScrollableGridLayoutManager extends GridLayoutManager { NonScrollableGridLayoutManager(Context context, int span) { super(context, span); } @Override public boolean canScrollVertically() { return false; } @Override public boolean canScrollHorizontally() { return false; } } В адаптере создаете метод, возвращающий объект LayoutManager: public static RecyclerView.LayoutManager getLayoutManager(Context context) { return new NonScrollableGridLayoutManager(context, COUNT_OF_ITEM_IN_LINE); } Затем устанавливаете для RecyclerView ваш LayoutManager: binding.monthContent.setLayoutManager(CalendarAdapter.getLayoutManager( binding.getRoot().getContext())); binding.monthContent.setAdapter(daysAdapter); binding.monthContent.setItemAnimator(null); Не правда ли удобно?
Комментариев нет:
Отправить комментарий