Какой макет в настоящее время используется Пейзаж или Портрет? - PullRequest
1 голос
/ 06 марта 2019

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

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

  • MyFragmentLayout.xml
  • MyFragmentLayout.xml (земля)

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

 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)

Над работой идеально подходит для смены ориентации.

Проблема:

Я поддерживаю многооконный режим для своего приложения. И проблема, с которой я сталкиваюсь, заключается в том, что Окно находится в портретном режиме (т.е. ориентация - Портрет)

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

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

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

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Я не знаю, является ли это лучшим подходом, но вы можете присвоить своим макетам разные идентификаторы контейнеров и искать эти идентификаторы в методе 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
}

Дайте мне знать, если это поможет;)

0 голосов
/ 06 марта 2019

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

Я создал:

  • dimens.xml (/ папка значений)

  • dimens.xml (земля) (папка / values-land)

Для хранения Padding Dimension для различных типов макетов (книжная и альбомная).

val verticalPadding = context.resources
                             .getDimension
                             .getDimension(R.dimens.vertical_padding)

Это лучший подход, который я нашел. Я ищу лучший подход, которым я могу управлять с помощью JAVA/Kotlin кода и , а не отдельных файлов XML

В вышеуказанном решении, когда приложение решает использовать MyFragmentLayout.xml (land) (Ландшафтный макет), затем автоматически принимает размеры приложения от размеры (земля)

...