SetPeekHeight () в java не дает того же результата, что и в xml

Я работаю с нижними таблицами в своем приложении.

<include
        android:layout_height = "wrap_content"
        android:layout_width = "wrap_content"
        layout = "@layout/layout_book"

        app:layout_behavior = "@string/bottom_sheet_behavior"
        app:behavior_peekHeight = "0dp"
        />

Это мой нижний лист, и когда я изменяю высоту взгляда с этого xml на 120dp, я получаю правильный вид. Но когда я пытаюсь сделать то же самое из java, я получаю другой результат, т.е. высота меньше, чем из xml.

bottomSheetBehavior.setPeekHeight(120);

В идеале этого не должно было быть. Я понятия не имею об этом. Спасибо.

Предположительно, вы на самом деле не передаете 120dp этому вызову метода. Что именно вы проходите?

Ben P. 28.10.2018 19:56

@BenP. Я передаю 120, поскольку значение int было обязательным аргументом

Ladoo 28.10.2018 19:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
380
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

setPeekHeight() (и многие другие методы, связанные с размером / размером) принимают значения пиксель в качестве своих аргументов. Это означает, что вам сначала нужно преобразовать значение dp в px. Лучший способ сделать это - определить значение ресурса dimen, а затем получить его в коде:

<dimen name = "peek_height">120dp</dimen>
int peekHeightPx = context.getResources().getDimensionPixelSize(R.dimen.peek_height);
bottomSheetBehavior.setPeekHeight(peekHeightPx);

В качестве альтернативы вы можете использовать DisplayMetrics для самостоятельного расчета:

int peekHeightPx = (int) (context.getResources().getDisplayMetrics().density * 120);
bottomSheetBehavior.setPeekHeight(peekHeightPx);

Только сейчас я получил решение.

Ladoo 28.10.2018 20:23

bottomSheetBehavior.setPeekHeight (R.dimen.peek_height); тоже работал. Спасибо

Ladoo 28.10.2018 20:24

Это не должно работать. R.dimen.peek_height - это int, поэтому он должен компилироваться, но значение этого int может быть чем-то совершенно случайным. В отличие от, например, TextView.setText(), в BottomSheetBehavior нет встроенного метода, который разрешает идентификаторы ресурсов.

Ben P. 28.10.2018 20:25

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

Ladoo 28.10.2018 20:31

Я буквально слаб в понятиях андроида.

Ladoo 28.10.2018 20:33

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