Какой макет в настоящее время используется Пейзаж или Портрет?

1

Я столкнулся с проблемой, которую мне нужно решить, сделав свое представление разумным о том, какой тип представления используется в настоящее время.

У меня есть два макета, один для портрета и другой для пейзажа (земля).

  • MyFragmentLayout.xml
  • MyFragmentLayout.xml(land)

В настоящее время я настраиваю свой дочерний вид фрагмента с помощью некоторого отступа, и я хочу, чтобы вид знал, какой тип макета используется в настоящее время. (Портрет/Пейзаж). Это мой код, который я использовал:

 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 находится в портретном режиме (т.е.

Но приложение из-за доступного региона переключает макет из портретного режима в ландшафтный режим.

Изображение 174551 Как вы можете видеть, верхнее окно с красной полосой находится в портретном режиме, но приложение использует его в альбомной ориентации (что идеально подходит для моего случая).

Я хочу знать, как узнать, какой тип макета в настоящее время используется моим приложением, независимо от текущей ориентации мобильного телефона.

Теги:
kotlin
android-fragments
android-layout

2 ответа

1

Я не знаю, является ли это лучшим подходом, но вы можете присвоить своим макетам разные идентификаторы контейнеров и искать их в методе onViewCreated.

Например

  • MyFragmentLayout.xml:
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">
  • MyFragmentLayout.xml(land)
<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
}

Позвольте мне знать, если это помогает ;)

  • 1
    Проблема в том, что у меня инициация фрагмента в отдельном модуле, который недоступен для представления «Мой ребенок». И я не буду предпочитать такой подход, так как код будет хрупким. Спасибо, кстати, это сработало бы наверняка. Но в поисках лучшего подхода.
0

Мое текущее решение для этой проблемы, как показано ниже.

Я создал:

  • 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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню