CoordinatorLayout, очевидно, имеет параметры FrameLayout - PullRequest
0 голосов
/ 25 октября 2018

Пытаясь установить BottomSheetBehavior с соответствующим обратным вызовом для CoordinatorLayout, я наткнулся на это.При получении параметров макета указанного CoordinatorLayout я продолжаю получать параметры FrameLayout.Это ситуация для кода.

Из реализации BottomSheetDialogFragment

override fun setupDialog(dialog: Dialog?, style: Int) {
    super.setupDialog(dialog, style)
    val binding = DataBindingUtil.inflate<AmbientDialogBinding>(LayoutInflater.from(activity), R.layout.ambient_dialog, null, false)
    val params = activity?.findViewById<CoordinatorLayout>(R.id.homeCoordinatorLayout)?.layoutParams as CoordinatorLayout.LayoutParams
    val behaviour = params.behavior
    if (behaviour != null && behaviour is BottomSheetBehavior) {
        behaviour.setBottomSheetCallback(behaviorCallback)
    }
}

main_activity.xml

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/homeCoordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/lightGray"
app:layout_behavior="@string/bottom_sheet_behavior"
tools:context=".HomeActivity">

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="@color/colorPrimary"
    android:elevation="4dp"
    android:theme="@style/Base.ThemeOverlay.AppCompat.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="?attr/actionBarSize" />

<android.support.design.widget.FloatingActionButton
    android:id="@+id/addAmbientButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|center"
    android:layout_marginBottom="8dp"
    android:clickable="true"
    android:focusable="true"
    app:backgroundTint="@color/colorPrimary"
    app:srcCompat="@drawable/ic_add_white_24dp" />

</android.support.design.widget.CoordinatorLayout>

фрагмент_dialog.xml

<android.support.v7.widget.LinearLayoutCompat
        android:id="@+id/ambientDialogTextLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        android:orientation="vertical">

        <EditText
            android:id="@+id/ambientIdField"
            android:layout_width="match_parent"
            android:layout_height="56dp"
            android:layout_marginStart="16dp"
            android:layout_marginEnd="16dp"
            android:gravity="center"
            android:hint="Identificativo Ambiente"
            android:text="@={vm.UIDLive}"
            android:textSize="16sp" />

        <EditText
            android:id="@+id/ambientNameField"
            android:layout_width="match_parent"
            android:layout_height="56dp"
            android:layout_marginTop="16dp"
            android:layout_marginStart="16dp"
            android:layout_marginEnd="16dp"
            android:gravity="center"
            android:hint="Nome Ambiente"
            android:text="@={vm.nameLive}"
            android:textSize="16sp" />

        <android.support.design.widget.FloatingActionButton
            android:id="@+id/confirmAmbientButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|center"
            android:layout_marginTop="8dp"
            android:layout_marginBottom="8dp"
            android:clickable="true"
            android:focusable="true"
            app:backgroundTint="@color/colorPrimary"
            app:srcCompat="@drawable/ic_check_white_24dp" />

</android.support.v7.widget.LinearLayoutCompat>

FrameLayout, который я использую в основном упражнении, xml используется для другого фрагмента, который, я думаю, не имеет никакого отношения к проблеме.Надеюсь, кто-нибудь может мне помочь.Заранее спасибо!

1 Ответ

0 голосов
/ 25 октября 2018

Я еще не подтвердил это, но я полагаю, что View, который вы передаете setContentView() (или разметка res, который становится раздутым), добавляется к FrameLayout.

LayoutParams представления определяются его родителемне этим.Так что если у вас есть LinearLayout в ConstraintLayout, вызов linearLayoutInstance.layoutParams вернет экземпляр ConstraintLayout.LayoutParams.

Я знаю, однако, что setContentView() добавляет ваш макет в ViewGroup.Не может быть гарантировано, что корневой макет является FrameLayout.Вы не должны разыгрывать getParams() в своем корневом представлении, а вместо этого полагаться на возврат по умолчанию ViewGroup.LayoutParams.

РЕДАКТИРОВАТЬ:

Вы можете увидеть список возможных раскладок здесь: https://github.com/aosp-mirror/platform_frameworks_base/blob/master/core/java/com/android/internal/policy/PhoneWindow.java#L2541.

com.android.internal.R.content - это идентификатор корня.

Если посмотреть на этот список и соответствующие XML-файлы, вот список потенциальных типов корневого макета:

  • R.layout.screen_swipe_dismiss -> com.android.internal.widget.SwipeDismissLayout
  • R.layout.screen_title_icons -> FrameLayout
  • R.layout.screen_progress -> FrameLayout
  • R.layout.screen_custom_title -> FrameLayout
  • R.layout.screen_action_bar -> FrameLayout
  • R.layout.screen_title -> FrameLayout
  • R.layout.screen_simple_overlay_action_mode -> FrameLayout
  • R.layout.screen_simple -> FrameLayout

Вы даже можете определить свой собственный атрибут dialogCustomTitleDecorLayout (хотя он недоступен для приложений).Это также только из последнего исходного кода AOSP.Это может быть не так в Samsung, Huawei и т. Д. Или в других версиях Android.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...