前面我们分别利用ViewPager和Fragment实现了Tab效果。但是使用Fragment实现的Tab不能够左右滑动。如果我们既想使用Fragment又想让Tab能够滑动,那么怎么办呢?这 就是今天的方法,利用ViewPager和FragmentPagerAdapter来实现Tab。
没看过前两篇文章的读者可以点击下面的地址:
http://www.cnblogs.com/fuly550871915/p/4850056.html
废话不多说了,效果还是之前的效果。由于有些代码我们已经写过了。我们复用《使用Fragment实现Tab》这篇文章里的代码,保留所有的东西,只需要修改两个地方即可。
一、修改主布局
只需要把activity_main.xml的布局中间的改为ViewPager即可。代码如下:
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" 6 > 7 8 <include layout="@layout/top"/> 9 10 <android.support.v4.view.ViewPager 11 android:id="@+id/id_vp" 12 android:layout_width="match_parent" 13 android:layout_height="0dp" 14 android:layout_weight="1"> 15 16 </android.support.v4.view.ViewPager> 17 18 <include layout="@layout/bottum"/>" 19 20 </LinearLayout>
二、修改MainAcitivty
其实方法跟第一篇文章《使用ViewPager实现Tab》类似,只不过是将适配器改为了FragmentPagerAdapter而已,那么相应的数据集里面的泛型也就应该是Fragment实例了。总结,如果前两篇文章你认真看了并做了,下面的代码还是挺简单的。具体如下:
1 import java.util.ArrayList; 2 import java.util.List; 3 4 import android.os.Bundle; 5 import android.app.Activity; 6 import android.support.v4.app.Fragment; 7 import android.support.v4.app.FragmentActivity; 8 import android.support.v4.app.FragmentManager; 9 import android.support.v4.app.FragmentPagerAdapter; 10 import android.support.v4.view.ViewPager; 11 import android.support.v4.view.ViewPager.OnPageChangeListener; 12 import android.view.Menu; 13 import android.view.View; 14 import android.view.View.OnClickListener; 15 import android.widget.ImageButton; 16 import android.widget.LinearLayout; 17 18 public class MainActivity extends FragmentActivity implements OnClickListener{ 19 20 private ImageButton himg; 21 private ImageButton simg; 22 private ImageButton uimg; 23 private ImageButton yimg; 24 25 26 private Fragment hfrag; 27 private Fragment sfrag; 28 private Fragment ufrag; 29 private Fragment yfrag; 30 31 private LinearLayout hlay; 32 private LinearLayout slay; 33 private LinearLayout ulay; 34 private LinearLayout ylay; 35 36 private ViewPager vp; 37 private FragmentPagerAdapter mAdapter;//适配器 38 private List<Fragment> mDatas = new ArrayList<Fragment>(); 39 40 41 protected void onCreate(Bundle savedInstanceState) { 42 super.onCreate(savedInstanceState); 43 setContentView(R.layout.activity_main); 44 45 initView();//依旧是初始化 46 47 initEvent();//初始化事件 48 } 49 50 51 private void initEvent() { 52 //设定点击事件 53 54 hlay.setOnClickListener(this); 55 slay.setOnClickListener(this); 56 ulay.setOnClickListener(this); 57 ylay.setOnClickListener(this); 58 59 vp.setOnPageChangeListener(new OnPageChangeListener() { 60 61 public void onPageSelected(int arg0) { 62 63 resetImg(); 64 int i = vp.getCurrentItem(); 65 66 setTab(i); 67 68 } 69 70 71 public void onPageScrolled(int arg0, float arg1, int arg2) { 72 73 74 } 75 76 77 public void onPageScrollStateChanged(int arg0) { 78 79 80 } 81 }); 82 83 } 84 85 86 private void initView() { 87 //获得按钮 88 himg = (ImageButton) findViewById(R.id.ibtn_hudie); 89 simg = (ImageButton) findViewById(R.id.ibtn_set); 90 uimg = (ImageButton) findViewById(R.id.ibtn_user); 91 yimg = (ImageButton) findViewById(R.id.ibtn_yang); 92 93 //获得底部的线性布局 94 hlay = (LinearLayout) findViewById(R.id.lay_hudie); 95 slay = (LinearLayout) findViewById(R.id.lay_set); 96 ulay = (LinearLayout) findViewById(R.id.lay_user); 97 ylay = (LinearLayout) findViewById(R.id.lay_yang); 98 99 //获取fragment 100 hfrag = new HFragment(); 101 sfrag = new SFragment(); 102 ufrag = new UFragment(); 103 yfrag = new YFragment(); 104 105 //加入数据集 106 mDatas.add(hfrag); 107 mDatas.add(sfrag); 108 mDatas.add(ufrag); 109 mDatas.add(yfrag); 110 111 vp = (ViewPager) findViewById(R.id.id_vp); 112 113 mAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) { 114 115 public int getCount() { 116 117 return mDatas.size(); 118 } 119 120 public Fragment getItem(int position) { 121 122 return mDatas.get(position); 123 } 124 }; 125 126 127 vp.setAdapter(mAdapter); 128 129 } 130 131 public void onClick(View v) { 132 133 resetImg();//将按钮复位 134 135 switch(v.getId()){ 136 137 case R.id.lay_hudie: 138 setSelected(0); 139 break; 140 case R.id.lay_set: 141 setSelected(1); 142 break; 143 case R.id.lay_user: 144 setSelected(2); 145 break; 146 case R.id.lay_yang: 147 setSelected(3); 148 break; 149 } 150 } 151 152 private void setSelected(int i) { 153 //需要将按钮变亮,且需要切换fragment的状体 154 155 setTab(i); 156 vp.setCurrentItem(i);//设定当前的item 157 158 } 159 160 //该方法用来设定按钮的高亮 161 private void setTab(int i){ 162 switch(i){ 163 case 0: 164 himg.setImageResource(R.drawable.hudie2); 165 break; 166 case 1: 167 simg.setImageResource(R.drawable.set2); 168 break; 169 case 2: 170 uimg.setImageResource(R.drawable.user2); 171 break; 172 case 3: 173 yimg.setImageResource(R.drawable.yang2); 174 break; 175 } 176 } 177 178 private void resetImg() { 179 180 himg.setImageResource(R.drawable.hudie); 181 simg.setImageResource(R.drawable.set); 182 uimg.setImageResource(R.drawable.user); 183 yimg.setImageResource(R.drawable.yang); 184 185 } 186 }
好了,至此完成了所有的代码,快运行试试,是不是又可以左右滑动了。
三、总结
如果你的app中不要求具有左右滑动的功能,建议使用Fragment实现Tab。如果想有滑动效果的话,建议使用ViewPager和FragmenPagerAdapter来实现Tab。总之,使用Fragment可以大大提高我们的代码质量。