Я столкнулся с проблемой, которую мне нужно решить, сделав свое представление разумным о том, какой тип представления используется в настоящее время.
У меня есть два макета, один для портрета и другой для пейзажа (земля).
В настоящее время я настраиваю свой дочерний вид фрагмента с помощью некоторого отступа, и я хочу, чтобы вид знал, какой тип макета используется в настоящее время. (Портрет/Пейзаж). Это мой код, который я использовал:
val verticalPadding = if (context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE)
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50f, displayMetrics)
else
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150f, displayMetrics)
Выше работа отлично подходит для смены ориентации.
Проблема:
Я предоставляю поддержку Multi-Window моему приложению, и проблема, с которой я сталкиваюсь, заключается в том, когда Window находится в портретном режиме (т.е.
Но приложение из-за доступного региона переключает макет из портретного режима в ландшафтный режим.
Как вы можете видеть, верхнее окно с красной полосой находится в портретном режиме, но приложение использует его в альбомной ориентации (что идеально подходит для моего случая).
Я хочу знать, как узнать, какой тип макета в настоящее время используется моим приложением, независимо от текущей ориентации мобильного телефона.
Я не знаю, является ли это лучшим подходом, но вы можете присвоить своим макетам разные идентификаторы контейнеров и искать их в методе onViewCreated.
Например
androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/portraitContainer"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/landscapeContainer"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent">
Затем в вашем методе onViewCreated:
View v = view.findview(R.id.portraitContainer)
if (v !=null){
// portrait layout loaded
} else{
// landscape layout loaded
}
Позвольте мне знать, если это помогает ;)
Мое текущее решение для этой проблемы, как показано ниже.
Я создал:
dimens.xml
(папка /values)
dimens.xml
(land) (/values-land folder)
Хранить Padding Dimension
для разного типа макета (книжный и альбомный).
val verticalPadding = context.resources
.getDimension
.getDimension(R.dimens.vertical_padding)
Это лучший подход, который я нашел. Я ищу лучший подход, который я могу контролировать с помощью кода JAVA/Kotlin
а не отдельными файлами XML
В вышеуказанном решении, когда приложение выбирает использование MyFragmentLayout.xml(land) (альбомная компоновка), тогда приложение автоматически берет размеры из измерений (land)