这里我们通过向RadioGroup中动态添加RadioButton给ViewPager添加tag,然后在确定ViewPager的页数,再通过Fragment
填充ViewPager。
activity_main.xml文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<RadioGroup
android:id="@+id/radioGroup_tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</RadioGroup>
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#0373b4" />
<android.support.v4.view.ViewPager
android:id="@+id/viewPager_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
选择器selector:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/bg_tab" android:state_checked="true"/>
<item android:drawable="@android:color/white" android:state_checked="false"/>
</selector>
数组资源:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="arrTabTitles">
<item>书签1</item>
<item>书签2</item>
<item>书签3</item>
<item>书签4</item>
<item>书签5</item>
<item>书签6</item>
</string-array>
</resources>
MainActivity:继承的是FragmentActivity
package com.steven.tab3.fragmentradiogroupviewpager;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.Gravity;
import android.view.Menu;
import android.widget.LinearLayout.LayoutParams;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
public class MainActivity extends FragmentActivity {
private ViewPager viewPager_main;
private RadioGroup radioGroup_tabs;
private RadioButton[] arrRadioButton;
private List<Fragment> totalList = new ArrayList<Fragment>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化选项卡
initTabs();
//初始化ViewPager
intiViewPager();
}
/**
* 初始化书签选项卡
*/
private void initTabs() {
radioGroup_tabs = (RadioGroup) findViewById(R.id.radioGroup_tabs);
//获取我们定义的数组资源
String[] arrTabTitles = getResources().getStringArray(
R.array.arrTabTitles);
//
arrRadioButton = new RadioButton[arrTabTitles.length];
//根据我们资源数组的长度动态创建RadioButton添加到RadioGroup中
for (int i = 0; i < arrTabTitles.length; i++) {
//动态创建RadioButton对象
RadioButton radioButton = new RadioButton(this);
//设置文本
radioButton.setText(arrTabTitles[i]);
//设置位置
radioButton.setGravity(Gravity.CENTER);
//设置背景
radioButton.setButtonDrawable(R.drawable.partition);
//通过选择器给RadioButton设置背景,包括点击时的背景和未被点击时的背景
radioButton.setBackgroundResource(R.drawable.bg_radiobutton);
// 获取屏幕宽度
int screenWidth = getResources().getDisplayMetrics().widthPixels;
//获取每个tag的宽度
int eachWidth = screenWidth / arrTabTitles.length;
//设置每个条目的宽度和高度,宽度就是上面得到的平均值,高度是包裹内容
LayoutParams params = new LayoutParams(eachWidth,
LayoutParams.WRAP_CONTENT);
//给RadioButton设置宽度和高度,通过params设置
radioButton.setLayoutParams(params);
//把我们动态创建
radioGroup_tabs.addView(radioButton);
arrRadioButton[i] = radioButton;
}
//默认RadioButton数组的第0个位置为选中
arrRadioButton[0].setChecked(true);
//设置RadioGroup的点击事件
radioGroup_tabs
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
//遍历RadioGroup,如果RadioButton数组中的RadioButton的id和当前选中的id一样,就设置ViewPager的位置为
//该RadioButton所对应的ViewPager
for (int i = 0; i < radioGroup_tabs.getChildCount(); i++) {
if (arrRadioButton[i].getId() == checkedId) {
viewPager_main.setCurrentItem(i);
}
}
}
});
}
/**
* 初始化ViewPager
*/
private void intiViewPager() {
viewPager_main = (ViewPager) findViewById(R.id.viewPager_main);
// 初始化数据totalList,通过RadioGroup的子类长度明确ViewPager的页数
for (int i = 0; i < radioGroup_tabs.getChildCount(); i++) {
//调用DummyFragment的getInstance方法,其返回值为一个DummyFragment对象
DummyFragment fragment = DummyFragment.getInstance(i + 1);
//把我们实例化的Fragment放入lists集合中
totalList.add(fragment);
}
// 给ViewPager设置适配器
viewPager_main.setAdapter(new MyPagerAdapter(
getSupportFragmentManager(), totalList));
// 给ViewPager设置监听事件
viewPager_main.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
//当页面被选中时,设置RadioButton显示下面的蓝色横线,就是我们selector选择器中定义的
arrRadioButton[position].setChecked(true);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
}
/**
* 创建自定义适配器
*
* @author Administrator
*
*/
class MyPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> list = null;
public MyPagerAdapter(FragmentManager fm, List<Fragment> list) {
super(fm);
this.list = list;
}
@Override
public Fragment getItem(int position) {
return list.get(position);
}
@Override
public int getCount() {
return list.size();
}
}
}
继承自ListFragment的MyFragment:
package com.steven.tab3.fragmentradiogroupviewpager;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.widget.SimpleAdapter;
public class DummyFragment extends ListFragment {
private final static String KEY_NAME = "tabindex";
private int tabindex = 0;
private List<Map<String, Object>> totalList = new ArrayList<Map<String, Object>>();
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// 数据初始化。一般来说数据都来自于网络,需要异步访问,json解析
loadNetworkData();
// 创建适配器
SimpleAdapter adapter = new SimpleAdapter(getActivity(), totalList,
R.layout.item_dummyframent, new String[] { "iconId", "title",
"summary" }, new int[] { R.id.imageView_item_icon,
R.id.textView_item_title, R.id.textView_item_summary });
// 设置适配器
setListAdapter(adapter);
}
/**
* 创建一个静态方法让MainActivity调用,感觉没有必要
* 其实直接在MainActivity中new对象就可以了
* @param tabindex
* @return
*/
public static DummyFragment getInstance(int tabindex) {
DummyFragment fragment = new DummyFragment();
Bundle bundle = new Bundle();
bundle.putInt(KEY_NAME, tabindex);
fragment.setArguments(bundle);
return fragment;
}
/**
* 初始化totalList集合,就是我们把我们要加载的数据放入List集合中
*/
private void loadNetworkData() {
tabindex = getArguments().getInt(KEY_NAME);
for (int i = 0; i < 20; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("iconId", R.drawable.ic_180);
map.put("title", "title_" + tabindex + "_" + i);
map.put("summary", "summay_" + tabindex + "_" + i);
totalList.add(map);
}
}
}
运行结果: