我正在学习Android,并且遇到了Fragments的问题。我有一个简单的项目,有两个按钮和一个"片段占位符"在主要活动中。我在项目中添加了两个片段。按下button1时,fragment1被加载到片段占位符中。当按下按钮2时,fragment2被加载到片段占位符。
我遇到的问题是,当我向fragment1添加一个按钮时,当我按下button2以使用fragment2填充片段占位符时,该按钮仍然可见。其他视图(如复选框或纯文本编辑器)不会发生这种情况。
是否需要一些技巧来确保按钮属于某个片段,并且仅在该片段可见时显示?
这是我对fragment1的布局:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="layout.FragmentOne">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello_fragment_one"
android:background="#75e300"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Button"
android:id="@+id/button3"
android:layout_gravity="left|center_vertical"/>
</FrameLayout>
这是我对fragment2的布局:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="layout.FragmentTwo">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello_fragment_two"
android:background="#cc2525"/>
</FrameLayout>
这是我的主要活动的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="fragmentexample.MainActivity"
android:orientation="vertical">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Fragment1"
android:id="@+id/button"
android:onClick="ChangeFragment"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Fragment2"
android:id="@+id/button2"
android:onClick="ChangeFragment"/>
<fragment
android:id="@+id/fragment_place"
android:name="layout.FragmentOne"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout="@layout/fragment_fragment_two"/>
</LinearLayout>
这就是我改变片段的方式:
public void ChangeFragment(View view)
{
Fragment fragment =
(view == findViewById(R.id.button)) ? new FragmentOne() : new FragmentTwo();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_place, fragment)
.commit();
}
我无法弄清楚为什么button3始终可见。当我切换到fragment2时,我希望它不可见,但它仍然可见。
答案 0 :(得分:2)
我知道现在回答它已经很晚了,但仍然在寻找答案:
在另一个布局中包裹按钮和其他元素,如上述问题,请执行以下操作:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="fragmentexample.MainActivity"
android:orientation="vertical">
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Fragment1"
android:id="@+id/button"
android:onClick="ChangeFragment"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Fragment2"
android:id="@+id/button2"
android:onClick="ChangeFragment"/>
</LinearLayout>
<fragment
android:id="@+id/fragment_place"
android:name="layout.FragmentOne"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout="@layout/fragment_fragment_two"/>
</LinearLayout>
答案 1 :(得分:0)
您的问题是您将片段作为XML布局的一部分包含在内。 https://developer.android.com/training/basics/fragments/creating.html#AddInLayout上的Android文档说明如下:
注意:通过定义片段将片段添加到活动布局 在布局XML文件中的片段,您无法删除片段 运行。如果您打算在用户期间将片段交换进出 交互时,必须将片段添加到活动时 活动首先使用代码开始。
因此,请将XML中的fragment
更改为View
,然后使用FragmentManager
将fragment1添加到其中。
答案 2 :(得分:0)
我遇到了同样的问题,但只有按钮,我的视图的其他元素没有显示。所以我所做的就是将按钮放在布局中,并使其工作。我不知道这是不是一个好的解决方案。
<android.support.v7.widget.LinearLayoutCompat
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/loginConfirmPassEditText">
<Button
android:id="@+id/registerBtn"
android:layout_width="170dp"
android:layout_height="wrap_content"
android:backgroundTint="@color/colorPrimary"
android:text="@string/singUpBtn"
android:textColor="@color/colorWhite" />
</android.support.v7.widget.LinearLayoutCompat>