在尝试设置一个带有对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用于另一个片段,我认为与该问题没有任何关系。希望有人可以帮助我。预先感谢!
答案 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上可能会有所不同。