一、常用API
Fragment常用三个类:Fragment(主要用于定义Fragment)、FragmentManager(主要用于在Activity中操作Fragment)、FragmentTransaction(保证一系列Fragment操作的原子性)。FragmentTransaction的常用方法
1、add()
向activity中添加一个Fragment
2、remove()
从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈,这个Fragment实例将会被销毁,它的生命周期也就结束了。
3、replace()
使用另一个Fragment替换当前的,实际上是remove()然后add()的合体。
4、hide()
隐藏Fragment,仅仅设为不可见,并不会销毁。
5、show()
显示之前隐藏的Fragment。
6、detach()
将此Fragmen从Activity中分离,会销毁其布局,但不会销毁该实例。
7、attach()
将从Activity中分离的Fragment,重新关联到Activity,重新创建其视图层次。
注意:一定要弄清多会该销毁视图,多会该销毁实例,多会该隐藏。
比如:在FragmentA中的EditText添加了一些数据,当切换到FragmentB时,如果希望A还能看到数据,则适合用hide和show。
二、管理回退栈
1、是什么
类似与Android系统为Activity维护一个回退栈,我们可通过Activity维护一个回退栈来保存每次Fragment事务发生的变化。如果你将Fragment添加到回退栈,当用户点击后退按钮时,将看到上一次保存的Fragment。一旦Fragment完全从后退栈中弹出,用户再次点击后退键,则退出当前Activity。
2、怎么用
添加一个Fragment事务到回退栈:Fragment Transaction.addToBackStack(String);
3、后遗症
replace()后,将当前Fragment事务添加到回退栈,该Fragment实例不会销毁,只会销毁其视图层。
三、处理运行时配置发生变化
1、运行时配置多会会变化
当屏幕方向发生变化或当你的应用被置于后台,长时间没有返回的时候,你的应用也会被重新启动。
2、变化了会出现什么现象
会出现fragment重叠的现象。
3、怎么解决
1)通过检查onCreate()的参数Bundle savedInstanceState就可判断,是否发生当前activity的重建。
默认的savedInstanceState会存储一些数据,包括Fragment的实例。所以,加上savedInstanceState==null即可解决。
public class MainActivity extends Activity{
private static final String TAG = "FragmentOne";
private FragmentOne mFOne;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
Log.e(TAG, savedInstanceState+"");
<span style="color:#ff0000;">if(savedInstanceState == null){</span>
mFOne = new FragmentOne();
FragmentManager fm = getFragmentManager();
FragmentTransaction tx = fm.beginTransaction();
tx.add(R.id.id_content, mFOne, "ONE");
tx.commit();
}
}
}
2)这样无论进行多少次旋转都只会有一个Fragment实例在Activity中。现在还存在一个问题,就是重新绘制时,Fragment发生重建,原本的数据如何保持?
其实和Activity类似,Fragment也有onSaveInstanceState(),在此方法中进行保存数据,然后在onCreate()或onCreateView()或onActivityCreated()进行恢复。
四、使用Fragment创建对话框
http://blog.youkuaiyun.com/lmj623565791/article/details/37815413
五、Fragment与ActionBar、MenuItem集成
Fragment可以添加自己的MenuItem到Activity的ActionBar或者可选菜单中。
步骤:
1、在Fragment的onCreate()中调用setHasOptionsMenu(true);
2、在Fragment子类中实现onCreateOptionsMenu();
3、如果希望在Fragment中处理MenuItem的点击,也可实现onOptionsItemSelected;当然Activity也可直接处理该MenuItem的点击事件。
- //如果希望Fragment自己处理MenuItem点击事件,一定不要忘了调用super.xxx
- return super.onOptionsItemSelected(item);