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

地址

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

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

原文发布于微信公众号 - 项勇(xiangy_life)

原文发表时间:2017-09-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏7号代码

自定义View实现设置中心的功能视图

实现电话短信拦截是否开启就需要以上几十行代码,如果在下面还需实现版本更新是否开启,我们可能会复制以上几十行代码,修改其中的文本即可,但是如果还有同样的10个功能...

1604
来自专栏学海无涯

Android开发之ViewPager切换动画

Android从3.0开始,ViewPager也开始有了切换动画,ViewPager有个setPageTransformer()方法,用于设置ViewPager...

3437
来自专栏Android干货园

【Android源码解析】选择多张图片上传多图预览

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/47...

2712
来自专栏飞雪无情的博客

Android EditText使用详解-包含很多教程上看不到的功能演示

标题有点大,说是详解,其实就是对EditText的一些常用功能的介绍,包括密码框,电话框,空白提示文字等等的讲解,尽量的介绍详细一点,也就是所谓的详解了。。呵呵

2442
来自专栏潇涧技术专栏

Android Text View with Custom Font

本文以自定义TextView为例简单实践下如何自定义View,它能够根据设置的xml属性采用不同的字体显示文字

641
来自专栏腾讯Bugly的专栏

RecyclerView 必知必会

导语 RecyclerView是Android 5.0提出的新UI控件,可以用来代替传统的ListView。 Bugly之前也发过一篇相关文章,讲解了 Recy...

4137
来自专栏项勇

笔记31 | 归纳总结Android的点击事件

2328
来自专栏图像识别与深度学习

《Android》Lesson04-Menu

2007
来自专栏androidBlog

RecycleView下拉刷新控件的封装(包括下拉刷新和加载更多 )

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/...

1321
来自专栏腾讯Bugly的专栏

Android ImageView 正确使用姿势

导语 本文主要介绍了ImageView的相关重要方法,从源码角度剖析了一些容易令人混淆或百思不得其解的问题。 一、正确合理使用ImageView 的src 和b...

3758

扫码关注云+社区