(四)Android基础系列之:Fragment

一、Fragment生命周期函数

1、当Fragment第一次依附于它所属的activity时自动调用的方法
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
}
2、当Fragment被创建时做初始化操作时自动调用的方法
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}
3、当Fragment实例化它的用户界面时自动调用的方法,如果当前Fragment没有用户界面则返回null
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view=inflater.inflate(R.layout.fragment_fragment_life_cycler, container, false);
    return view;
}
4、当Fragment所依附的Activity的onCreate()方法执行完毕后自动调用的方法
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
}
5、当Fragment对用户可见时自动调用的方法
@Override
public void onStart() {
    super.onStart();
}
6、当Fragment获取焦点时自动调用的方法
@Override
public void onResume() {
    super.onResume();
}

7、当Fragment失去焦点时自动调用的方法
@Override
public void onPause() {
    super.onPause();
}
8、当Fragment对用户不可见时自动调用的方法
@Override
public void onStop() {
    super.onStop();
}
9、当之前通过onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)创建的用户界面被销毁时自动调用的方法
@Override
public void onDestroyView() {
    super.onDestroyView();
}
10、当Fragment不再被使用(销毁)时自动调用的方法
@Override
public void onDestroy() {
    super.onDestroy();
}
11、当Fragment不再依附于他所属的Activity时自动调用的方法
@Override
public void onDetach() {
    super.onDetach();
}

image

image

二、动态的添加,修改和删除Fragment

Activity的回退栈是由系统管理的,
Fragment的回退栈是有它所属的Activity管理的.

1、声明碎片管理器对象
private FragmentManager fragmentManager;
2、得到碎片管理器对象
this.fragmentManager=this.getFragmentManager();
3、添加碎片
 同一个容器中只能添加相同Fragment对象一次,如果对象的引用地址相同,重复添加会报错:
 java.lang.IllegalStateException: Fragment already added: DetailFragment{534da41c #0 id=0x7f0c0053}
  • 通过碎片管理器对象得到碎片事务对象
FragmentTransaction fragmentTransaction=this.fragmentManager.beginTransaction();
  • 实例化详情Fragment 对象
DetailFragment detailFragment=new DetailFragment();
  • 将详情Fragment添加到linearLayout_content容器中
fragmentTransaction.add(R.id.linearLayout_content,detailFragment);
  • 添加当前事务操作到回退栈中,之后可以依次将碎片从回退栈中弹出

注意:要想让下面的代码生效,则必须让当前Activity继承Acivity,不要继承他的其它子类,避免出错

fragmentTransaction.addToBackStack(null);//null:表示使用系统生成的回退栈的名称
  • 提交事务的操作
fragmentTransaction.commit();
4、修改碎片
  • 通过碎片管理器对象得到碎片事务对象
FragmentTransaction fragmentTransaction=this.fragmentManager.beginTransaction();
  • 如果之前不存在Fragment则直接添加,如果存在则先删除之前的Fragment在添加新的Fragment
fragmentTransaction.replace(R.id.linearLayout_content,new SecondFragment());
  • 提交事务的操作
fragmentTransaction.commit();
5、删除碎片
  • 通过碎片管理器对象得到碎片事务对象
FragmentTransaction fragmentTransaction=this.fragmentManager.beginTransaction();
  • 删除碎片对象,根据对象的引用地址判断是否是同一个碎片对象
fragmentTransaction.remove(detailFragment);
  • 提交事务的操作
fragmentTransaction.commit();

三、Fragment中的传值

一)、Activity与Fragment
1、Activity传值到Fragment
  • a、动态添加Fragment同时调用 fragment的myFragment.setArguments(bundle)传值到Fragment并
    在Fragment中使用Bundle bundle=this.getArguments()获取值

  • b、通过FragmentManager查找添加过的Fragment并通过调用 fragment.getView()的View对象进而查找控件并赋值或者通过给fragment添加setter函数传值到 fragment.

2、Fragment传值到Activity
  • a、通过得到Fragment所依附的Activity并给Activity提供 setter函数传值到Activity或者让Activity实现传
    值的接口来完成.

  • b、得到Fragment所依附的Activity并通过findViewById()查找控件并赋值

二)、Fragment传值到Fragment
  • 在一个fragment中得到FragmentManager并查找另一个Fragment之后通过setter函数或者getView()方
    法得到View查找控件并赋值.
    由于两个Fragment在添加到当前Activity时使用的是同一个碎片管理器对象,因此可以通过碎片管理器对象查找另一个碎片对象
RightFragment rightFragment= (RightFragment) getFragmentManager().findFragmentById(R.id.fragment_right);
三)、万能的接口回调(适合所有的传值方式)
1.自定义传值接口
public interface PassValue{
    void setValue(String value);
}
2.声明接口类型的对象
private PassValue passValue;
3.给接口类型的对象提供setter函数
public void setPassValue(PassValue passValue) {
    this.passValue = passValue;
}
4.在传值的目标端(RightFragment)调用setter函数
LeftFragment leftFragment= (LeftFragment) getFragmentManager().findFragmentById(R.id.fragment_left);
leftFragment.setPassValue(new LeftFragment.PassValue() {
    @Override
    public void setValue(String value) {
        textView_content.setText(value);
        System.out.println("===setValue(String value="+value+")====");
    }
});
5.在需要传值的地方调用PassValue接口类型的对象passValue.setValue(需要传递的值);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值