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