当Activity在不继承FragmengActivity的情况下,Fragment中集成ViewpagerIndicator使用详解

前言:

Android中实现新闻类别展示功能的方法有很多,使用最多的应该是ViewpagerIndicator了,但是大多数的代码都是使activity继承的FragmentActivity来实现的,但是这样感觉不利于代码的扩展,所以在这里我使Activity继承Activity来实现。不过现在也可以使用TabLayout,而不是用viewpagerindicator来实现了,但是这里我只想使用ViewPagerIndicator(下面简称indicator)来实现,不过是在继承Activity情况下使用,下面主要介绍indicator的实现,先看效果图:


1、demo分析

这里我使用的是三个Fragment,在其中一个Fragment中集成indicator,当然这种在Fragment中集成indicator的示例网上随便搜索都是一大把的,但是网上的基本上都是使用的Fragment依赖的activity是继承的FragmentActivity,对于我来说,我就不喜欢集成FragmentActivity,所有项目中我使Fragment依赖的activity集成的是Activity,再这种情况下实现indicator,分析就到这里,下面看代码分析。

2、代码分析

①activity中代码就不用贴了吧,这个只要在网上搜Fragment就有一大把的代码,这里就贴一些主要的:

顺带看一下我MainActivity这里继承的是Activity而不是FragmentActivity:

public class MainActivity extends Activity {


    private RadioButton test1radio, test2radio, test3radio;

    private BaseFragment test1fragment, test2fragment, test3fragment;

    private ArrayList<BaseFragment> fragmentlists;


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        initView();

        ShowFragment(0);


    }



/**

     * 显示选中的fragment

     *

     * @param i

     */

    private void ShowFragment(int i) {


        FragmentTransaction fragmentTransaction =

                getFragmentManager().beginTransaction();

        HideFragment();

        switch (i) {

            case 0:

                if (test1fragment == null) {

                    test1fragment = new Test1Fragment();

                    fragmentTransaction.add(R.id.activity_main_frame, test1fragment).commit();

                    fragmentlists.add(test1fragment);

                } else {

                    fragmentTransaction.show(test1fragment).commit();

                }


                break;

            case 1:

                if (test2fragment == null) {

                    test2fragment = new Test2Fragment();

                    fragmentTransaction.add(R.id.activity_main_frame, test2fragment).commit();

                    fragmentlists.add(test2fragment);

                } else

                    fragmentTransaction.show(test2fragment).commit();

                break;

            case 2:

                if (test3fragment == null) {

                    test3fragment = new Test3Fragment();

                    fragmentTransaction.add(R.id.activity_main_frame, test3fragment).commit();

                    fragmentlists.add(test3fragment);

                } else

                    fragmentTransaction.show(test3fragment).commit();

                break;

        }


    }


②我们indicator的代码主要在Test1Fragment中,所有这里就只看这个Fragment的代码。

public class Test1Fragmentextends BaseFragment {

    private staticfinal String[] TITLE =

            new String[]{"Android","ios","科技","娱乐","热点","体育","彩票","视频","直播","历史","财经","本地","博客"};


    private ViewPager mViewpager;

    private TabPageIndicator mTabindicator;

    private mPagerAdapter mPagerAdapter;


    @Override

    public View initView(LayoutInflater inflater) {

        View inflate = inflater.inflate(R.layout.fragment_test1, null);


        mViewpager = (ViewPager) inflate.findViewById(R.id.fragment_test1_viewpager);

        mTabindicator = (TabPageIndicator) inflate.findViewById(R.id.fragment_test1_indicator);

        return inflate;

    }


    @Override

    public void initData() {

        super.initData();

        //如果是网络请求的可以在这里访问网络请求,然后就TITLE替换成网络数据

        mPagerAdapter = new mPagerAdapter(mActivity, TITLE);

        mViewpager.setAdapter(mPagerAdapter);

        mTabindicator.setVisibility(View.VISIBLE);//需要注意的是,在布局中indicator最好设置为gone,然后在显示的时候设置visible,不然有可能会报错

        mTabindicator.setViewPager(mViewpager);


    }


③到现在为止这里所有的代码都是没有什么差别的啊,和网上的大部分都一样的啊,所以区别就在Adapter中,我们这里是使用的自定义的Adapter,因为我们的MainActivity是集成的Activity,所有没有FragmentPagerAdapter这个适配器,而网上的都是使Activity集成了FragmentActivity,所以他们的适配器都是使用的FragmentPagerAdapter,这里有不懂的可以去搜一下集成FragmentActivity的使用,相信有很多答案。这里就看一下自定义Adapter中的代码,其实和普通集成PagerAdapter的没什么两样,只是我们这里多实现了一个getPageTitle方法,代码如下。


public class mPagerAdapterextends PagerAdapter {

    private Activity mActivity;

    private String[] mTitle;


    public mPagerAdapter(Activity activity, String[] title) {

        super();

        this.mActivity = activity;

        this.mTitle = title;

    }


    @Override

    public int getCount() {

        return mTitle.length;

    }


    @Override

    public boolean isViewFromObject(View view, Object object) {

        return view == object;

    }



    @Override

    public void destroyItem(ViewGroup container,int position, Object object) {

        container.removeView((View) object);


    }


    @Override

    public Object instantiateItem(ViewGroup container,int position) {

        ViewPagerItem pager = new ViewPagerItem(mActivity, mTitle[position]);

        View mView=pager.initView();

        container.addView(mView);

        pager.initData();//调用显示每一个item的数据

        

        return mView;

    }

//这里就是用来显示indicator中的数据的

    @Override

    public CharSequence getPageTitle(int position) {

        return mTitle[position];

    }

}


④在上面代码中,需要注意的是instantiateItem方法,平时这里的需要的View我们是直接在数组中获得的,但是这里我们只有string类型的数据,所有这里我们需要自己定义一个view,用来显示indicator对应类别的数据,先看一下代码。


/**

 * Class Discription :这里可以用来显示每一个title对应的详情界面

 * Created User : Even

 * Created Time : 2016/08/23.

 */

public class ViewPagerItemextends BaseViewpager {


    private String title;

    private TextView textView;


    public ViewPagerItem(Activity activity, String title) {

        super(activity);

        this.title = title;

    }


    @Override

    public View initView() {

//

        View inflate = View.inflate(mActivity, R.layout.viewpager_item, null);

        textView = (TextView) inflate.findViewById(R.id.viewpager_item_text);

//        textView = new TextView(mActivity);

//        textView.setTextSize(40);

//        textView.setTextColor(mActivity.getResources().getColor(R.color.black));

        return inflate;

    }


    /**

     * 可以在这里根据indicator传进来的类别请求API数据

     */

    @Override

    public void initData() {

        //这里只是显示出indicator传过来的title,可以在这里请求API,用来显示API返回来的数据

        textView.setText(title);

    }

}


⑤只要实现这些,就可以在activity不继承Fragment时候,使用viewpagerindicator了,这里部分简单代码没有贴出,上面贴的是demo的主要代码,如果有需要的,可以通过下面链接下载:demo下载


Android技术交流群:284128443



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值