Android片段中的按钮仍然可见

时间:2016-09-19 00:32:27

标签: android

我正在学习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时,我希望它不可见,但它仍然可见。

3 个答案:

答案 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>