为了兼容平板,Android从3.0开始引入了Fragment。
1. 生命周期
2. 常用的操作函数
- FragmentManager:
getFragmentManager() // v4中,getSupportFragmentManager
- FragmentTransaction: Fragment的原子性操作
FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务
transaction.add(); //往Activity中添加一个Fragment
transaction.remove(); //从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。
transaction.replace(); //使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~
transaction.hide(); //隐藏当前的Fragment,仅仅是设为不可见,并不会销毁
transaction.show(); //显示之前隐藏的Fragment
detach(); //会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。
attach(); //重建view视图,附加到UI上并显示。
transatcion.commit()//提交一个事务
- addToBackStack:
addToBackStack(null); // 将当前的Fragement事务添加到了回退栈
3. Fragement通信
基本思想是通过宿主Activity进行通信,结合第二篇参考文章给一个示例:
// FragmentOne
public class FragmentOne extends Fragment implements OnClickListener {
private Button mBtn;
/**
* 设置按钮点击的回调
*/
public interface FOneBtnClickListener{
void onFOneBtnClick();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
mBtn = (Button) view.findViewById(R.id.id_fragment_one_btn);
mBtn.setOnClickListener(this);
return view;
}
/**
* 点击fragment中的按钮时, 交给宿主Activity处理,如果它希望处理
*/
@Override
public void onClick(View v) {
if (getActivity() instanceof FOneBtnClickListener) {
((FOneBtnClickListener) getActivity()).onFOneBtnClick();
}
}
}
// FragmentTwo
public class FragmentTwo extends Fragment implements OnClickListener {
private Button mBtn ;
private FTwoBtnClickListener fTwoBtnClickListener ;
public interface FTwoBtnClickListener {
void onFTwoBtnClick();
}
//设置回调接口
public void setfTwoBtnClickListener(FTwoBtnClickListener fTwoBtnClickListener) {
this.fTwoBtnClickListener = fTwoBtnClickListener;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
mBtn = (Button) view.findViewById(R.id.id_fragment_two_btn);
mBtn.setOnClickListener(this);
return view ;
}
@Override
public void onClick(View v) {
if(fTwoBtnClickListener != null)
{
fTwoBtnClickListener.onFTwoBtnClick();
}
}
}
// mainActivity
public class MainActivity extends Activity implements FOneBtnClickListener, FTwoBtnClickListener {
private FragmentOne mFOne;
private FragmentTwo mFTwo;
private FragmentThree mFThree;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
mFOne = new FragmentOne();
FragmentManager fm = getFragmentManager();
FragmentTransaction tx = fm.beginTransaction();
tx.add(R.id.id_content, mFOne, "ONE");
tx.commit();
}
/**
* FragmentOne 按钮点击时的回调
*/
@Override
public void onFOneBtnClick(){
if (mFTwo == null) {
mFTwo = new FragmentTwo();
mFTwo.setfTwoBtnClickListener(this);
}
...
}
/**
* FragmentTwo 按钮点击时的回调
*/
@Override
public void onFTwoBtnClick() {
// fragementTwo的点击事件
....
}
}