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

相关文章

来自专栏菩提树下的杨过

Flash/Flex学习笔记(23):运动学原理

先写一个公用的小球类Ball: package{ import flash.display.Sprite; //小球 类 public class B...

25210
来自专栏跟着阿笨一起玩NET

c#实现打印功能

2632
来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

30910
来自专栏Ceph对象存储方案

Luminous版本PG 分布调优

Luminous版本开始新增的balancer模块在PG分布优化方面效果非常明显,操作也非常简便,强烈推荐各位在集群上线之前进行这一操作,能够极大的提升整个集群...

3095
来自专栏魂祭心

原 canvas绘制clock

4034
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

3985
来自专栏张善友的专栏

Silverlight + Model-View-ViewModel (MVVM)

     早在2005年,John Gossman写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expr...

2938
来自专栏hbbliyong

WPF Trigger for IsSelected in a DataTemplate for ListBox items

<DataTemplate DataType="{x:Type vm:HeaderSlugViewModel}"> <vw:HeaderSlug...

4054
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

6688
来自专栏一个会写诗的程序员的博客

Spring Reactor 项目核心库Reactor Core

Non-Blocking Reactive Streams Foundation for the JVM both implementing a Reactiv...

2132

扫码关注云+社区