Android RadioGroup Fragment Viewpager FragmentPagerAdapter 去哪网Fragment嵌套

RadioGroup中的各个选择器

1 <selector xmlns:android="http://schemas.android.com/apk/res/android">
2     <item android:state_checked="false" android:drawable="@color/bg_checked"/>
3     <item android:state_checked="true" android:drawable="@color/bg_normal"/>
4 </selector>
bg_selector.xml
1 <selector xmlns:android="http://schemas.android.com/apk/res/android">
2     <item android:state_checked="true" android:drawable="@mipmap/icon_favor_press"/>
3     <item android:state_checked="false" android:drawable="@mipmap/icon_favor_normal"/>
4 </selector>
favor_selector.xml
1 <selector xmlns:android="http://schemas.android.com/apk/res/android">
2     <item android:state_checked="true" android:drawable="@mipmap/icon_home_press"/>
3     <item android:state_checked="false" android:drawable="@mipmap/icon_home_normal"/>
4 </selector>
home_selector.xml
1 <selector xmlns:android="http://schemas.android.com/apk/res/android">
2     <item android:state_checked="true" android:drawable="@mipmap/icon_order_press"/>
3     <item android:state_checked="false" android:drawable="@mipmap/icon_order_normal"/>
4 </selector>
order_selector
1 <selector xmlns:android="http://schemas.android.com/apk/res/android">
2     <item android:state_checked="true" android:drawable="@mipmap/icon_setting_press"/>
3     <item android:state_checked="false" android:drawable="@mipmap/icon_setting_normal"/>
4 </selector>
setting_selector.xml
1 <selector xmlns:android="http://schemas.android.com/apk/res/android">
2     <item android:state_checked="true" android:drawable="@mipmap/icon_uc_press"/>
3     <item android:state_checked="false" android:drawable="@mipmap/icon_uc_normal"/>
4 </selector>
uc_selector.xml

各个Fragment

 1 public class FavorFragment extends Fragment{
 2 
 3     @Nullable
 4     @Override
 5     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
 6         View layout = inflater.inflate(android.R.layout.simple_list_item_1,null);
 7         return layout;
 8     }
 9 
10     @Override
11     public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
12         super.onViewCreated(view, savedInstanceState);
13         view.setBackgroundColor(Color.BLUE);
14         TextView tv = (TextView) view.findViewById(android.R.id.text1);
15         tv.setText("收藏");
16         tv.setTextSize(50);
17     }
18 }
FavorFragment.java
 1 public class OrderFragment extends Fragment{
 2 
 3     @Nullable
 4     @Override
 5     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
 6         View layout = inflater.inflate(android.R.layout.simple_list_item_1,null);
 7         return layout;
 8     }
 9 
10     @Override
11     public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
12         super.onViewCreated(view, savedInstanceState);
13         view.setBackgroundColor(Color.RED);
14         TextView tv = (TextView) view.findViewById(android.R.id.text1);
15         tv.setText("订单");
16         tv.setTextSize(50);
17     }
18 }
OrderFragment.java
 1 public class SettingFragment extends Fragment{
 2 
 3     @Nullable
 4     @Override
 5     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
 6         View layout = inflater.inflate(android.R.layout.simple_list_item_1,null);
 7         return layout;
 8     }
 9 
10     @Override
11     public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
12         super.onViewCreated(view, savedInstanceState);
13         view.setBackgroundColor(Color.WHITE);
14         TextView tv = (TextView) view.findViewById(android.R.id.text1);
15         tv.setText("设置");
16         tv.setTextSize(50);
17     }
18 }
SettingFragment.java
 1 public class UCFragment extends Fragment{
 2 
 3     @Nullable
 4     @Override
 5     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
 6         View layout = inflater.inflate(android.R.layout.simple_list_item_1,null);
 7         return layout;
 8     }
 9 
10     @Override
11     public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
12         super.onViewCreated(view, savedInstanceState);
13         view.setBackgroundColor(Color.YELLOW);
14         TextView tv = (TextView) view.findViewById(android.R.id.text1);
15         tv.setText("个人中心");
16         tv.setTextSize(50);
17     }
18 }
UCFragment.java

首页中还要显示一个ViewPager,一页机票,一页景点,可以左右滑动,自定义指示器

 1 public class JiPiaoFragment extends Fragment{
 2 
 3     @Nullable
 4     @Override
 5     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
 6         View layout = inflater.inflate(android.R.layout.simple_list_item_1,null);
 7         return layout;
 8     }
 9 
10     @Override
11     public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
12         super.onViewCreated(view, savedInstanceState);
13         view.setBackgroundColor(Color.DKGRAY);
14         TextView tv = (TextView) view.findViewById(android.R.id.text1);
15         tv.setText("机票");
16         tv.setTextSize(50);
17     }
18 }
JiPiaoFragment.java
 1 public class JingDianFragment extends Fragment{
 2 
 3     @Nullable
 4     @Override
 5     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
 6         View layout = inflater.inflate(android.R.layout.simple_list_item_1,null);
 7         return layout;
 8     }
 9 
