我们经常使用碎片,并且知道他可以动态的替换,但是你知道他可以使用那些方法进行替换,add方法又是怎么使用吗。下面我罗列了一下常用的使用方法。
- relpleac:替换碎片
这个方法在执行的时候会将之前的碎片给清空掉。也就是说当你在用这个方法动态添加碎片的时候,他会将容器里面的所有碎片全部清空,生命周期直接销毁。然后将你要replace的碎片进行显示。
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.content_main, new Fragment_01())
.commit();
注意:假如说你容器里面只有一个碎片实例,当你在次添加和容器里面实例相同碎片的时候,他不会清除容器里面的碎片,而是使用容器里面的实例。因为两个碎片的实例一样,所以他不会进行添加。
如下所示:
case R.id.sliding_btn2:
if (fragment02 == null) {
fragment02 = new Fragment_02();
System.out.println("--------------------");
}
fragment02.setData(fragment02);
getSupportFragmentManager().beginTransaction().replace(R.id.content_main, fragment02).commit();
break;
当我点击按钮动态添加碎片,第一次点击按钮他会创建一个碎片对象,进行添加。当第二次点击按钮的时候他使用的是第一次添加时候的实例。如果是这样写的,那么他第二次和以后就不会进行碎片的添加,除非重新new一个碎片的实例,或者清空容器。
- add:添加碎片
这个方法和replace完全不同,他会在容器原有的基础上进行添加。也就是说 当你使用add方法的时候,他不会清空容器内原有的碎片,而是继续添加进去。有一个问题需要说明,如果你原来显示的碎片是replace进去的,当你再次使用add方法添加的时候,他不会替换原来的碎片,而是会显示在原来碎片的上面。
有两种方法可以解决:
- 每次动态添加碎片的时候都使用add方法添加,然后就是调用hide和show进行隐藏和显示,hide和show用法会在下面说。
- 可以想办法获取到原来碎片的实例,然后调用hide方法隐藏原来的碎片,这样就会只显示当前add的碎片。
使用add添加如下所示
getActivity().
getSupportFragmentManager()
.beginTransaction()
.add(R.id.content_main, frag2_mpchart)
.commit();
因为我是在activity里面的碎片里面添加碎片所以使用的getActivity。当前这个add这样使用是没有价值的。等会会配合隐藏和显示进行说明。
- hide:隐藏碎片
private void hide(FragmentTransaction transaction){
if (fragment_02 != null){
Log.e("demo",""+fragment_02);
transaction.hide(fragment_02);
}
if (frag2_mpchart != null){
transaction.hide(frag2_mpchart);
}
}
- show:显示碎片
FragmentTransaction transaction = getActivity().
getSupportFragmentManager().beginTransaction();
transaction.add(R.id.content_main,frag2_mpchart).show(frag2_mpchart);
这个就代表着 先进行add,然后show。当然,最后肯定还有个提交commit()
在说怎么使用add的时候,我们先要知道他是用来干什么的。
- 首先,我们有一个需求,现在有一个碎片正在显示,他上面有一个按钮,和一些数据,当我点击按钮的时候切换到别的碎片中,同时我还想让原来碎片上的数据不会丢失。这样可能要用到add动态添加碎片
- 还有一个非常典型的例子。导航栏,当前页面的最下面是好几个按钮,上面则是一个布局,用来显示碎片的内容。当我点击下面导航栏按钮的时候,进行碎片的切换,同时我还想让原来显示的碎片上面的数据不会消失,在这种需求下就可以使用add动态添加。
add的使用方法:
每次添加碎片的时候都必须让容器里面的碎片全部隐藏,再让你对应的碎片进行显示。对应的就是hide和show方法。
- 首先,有三个按钮,三个碎片,以及一个要显示碎片的布局。这些我就不多说了。下面分别是布局和点击按钮初始化
<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"
tools:context=".MainActivity"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="8">
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<Button
android:id="@+id/btn_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:text="1"/>
<Button
android:id="@+id/btn_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="2"/>
<Button
android:id="@+id/btn_3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="3"/>
</RelativeLayout>
</LinearLayout>
private void init() {
Button but1 = findViewById(R.id.btn_1);
Button but2 = findViewById(R.id.btn_2);
Button but3 = findViewById(R.id.btn_3);
but1.setOnClickListener(this);
but2.setOnClickListener(this);
but3.setOnClickListener(this);
}
- 然后就是按钮的点击事件:
@Override
public void onClick(View v) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
switch (v.getId()) {
case R.id.btn_1 :
hideFragment(transaction);
if (f1 == null) {
f1 = new Fragment1();
transaction.add(R.id.main_content, f1);
}
transaction.show(f1);
transaction.commit();
break;
case R.id.btn_2 :
hideFragment(transaction);
if (f2 == null) {
f2 = new Fragment2();
transaction.add(R.id.main_content, f2);
}
transaction.show(f2);
transaction.commit();
break;
case R.id.btn_3 :
hideFragment(transaction);
if (f3 == null) {
f3 = new Fragment3();
transaction.add(R.id.main_content, f3);
}
transaction.show(f3);
transaction.commit();
break;
default :
break;
}
}
/**
* 隐藏所有碎片
*/
private void hideFragment(FragmentTransaction transaction) {
if (f1 != null) {
transaction.hide(f1);
}
if (f2 != null) {
transaction.hide(f2);
}
if (f3 != null) {
transaction.hide(f3);
}
}
注意每次add 碎片的时候,一定要判 碎片是否为空,为空则new对象,不为空则意味着你已经添加过了,不能再次添加。add多次否则就会报错。
还有每次在使用FragmentTransaction的时候都需要重新获取,每一个FragmentTransaction只能够commit()一次。
我这里写的时候就是 每次点击的时候就要重新获取FragmentTransaction。
如有错误,还请指出,谢谢!