[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 条评论
登录 后参与评论

相关文章

来自专栏项勇

笔记32 | UI系列之EditText和AutoCompleteTextView

1305
来自专栏项勇

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

2178
来自专栏分享达人秀

Activity数据传递

在Android开发中,经常要在Activity之间传递数据。前面也学习了Activity和Intent相关基础,接下来一起来学习Activity的数据...

1948
来自专栏Vamei实验室

安卓第八夜 玛丽莲梦露

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 

691
来自专栏Android干货

Android接口回调机制

1063
来自专栏codelang

仿电商商品分类的思路实现

1052
来自专栏学海无涯

Android开发之ListView使用经验分享

在Android开发中,ListView是使用最广泛的组件之一,虽然谷歌推出了RecycleView,但是很多项目中依旧在使用ListView,本文将总结一下使...

2976
来自专栏学海无涯

Android开发之自定义View(二)

在 Android开发之自定义View(一)中,讲解了最复杂的一种自定义View,本次将剩下的两种讲完~~~ go,go,go 继承原有的控件,在原有控件基础上...

3218
来自专栏Vamei实验室

安卓第五夜 维纳斯的诞生

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

983
来自专栏分享达人秀

ViewPager快速实现引导页

在很多APP第一次启动时都会出现引导页,在一些APP里面还会包括一些左右滑动翻页和页面轮播切换的情况。在之前也已经学习了AdapterViewFlipp...

1717

扫码关注云+社区