CSDN 地址:http://blog.csdn.net/xiangyong_1521/article/details/50519048
RadioButton+Fragment+viewpager的程序框架对我来说是种信仰,公司里大概有15个程序是用的我写信仰架构!
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取出对应信息的吧!
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