有这个标记:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="20dp"
android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/dialog_background">
<TextView
android:id="@+id/txt_view1"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentTop="true"
android:gravity="center_horizontal|center_vertical"
android:text="@string/change_status"
android:textColor="@color/gray"
android:textSize="16sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/view1"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/test_color"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/txt_view1" />
<ListView
android:id="@+id/status_list"
android:layout_width="match_parent"
android:layout_height="400dp"
android:overScrollMode="never"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/view1"/>
<View
android:id="@+id/view2"
android:layout_width="match_parent"
android:layout_height="0.8dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/status_list"
android:background="@color/test_color" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/view2"
android:orientation="horizontal"
android:weightSum="10">
<TextView
android:id="@+id/remove_note"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="4.98"
android:gravity="center_vertical|center_horizontal"
android:text="@string/delete_mess"
android:textColor="#CD0000"
android:textSize="16sp" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.04"
android:background="@color/test_color" />
<TextView
android:id="@+id/add_note_to_archive"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="4.98"
android:gravity="center_vertical|center_horizontal"
android:text="@string/archive_menu_item"
android:textColor="@color/gray"
android:textSize="16sp" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/cancel_dialog"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="10dp"
android:background="@drawable/dialog_background"
android:gravity="center_horizontal|center_vertical"
android:text="@android:string/cancel"
android:textColor="@color/colorAccent"
android:textSize="16sp" />
</LinearLayout>
片段中有一个列表及其适配器。列表元素有一个视图,单击时会显示一个对话框:
holder.changeStatusTv.setOnClickListener {
val dialogue = Dialog(ctx)
dialogue.setContentView(R.layout.note_status_dialogue)
val window = dialogue.window
val wlp = window!!.attributes
wlp.gravity = Gravity.BOTTOM
window.attributes = wlp
dialogue.findViewById<View>(R.id.remove_note).setOnClickListener {
showDialogue(1, recordModel.id, holder.adapterPosition)
dialogue.dismiss()
}
dialogue.findViewById<View>(R.id.add_note_to_archive).setOnClickListener {
showDialogue(2, recordModel.id, holder.adapterPosition)
dialogue.dismiss()
}
if (statusList[0] == ctx.resources.getString(R.string.all_records_notepad)) {
statusList.removeAt(0)
}
val list: ListView = dialogue.findViewById(R.id.status_list)
for (i in 0 until statusList.size) {
if (statusList.size > ctx.resources.getStringArray(R.array.basic_status_list).size) {
if (i < ctx.resources.getStringArray(R.array.basic_status_list).size) {
if (statusList[i] == ctx.resources.getStringArray(R.array.basic_status_list)[i]) {
statusList[i] = ctx.resources.getStringArray(R.array.status_list)[i]
}
}
} else {
if (statusList[i] == ctx.resources.getStringArray(R.array.basic_status_list)[i]) {
statusList[i] = ctx.resources.getStringArray(R.array.status_list)[i]
}
}
}
list.adapter = ArrayAdapter(ctx, R.layout.note_status_layout, R.id.textItem, statusList)
list.onItemClickListener = AdapterView.OnItemClickListener { _, _, position, _ ->
changeStatus(recordModel.id, position)
dialogue.dismiss()
}
dialogue.setCanceledOnTouchOutside(false)
dialogue.findViewById<View>(R.id.cancel_dialog).setOnClickListener {
dialogue.dismiss()
}
Objects.requireNonNull<Window>(dialogue.window).setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
dialogue.show()
}
问题的本质是在api版本为26(8.0)的模拟器上,这个对话框被正确放置在父级的宽高中:
而在 api 版本 28 (9.0) 的模拟器上,对话框是根据父级的高度放置的,而宽度的行为令人费解:
然后我在真实设备上尝试:android 10.0 和 6.0.1,情况与第二个模拟器上的情况相同,尽管轴的版本不同。总的来说,我无法理解这个布局发生了什么,也许有人会有建议或某处有错误?)


最后,我仍然不明白这个标记发生了什么:) 但是我们设法解决了这个问题,我们在创建对话框时添加了窗口参数:
但事实证明,窗口是屏幕的整个宽度,我正在尝试实现浮动窗口的效果。为此,请放入 xml 边距:
一切都很美好。
PS如果有人理解这种行为的原因,如果你解释问题是什么,我会很高兴:)