Fragment与Activity

Fragment与Activity的关系

Fragment是Android3.0 之后提出的新功能,低于3.0的版本,使用Fragment要继承v4包中提供的Fragment,同时Activity也要继承v4包中提供的FragmentActivity来实现碎片化布局。Fragment不能单独使用,必须要嵌入到Activity中由Activity管理,来分担Activity的压力,Activity管理Fragment的显示和隐藏,实从而现多业务的展示效果。

Activity中添加Fragment

在Activity中添加Fragment有两种方式:第一,Xml中静态注册;第二,Java代码中添加。

Xml中静态注册Fragment

首先,定义XxxFragment类继承Fragment,完成相关的配置。

//ListFragment类似ListActivity(不需要setContentView)自带一个ListView
public class LeftFragment extends ListFragment {
    private String[] items = { "Java基础", "Java高级编程", "数据库", 
            "Android基础 ", "Android 进阶 ", " 项目实战 ", " 项目管理 " };
    //当布局加载完毕时触发
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
              getActivity(),android.R.layout.simple_list_item_1,items);
        // 给自带的 ListView 设置适配器
        setListAdapter(adapter);
    }
    //ListFragment 中自带的 ListView 的 item 点击监听
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        String str = items[position];
        Toast.makeText(getActivity(), " 点击了: " +
              str, Toast.LENGTH_SHORT).show();
    }
}

其次,在Activity(FragmentActivity)的布局中添加fragment 标签

<fragment
    android:id="@+id/fragment_left"
    android:layout_width="200dp"
    android:layout_height="match_parent"
    android:name="com.yee.fragment.LeftFragment" />

Java代码中添加Fragment

第一步,定义XxxFragment类继承Fragment,完成相关的配置

public class RightFragment extends Fragment {
    //如果需要通过New来创建Fragment对象的方法传递数据,官方建议使用如下
    //静态方法来获取对象,并把数据打包Bundle,然后存入setArguments
    public static RightFragment newInstance(String str,int position){
        RightFragment f = new RightFragment();
        Bundle b = new Bundle();
        b.putString("content", str);
        b.putInt("pos", position);
        //设置内部参数,相当于此Fragment与生俱来的参数不可变,只能在显示之前使用
        f.setArguments(b);
        return f;
    }
    //配置 Fragment 的布局
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable
           ViewGroup container, @Nullable Bundle savedInstanceState) {
        View layout = inflater.inflate(R.layout.fragment_right, null);
        return layout;
    }
    //布局创建成功
    @Override
    public void onViewCreated(View view, 
            @Nullable Bundle savedInstanceState) {
        TextView tv = (TextView) view.findViewById(R.id.tv);
        //内部参数的获取方法
        String content = getArguments().getString("content");
        //显示内容
        tv.setText(content);
    }
    // 获取当前碎片显示的下标
    public int getIndex(){
        return getArguments().getInt("pos");
    }
}

第二步,获取 FragmentManager 管理Fragment

public class LeftFragment extends Frag
    //获取碎片管理器
    FragmentManager fm = getFragmentManager();
    //检测布局中右侧(内容区)是否有内容碎片在显示
    RightFragment fragment = (RightFragment) 
            fm.findFragmentById(R.id.content);
    if (fragment == null || position != fragment.getIndex()) {
        //如果没有则加载新内容;
        //有,则判断当前显示的下标与要显示的是不是一样的,不一样则替换新的内容进来
        fragment = RightFragment.newInstance(str, position);
        //获取碎片操作工具(显示、隐藏、替换、添加、移除、注册、取消注册)
        FragmentTransaction ft = fm.beginTransaction();
        //添加替换动画
        ft.setCustomAnimations(android.R.anim.slide_in_left,
               android.R.anim.slide_out_right);
        //替换新的碎片进来
        ft.replace(R.id.content, fragment);
        //多个Fragment切换后,使用回退栈可以在按返回键后回到前一个fragment
        ft.addToBackStack(null);
        //commit()提交事务的操作必须在Activity保存状态之前使用,
        //如果在状态保存之后,那么需要使用ft.commitAllowingStateLoss()提交事务
        ft.commit();
    }
}

Fragment动态管理(以选项卡框架为例)

通过replace实现,相当于移除旧的,同时添加新的Fragment,流程分三步:
    1)oldFragment:onPause->onStop->onDestroyView
    2)newFragment:onAttach->onCreate->onCreateView->onStart->onResume
    3)oldFragment:onDestroy->onDettach

选项卡框架代码:

private void showFragment(int index){
    //新页面跟当前页面不一样
    if (index != currentIndex){
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        //隐藏旧的,显示新的(如果有显示过则重新显示,没有则创建新的)
        if (currentIndex != -1){
            //取消关联,销毁视图
            ft.detach(fragments[currentIndex]);
        }
        //显示新的
        if (fragments[index] == null){
            //第一次显示,创建新视图
            fragments[index] = createFragment(index);
            //第一次显示,添加到容器保存
            ft.add(R.id.card_content, fragments[index]);
        }else {
            //恢复关联,重建视图
            ft.attach(fragments[index]);
        }
        ft.commit();
        currentIndex = index;
    }
}

Fragment跳转到Activity

无返回结果跳转

带返回结果跳转

与Fragment通信

Activity传递数据给Fragment

Fragment传递数据给Activity

waiting…

Fragment与Fragment通信

waiting…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值