Android: FragmentTransaction的add和replace的区别

什么是FragmentTransaction

如果你尝试过动态添加碎片,一定使用过类似于以下的代码

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 加载主界面的碎片
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.add(R.id.fragment, new MyFragment());
        // 或者这样
        //transaction.replace(R.id.fragment, new MyFragment())
        transaction.commit();
    }
}

FragmentTransaction允许你在与这个FragmentManager关联的Fragment上启动一系列编辑操作。

简短的来说,add方法添加碎片不会移除已经添加的碎片。但是replace会先清除所有碎片然后才添加新的碎片

Add

该方法有很多重载,贴出两个展示

public FragmentTransaction add (int containerViewId, Fragment fragment);
public FragmentTransaction add (int containerViewId, Fragment fragment, String tag);

containerViewId指定显示该Fragment的容器,而tag可以为添加的碎片指定一个标记,一种作用是通过FragmentManagerfindFragmentByTag(String tag)方法可以找到这个碎片。

添加一个fragment与往活动栈添加一个activity类似,add()并不会清空前一个添加的fragment。

注意事项

  • 不允许添加同一个fragment实例。
  • 添加进来的fragment都是可见的,后添加的fragment会展示在先添加的fragment上面,在绘制界面的时候会绘制所有可见的view。这会造成混乱,所以add一般会配合hide方法或者remove方法使用。
hide
public FragmentTransaction hide (Fragment fragment);

Hides an existing fragment. This is only relevant for fragments whose views have been added to a container, as this will cause the view to be hidden.

(隐藏现有碎片。这只与视图已添加到容器中的碎片相关,因为这将导致视图被隐藏。)

remove
public FragmentTransaction remove (Fragment fragment);

Remove an existing fragment. If it was added to a container, its view is also removed from that container.

(移除一个现有碎片。如果它已添加到容器,那么它的视图一样会从容器移除)

以下是使用的简短示例:

transaction.add(R.id.fragment_container, oneFragment).hide(twoFragment).commit();
Replace
public FragmentTransaction replace (int containerViewId, Fragment fragment);
public FragmentTransaction replace (int containerViewId, Fragment fragment, String tag);

Replace an existing fragment that was added to a container. This is essentially the same as calling remove(Fragment) for all currently added fragments that were added with the same containerViewId and then add(int, Fragment, String) with the same arguments given here.

(替换已添加到容器中的现有碎片。这与为所有当前添加的碎片调用remove(Fragment)基本相同,这些片段使用相同的containerViewId添加,然后使用此处给定的相同参数调用add(int,Fragment,String))

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 中,可以使用布局替换来动态更改视图的布局。以下是一些步骤: 1. 首先,定义一个父视图,该视图将包含两个或多个布局。例如,可以使用LinearLayout或RelativeLayout作为父视图。 2. 定义要替换的布局文件。例如,可以创建一个新的布局文件或重复使用现有的布局文件。 3. 在父视图中添加一个占位符视图,用于显示要替换的布局文件。可以使用FrameLayout、LinearLayout或RelativeLayout等视图来充当占位符。 4. 在代码中,使用FragmentTransaction类启动一个新的Fragment,并将其添加到占位符视图中。 5. 在Fragment中,使用onCreateView()方法加载要替换的布局文件。 6. 当需要更改布局时,使用FragmentTransaction类启动另一个Fragment,并将其替换为当前Fragment。可以使用replace()方法进行布局替换。 下面是一个简单的示例代码: 1. 定义父视图: ``` <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/placeholder" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout> ``` 2. 定义要替换的布局文件: ``` <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="This is the first layout." /> </LinearLayout> ``` 3. 在代码中启动Fragment: ``` FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); MyFragment firstFragment = new MyFragment(); fragmentTransaction.add(R.id.placeholder, firstFragment); fragmentTransaction.commit(); ``` 4. 在Fragment中加载布局文件: ``` @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.my_layout, container, false); } ``` 5. 更改布局: ``` FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); MyFragment secondFragment = new MyFragment(); fragmentTransaction.replace(R.id.placeholder, secondFragment); fragmentTransaction.commit(); ``` 注意,以上示例代码仅供参考,实际实现可能会因您的具体需求而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值