Fragment

Fragment

碎片布局。android3.0之后的新功能,Fragment需要依赖于Activity而存在,不能独立使用。

Fragment的定义
    public class LeftFragment extends ListFragment {
    private String[] items = { "字符串1", "字符串2", "字符串
    3", "字符串4", "字符串5", "字符串6" };

    // 监听到所依赖的Activity已经onCreate时触发
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //Fragment中可以通过getActivity()获取所依赖的Activity对象
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
                android.R.layout.simple_list_item_1, items);
        setListAdapter(adapter);
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        Toast.makeText(getActivity(), "点击了"+position, 2000).show();
    }

    }

两种添加到Activity的方式

第一种:在xml中使用

Java中动态管理Fragment

1、定义Fragment

public class RightFragment extends Fragment {

        public static RightFragment getInstance(String content,int position){
            RightFragment f = new RightFragment();
            Bundle b = new Bundle();
            b.putString("name", content);
            b.putInt("index",position);
            //记录一些初始参数(放在显示之前)
            f.setArguments(b);
            return f;
        }
// 当Activity添加Fragment之后从该Fragment上获取布局的方法
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
            View layout = inflater.inflate(R.layout.right_fragment_layout, null);
            TextView tv = (TextView) layout.findViewById(R.id.m_tx);
            String content = getArguments().getString("name");
            tv.setText(content);
            return layout;
    }

    }

2、使用FragmentManager和FragmentTransaction来操作Fragment,在Fragment中可以使用getFragmentManager()得到碎片管理器

从布局中加载Fragment
    getFragmentManager().findFragmentById(R.id.content);

    //碎片操作工具(显示、隐藏、添加、移除、替换、绑定、取消绑定这样的管理)
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    //设置操作动画
    ft.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
    //替换
    ft.replace(R.id.content, fragment);
    //提交操作
    ft.commit();

回退栈:可以在提交之前使用addToBackStack方法添加回退栈

//可以添加操作到回退栈中
ft.addToBackStack(null);

注意:FragmentTransaction的conmmit方法必须要在Activity保存状态之前使用,如果保存状态之后用则会导致异常,为了防止异常可以使用

ft.commitAllowingStateLoss();
Fragment生命周期
onAttach: Fragment被加入到Activity中时触发
    onCreate: Fragment创建完毕
    onCreateView: Activity从Fragment身上拿到布局时触发
    onActivityCreate: 当Activity的onCreate方法调用完毕时触发
    onStart: 启动
    onResume: 恢复
    运行ing...
    onPause: 暂停
    onStop: 停止
    onDestroyView:销毁布局
    onDestroy: 碎片进入销毁
    onDetach: fragment从Activity中移除(取消了关联)
Fragment管理

建议使用兼容包v4包中的Fragment,Activity要继承FragmentActivity或者其子类

Activity: getSupportFragmentManager()

Fragment: getFragmentManager() ,getChildFragmentManager()前者得到的是Activity中的管理器,后者得到的是Fragment中管理子(嵌套的)Fragment的管理器

处理Fragment的存活情况可以使用FragmentTransaction

FragmentTransaction ft = mFragmentManager.beginTransaction();

//Fragment的处理

ft.commit();

管理:

显示有关的:add attach(已经存在容器中,会触发onCreateView) 
show(已经存在容器中,不会触发任何声明周期方法)

隐藏:remove detach(会destroyView) hide(不会destroyView)

replace 等价于 add新Fragment remove旧Fragment
ViewPager+Fragment

FragmentPagerAdapter或者FragmentStatePagerAdapter,可以帮助ViewPager管理多个Fragment的切换。

public class MyPagerAdapter extends FragmentPagerAdapter {
    private Fragment[] fragments;

    public MyPagerAdapter(FragmentManager fm, Fragment[] fragments) {
        super(fm);
        this.fragments = fragments;
    }

    @Override
    public Fragment getItem(int position) {
        return fragments[position];
    }

    @Override
    public int getCount() {
        return null == fragments ? 0 : fragments.length;
    }

    }
Fragment中跳转到Activity
直接跳转
    Intent it = new Intent(getActivity(), Activity01.class);
    startActivity(it);

    为了结果跳转
    Intent it2 = new Intent(getActivity(), Activity01.class);
    startActivityForResult(it2, 1);
需要在Fragment中重写onActivityResult方法,注意该Fragment
所依赖的Activity中如果也重写了onActivityResult,那么该方法一定要保留
    super.onActivityResult(arg0, arg1, arg2);
否则Fragment会收不到ActivityResult这个结果
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值