日报2015/10/28(极客学院安卓视频学习)

使用 Fragment

当当当当,终于到了Fragment的学习了!

界面的切换使用Activity的话速度会慢一点,同一个app里面使用Fragment进行界面切换方便而且效率,使用Fragment其实和Activity很像,也是和一个布局xml相对应,在Fragment类中onCreateView() 方法中,可以为当前的Fragment绑定布局文件:

//这个方法要返回一个View
View rootView = inflater.inflate(R.layout.fragment_blank, container, false);
...
return rootView;

一些Fragment的操作一般都是通过

getFragmentManager()
        .beginTransaction()
        ...//这里进行一些操作
        .commit();

例如,在一个id为container的布局中包含一个名为BlandkFragment的fragment,可以通过add(R.id.container, new BlankFragment()) 来做,但是,在Fragment类中,有一段注释值得注意

* Activities that contain this fragment must implement the
* {@link BlankFragment.OnFragmentInteractionListener} interface
* to handle interaction events.

如果要在Activity里面包含Fragment,似乎是要实现这个Fragment的OnFragmentInteractionListener 否则会报错

在一个fragment里面进行一些操作的话,同样是在onCreateView() 中做,就好像是在Activity的onCreate() 方法里做一些操作一样,同样可以用findViewById() 来获取当前Fragment布局中的一些控件,给按钮绑定事件、获取文本框内容之类的。

视频中有一个从Fragment1跳到Fragment2的操作,如果在Fragment1中有addToBackStack(null) 操作的话,回退键可以返回Fragment1,但是自己试的时候没效果,查了一下
FragmentTransaction addToBackStack 无效问题

自己把Activity的父类改为android.app.Activity ,后退操作就可以实现了。


Fragment 的生命周期

这里写图片描述


Tabbed Activity

as可以自动创建带滑动标签的activity,利用了fragment和viewpager,需要三个类,这里写图片描述

其中public class SectionsPagerAdapter extends FragmentPagerAdapter ,看一下这个类的源码,

    /**
     * Return the Fragment associated with a specified position.
     */
    public abstract Fragment getItem(int position);
    /**
     * Return a unique identifier for the item at the given position.
     *
     * <p>The default implementation returns the given position.
     * Subclasses should override this method if the positions of items can change.</p>
     *
     * @param position Position within this adapter
     * @return Unique identifier for the item at position
     */
    public long getItemId(int position) {
        return position;
    }

在SectionsPagerAdapter中通过这个方法,返回不同的fragment实例

    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a PlaceholderFragment (defined as a static inner class below).
        return PlaceholderFragment.newInstance(position + 1);
    }

通过下面这个方法指定显式的tab页数

    @Override
    public int getCount() {
        // Show 3 total pages.
        return 3;
    }

在main布局中指定一个ViewPager,id为container,

mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);

为ViewPager设置Adapter,这里的每一个都使用的是同一种fragment布局样式,也可以自己定义fragment,让 每个fragment使用不同的fragment。
例如我想让第二个tab用我自己定义的ImageFragment,那么我只要修改SectionsPagerAdapter

    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a PlaceholderFragment (defined as a static inner class below).
        //如果position为1,即第二个页面,那么让它返回自定义的ImageFragment
        if(position==1){
            return new ImageFragment();
        }
        return PlaceholderFragment.newInstance(position + 1);
    }

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值