Android Fragment动态添加 FragmentTransaction FragmentManager

Fragment常用的三个类:

    android.app.Fragment 主要用于定义Fragment
    android.app.FragmentManager 主要用于在Activity中操作Fragment
    android.app.FragmentTransaction 保证一些列Fragment操作的原子性

获取FragmentManage的方式:  

    getFragmentManager()
    getSupportFragmentManager //v4中FragmentActivity

主要的操作都是FragmentTransaction的方法

    FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务

    transaction.add() //往Activity中添加一个Fragment

    transaction.remove() //从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。

    transaction.replace()//使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~

    transaction.hide() //当你的fragment数量固定很少时隐藏当前的Fragment,仅仅是设为不可见,并不会销毁,多的时候可能出现OOM异常,

    transaction.show()//显示之前隐藏的Fragment

    detach()会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。

    attach()重建view视图,附加到UI上并显示。

    transatcion.commit()//提交一个事务

如果你喜欢使用Fragment,一定要清楚这些方法,哪个会销毁视图,哪个会销毁实例,哪个仅仅只是隐藏,这样才能更好的使用它们。

  a、比如:我在FragmentA中的EditText填了一些数据,当切换到FragmentB时,如果希望会到A还能看到数据,则适合你的就是hide和show;也就是说,希望保留用户操作的面板,你可以使用hide和show,当然了不要使劲在那new实例,进行下非null判断。

  b、再比如:我不希望保留用户操作,你可以使用remove(),然后add();或者使用replace(),这个和remove,add是相同的效果。

  c、remove和detach有一点细微的区别,在不考虑回退栈的情况下,remove会销毁整个Fragment实例,而detach则只是销毁其视图结构,实例并不会被销毁。那么二者怎么取舍使用呢?如果你的当前Activity一直存在,那么在不希望保留用户操作的时候,你可以优先使用detach。

举例

XML

    <!--动态加载,必须要给定一个空间用来加载Fragment 必须是一个FrameLayout !-->
    <FrameLayout
         android:id="@+id/fl_content"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"> 
    </FrameLayout>

逻辑

 1 public class MainActivity extends AppCompatActivity {
 2 
 3     TextFragment textFragment;
 4     ImageFragment imgFragment;
 5     @Override
 6     protected void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.activity_main);
 9 
10         textFragment = new TextFragment();
11         imgFragment = new ImageFragment();
12     }
13 
14     public void add(View v){
15         //创建事务
16         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
17         //操作指令
18         ft.add(R.id.fl_content,textFragment);
19         //提交事务
20         ft.commit();
21     }
22     public void remove(View v){
23         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
24         //从Activity中移除一个Fragment,如果这个Fragment没有添加到回退栈,实例将被销毁。
25         ft.remove(textFragment);
26         ft.commit();
27     }
28 
29     public void replace(View v){
30         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
31         //使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体
32         ft.replace(R.id.fl_content,imgFragment);
33         ft.commit();
34     }
35 
36     public void attach(View v){
37         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
38         //重建视图,附件到UI上并显示
39         ft.attach(textFragment);
40         ft.commit();
41     }
42     public void detach(View v){
43         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
44         //会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护
45         ft.detach(textFragment);
46         ft.commit();
47     }
48     public void show(View v){
49         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
50         //显示之前隐藏的Fragment
51         ft.show(textFragment);
52         ft.commit();
53     }
54     public void hide(View v){
55         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
56         //当你的fragment数量固定很少时隐藏当前的Fragment,仅仅是设为不可见,并不会销毁
57         ft.hide(textFragment);
58         ft.commit();
59     }
60 }

MainActivity.java

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值