10     @Override
11     public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
12         super.onViewCreated(view, savedInstanceState);
13         view.setBackgroundColor(Color.MAGENTA);
14         TextView tv = (TextView) view.findViewById(android.R.id.text1);
15         tv.setText("景点");
16         tv.setTextSize(50);
17     }
18 }
JingDianFragment.java
 1 public class HomeFragment extends Fragment implements ViewPager.OnPageChangeListener, RadioGroup.OnCheckedChangeListener {
 2 
 3     List<Fragment> mList = new ArrayList<>();
 4 
 5     @Override
 6     public void onCreate(@Nullable Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         mList.add(new JiPiaoFragment());
 9         mList.add(new JingDianFragment());
10     }
11 
12     @Nullable
13     @Override
14     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
15         View layout = inflater.inflate(R.layout.fragment_home,null);
16         return layout;
17     }
18 
19     RadioGroup home_radioGroup;
20     View view_indicator;
21     ViewPager home_viewPager;
22 
23     @Override
24     public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
25         super.onViewCreated(view, savedInstanceState);
26 
27         home_radioGroup = (RadioGroup) view.findViewById(R.id.home_radioGroup);
28         view_indicator =  view.findViewById(R.id.view_indicator);
29         home_viewPager = (ViewPager) view.findViewById(R.id.home_viewPager);
30 
31         //在Fragment中设置FragmentPagerAdapter必须使用getChildFragmentManager
32         FragmentManager fm = getChildFragmentManager();
33 
34         home_viewPager.setAdapter(new MyFragmentPagerAdapter(fm,mList));
35         home_radioGroup.setOnCheckedChangeListener(this);
36         home_viewPager.addOnPageChangeListener(this);
37         //默认
38         home_radioGroup.check(R.id.jipiao);
39         initIndicator();
40     }
41 
42     int width;
43     public void initIndicator(){
44         //指示器长度分一半
45         width = getResources().getDisplayMetrics().widthPixels / 2;
46         FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(width, FrameLayout.LayoutParams.MATCH_PARENT);
47         view_indicator.setLayoutParams(params);
48     }
49 
50 
51     @Override
52     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
53         FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) view_indicator.getLayoutParams();
54         int left = (int) ((position + positionOffset)*width);
55         params.setMargins(left,0,0,0);
56         view_indicator.setLayoutParams(params);
57     }
58 
59     @Override
60     public void onPageSelected(int position) {
61         home_radioGroup.check(position == 0?R.id.jipiao:R.id.jingdian);
62     }
63 
64     @Override
65     public void onPageScrollStateChanged(int state) {
66 
67     }
68 
69     @Override
70     public void onCheckedChanged(RadioGroup group, int checkedId) {
71         home_viewPager.setCurrentItem(checkedId == R.id.jipiao? 0 : 1);
72     }
73 }
HomeFragment.java

由于需要创建很多Fragment实例,这里用工厂模式或者反射方式创建

 1 public class FragmentUtils {
 2 
 3     //工厂模式
 4 
 5     public static final Fragment newInstance(int type){
 6 
 7         switch (type){
 8             case 0:
 9                 return new FavorFragment();
10             case 1:
11                 return new OrderFragment();
12             case 2:
13                 return new HomeFragment();
14             case 3:
15                 return new UCFragment();
16             case 4:
17                 return new SettingFragment();
18         }
19         return null;
20     }
21 
22     //反射方式
23     public static final String[] classNames = {"Favor","Order","Home","UC","Setting"};
24 
25     public static final Fragment getInstance(int type){
26         try {
27             //通过一个类的字符串对象,转换成一个class类类型
28             Class className = Class.forName("com.example.lesson10_viewpager_fragmentpageradapter_childfragment."+classNames[type]+"Fragment");
29             //通过类的类型去创建实例,必须有无参构造方法,并公开
30             return (Fragment) className.newInstance();
31 
32         } catch (ClassNotFoundException e) {
33             e.printStackTrace();
34         } catch (InstantiationException e) {
35             e.printStackTrace();
36         } catch (IllegalAccessException e) {
37             e.printStackTrace();
38         }
39 
40         return null;
41     }
42 }
FragmentUtils.java
 1 public class MyFragmentPagerAdapter extends FragmentPagerAdapter{
 2 
 3     List<Fragment> mList;
 4     public MyFragmentPagerAdapter(FragmentManager fm, List<Fragment> mList) {
 5         super(fm);
 6         this.mList = mList;
 7     }
 8 
 9     @Override
10     public Fragment getItem(int position) {
11         return mList.get(position);
12     }
13 
14     @Override
15     public int getCount() {
16         return mList.size();
17     }
18 }
MyFragmentPagerAdapter.java
 1 public class MainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener {
 2 
 3     RadioGroup radioGroup;
 4     Fragment[] fragments = new Fragment[5];
 5 
 6     @Override
 7     protected void onCreate(Bundle savedInstanceState) {
 8         super.onCreate(savedInstanceState);
 9         setContentView(R.layout.activity_main);
10 
11         radioGroup = (RadioGroup) findViewById(R.id.radioGroup);
12         radioGroup.setOnCheckedChangeListener(this);
13         //默认显示首页
14         showFragment(2);
15         radioGroup.check(R.id.rb_home);
16 
17     }
18     int currIndex = -1;
19 
20     public void showFragment(int index){
21         if(index==currIndex){
22             return;
23         }
24         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
25         if(currIndex != -1){
26             ft.hide(fragments[currIndex]);
27         }
28 
29         if(fragments[index]==null){
30             //创建,用工厂类
31             fragments[index] = FragmentUtils.newInstance(index);
32             ft.add(R.id.fl_content,fragments[index]);
33         }else{
34             ft.show(fragments[index]);
35         }
36 
37         currIndex = index;
38         ft.commit();
39 
40     }
41 
42     @Override
43     public void onCheckedChanged(RadioGroup group, int checkedId) {
44         View view = group.findViewById(checkedId);
45         String tag = view.getTag().toString();
46         showFragment(Integer.parseInt(tag));
47     }
48 
49 }
MainActivity.java
原文地址:https://www.cnblogs.com/Claire6649/p/5997958.html