我的MainActivity
中有一个打开FragmentA
的按钮。 FragmentA
覆盖了整个屏幕,但是我仍然看到MainActivity
中的按钮,并且仍然可以单击它。
我已尝试在片段布局中使用clickable
,但是它不起作用
MainActivty
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
val fragmentManager = this@MainActivity.supportFragmentManager
fragmentManager.beginTransaction()
.add(R.id.fragment_container, AFragment())
.addToBackStack(null)
.commit()
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:id="@+id/fragment_container">
<Button
android:text="Button Main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
</android.support.constraint.ConstraintLayout>
fragment_a.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:focusable="true">
android:background="@color/colorPrimary"
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="A"/>
</LinearLayout>
答案 0 :(得分:1)
之所以发生这种情况,是因为您将Button
放在了用作片段容器的ConstraintLayout
内。
当您像进行操作一样add
将片段插入容器时,它只是以与View
相同的方式添加片段。
因此,如果您将一个片段添加到已经拥有ConstraintLayout
作为孩子的Button
中,由于Button
允许,该片段将与ConstraintLayout
一起显示用于重叠视图。
这也是为什么如果您的容器是LinearLayout
,那么添加一个Fragment会将该片段放置在您的Button
下方的原因。
因此,考虑到这一点,解决方案是像对待Views一样处理它。
如果您将一个视图添加到布局中,并且另一个视图重叠,那么您将如何摆脱它呢?
最常见的解决方案是在添加片段时将Button的可见性设置为INVISIBLE或GONE。
另一种解决方案可能是提高Fragment的高度,因此它现在比您的Button
高。
当然,您也可以从“容器”中删除按钮并将其也放置在“片段”中。
这样,您可以在replace()
中使用FragmentManager
方法,用要显示的Button
替换包含Fragment
的片段。