前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[Android学习]之解析练习RadioButton+Fragment+viewpager布局架构

[Android学习]之解析练习RadioButton+Fragment+viewpager布局架构

作者头像
项勇
发布2018-06-19 15:00:11
1.3K0
发布2018-06-19 15:00:11
举报
文章被收录于专栏:项勇项勇

地址

CSDN 地址:http://blog.csdn.net/xiangyong_1521/article/details/50519048

RadioButton+Fragment+viewpager的程序框架对我来说是种信仰,公司里大概有15个程序是用的我写信仰架构!

目录

  • ViewPager简单介绍
  • RadioButton简单介绍
  • 使用效果
  • 主要代码

一.ViewPager简单介绍

1)是怎么样的一个控件?

答:一个页面切换的组件,我们可以往里面填充多个View,然后我们可以通过触摸屏幕左右滑动 切换不同的View,和前面学习的ListView一样,我们需要一个Adapter(适配器),将要显示的View和 我们的ViewPager进行绑定,而ViewPager有他自己特定的Adapter——PagerAdapter!另外,Google 官方是建议我们使用Fragment来填充ViewPager的,这样可以更加方便的生成每个Page以及管理 每个Page的生命周期!当然它给我们提供了两个不同的Adapter,他们分别是: FragmentPageAdapter和FragmentStatePagerAdapter! 而我们本节用到的则是前者:FragmentPageAdapter! 另外要说一点的是ViewPager的缓存机制: ViewPager会缓存当前页,前一页,以及后一页,比如有1,2,3,4这四个页面: 当我们处于第一页:缓存1,2 ——> 处于第二页:缓存 1,2,3 ——> 处于第三页:缓存2,3,4 ——> 处于第四页缓存3,4这样!

2)使用PagerAdapter要重写相关方法:

getCount( ):获得viewpager中有多少个viewdestroyItem( ):移除一个给定位置的页面。适配器有责任从容器中删除这个视图。这是为了确保 在finishUpdate(viewGroup)返回时视图能够被移除。instantiateItem( ): ①将给定位置的view添加到ViewGroup(容器)中,创建并显示出来 ②返回一个代表新增页面的Object(key),通常都是直接返回view本身就可以了, 当然你也可以自定义自己的key,但是key和每个view要一一对应的关系isViewFromObject( ):判断instantiateItem(ViewGroup, int)函数所返回来的Key与一个页面视图是否是 代表的同一个视图(即它俩是否是对应的,对应的表示同一个View),通常我们直接写 return view == object;就可以了,至于为什么要这样讲起来比较复杂,后面有机会进行了解吧 貌似是ViewPager中有个存储view状态信息的ArrayList,根据View取出对应信息的吧!

二.RadioGroup和RadioButton简单介绍

RadioButton即单选按钮,它在开发中提供了一种“多选一”的操作模式,是Android开发中常用的一种组件,例如在用户注册时,选择性别时只能从“男”或者“女”中选择一个。

RadioGroup类的定义如下图所示: java.lang.Object - android.view.View - android.view.ViewGroup - android.widget.LinearLayout - android.widget.RadioGroup

RadioGroup提供的只是RadioButton单选按钮的容器,我们可以在该容器中添加多个RadioButton方可使用,要设置单选按钮的内容,则需要使用RadioButton类。

RadioButton类的定义如下图所示: java.lang.Object - android.view.View - android.widget.TextView - android.widget.Button - android.widget.CompoundButton - android.widget.RadioButton

可以发现RadioButton类是Button类的子类,因此该组件与Button按钮组件的使用类似,区别在于定义的RadioButton组件必须放在RadioGroup组件中。

RadioGroup的公共方法

public void addView (View child, int index, ViewGroup.LayoutParams params)使用指定的布局参数添加一个子视图

child 所要添加的子视图

index 将要添加子视图的位置

params 所要添加的子视图的布局参数

public void check (int id) 如果传递-1作为指定的选择标识符来清除单选按钮组的勾选状态,相当于调用clearCheck()操作

id 该组中所要勾选的单选按钮的唯一标识符(id)

参见

getCheckedRadioButtonId()

clearCheck()

public void clearCheck () 清除当前的选择状态,当选择状态被清除,则单选按钮组里面的所有单选按钮将取消勾选状态,getCheckedRadioButtonId()将返回null

public int getCheckedRadioButtonId () 返回该单选按钮组中所选择的单选按钮的标识ID,如果没有勾选则返回-1

返回该单选按钮组中所选择的单选按钮的标识ID

public RadioGroup.LayoutParams generateLayoutParams (AttributeSet attrs) 基于提供的属性集合返回一个新的布局参数集合

attrs 用于生成布局参数的属性

返回一个ViewGroup.LayoutParams或其子类的实例

public void setOnCheckedChangeListener (RadioGroup.OnCheckedChangeListener listener)注册一个当该单选按钮组中的单选按钮勾选状态发生改变时所要调用的回调函数

listener 当单选按钮勾选状态发生改变时所要调用的回调函数

public void setOnHierarchyChangeListener (ViewGroup.OnHierarchyChangeListener listener)注册一个当子内容添加到该视图或者从该视图中移除时所要调用的回调函数

listener 当层次结构发生改变时所要调用的回调函数


三.使用效果


四.主要代码

MainActivity.java

代码语言:javascript
复制
public class MainActivity extends FragmentActivity {
    private ViewPager pager;
    private List<Fragment> fragments = new ArrayList<Fragment>();
    private RadioGroup group;
    public static MainActivity pthis;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        pthis = this;
        this.initDate();
        this.initView();
    }
    private void initDate() {
        Fragment fragment1 = new Pager1();
        Fragment fragment2 = new Pager2();
        Fragment fragment3 = new Pager3();
        Fragment fragment4 = new Pager4();
        fragments.add(fragment1);
        fragments.add(fragment2);
        fragments.add(fragment3);
        fragments.add(fragment4);
    }

    

    private void initView() {
        pager = (ViewPager) findViewById(R.id.viewPager);
        pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
        pager.setOverScrollMode(View.OVER_SCROLL_NEVER);
        pager.setOffscreenPageLimit(4);
        group = (RadioGroup) findViewById(R.id.radioGroup);
        group.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                switch (checkedId) {
                case R.id.btn1:
                    break;
                case R.id.btn2:
                    break;
                case R.id.btn3:
                    break;
                }
            }
        });

        pager.setOnPageChangeListener(new OnPageChangeListener() {//监听pager的滚动情况

            @Override
            public void onPageSelected(int position) {
                ((RadioButton) findViewById(group.getChildAt(position).getId())).setClickable(true);
            }

            @Override
            public void onPageScrolled(int position, float positionOffset,int positionOffsetPixels) {}
            @Override
            public void onPageScrollStateChanged(int state) {}
        });
    }
    private class MyPagerAdapter extends FragmentPagerAdapter{

        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int arg0) {
            return fragments.get(arg0);
        }

        @Override
        public int getCount() {
            return fragments.size();
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        }

    private long mTickForShow;       @Override    public void onBackPressed() {
        if (SystemClock.uptimeMillis()-mTickForShow<3000) {
            finish();
        }else{
            Toast.makeText(getApplication(), "再点一次推出程序", 0).show();
        }
        mTickForShow=SystemClock.uptimeMillis();    
    }
}

END

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-09-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 项勇 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 地址
    • 目录
      • 一.ViewPager简单介绍
        • 二.RadioGroup和RadioButton简单介绍
          • 三.使用效果
            • 四.主要代码
            相关产品与服务
            容器服务
            腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档