CoordinatorLayout显然具有FrameLayout参数

时间:2018-10-25 19:23:33

标签: android kotlin

在尝试设置一个带有对CoordinatorLayout的适当回调的BottomSheetBehavior时,我偶然发现了这一点。当获取所述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>

fragment_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>

我在主活动xml中使用的FrameLayout用于另一个片段,我认为与该问题没有任何关系。希望有人可以帮助我。预先感谢!

1 个答案:

答案 0 :(得分:1)

我还没有证实这一点,但是我相信您传递给com.sun.org.apache.xerces.internal.dom.ElementNSImpl的View(或夸大的版图分辨率)已添加到FrameLayout中。

视图的LayoutParam由其父级而不是其父级定义。因此,如果ConstraintLayout中有LinearLayout,则调用setContentView()将返回ConstraintLayout.LayoutParams的实例。

不过,我确实知道linearLayoutInstance.layoutParams会将布局添加到ViewGroup。不能保证根布局是FrameLayout。您不应该在根视图上投放setContentView(),而应依赖于ViewGroup.LayoutParams的默认返回值。

编辑:

您可以在此处查看可能的布局列表:https://github.com/aosp-mirror/platform_frameworks_base/blob/master/core/java/com/android/internal/policy/PhoneWindow.java#L2541

getParams()是根的ID。

查看该列表和相应的XML文件,以下是潜在的根布局类型的列表:

  • com.android.internal.R.content-> 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属性定义自己的属性(尽管应用程序不可用)。这也仅来自最新的AOSP源代码。在三星,华为等或其他版本的Android上可能会有所不同。