Android最主流的4种实现Tab的方法
2016-12-11 21:48
423 查看
Tab选项卡几乎成为了App必备的一个功能,它的实现方法也是多种多样,本文将讲解迄今为止最主流的4种实现Tab的方法,包括ViewPager、Fragment、FragmentPagerAdapter和ViewPagerIndicator。
上面实现了仿微信Tab导航效果,当点击底部的4个Tab之一时,上面的内容随之切换,同时也可通过左右滑动进行内容切换。
一.底部Tab布局文件
底部Tab的高度限定为70dp并让其子元素横向排列,然后添加4个LinearLayout ,利用layout_weight属性将每个LinearLayout的宽度设置为父元素的四分之一。
底部Tab布局文件bottom.xml代码如下所示:
注意:要将ImageButton的clickable的属性设置为false,否则点击ImageButton时,Tab无法实现切换。
二.创建主布局文件
通过include标签将bottom.xml添加到主布局文件中,这样可以优化布局层次,避免混乱。
然后在主布局文件中加入ViewPager,代码如下所示:
三.为ViewPager添加适配器
首先,创建PagerAdapter适配器,实现destroyItem(),instantiateItem(),getCount(),isViewFromObject()这四个方法。
然后为ViewPager添加适配器:
四.为ViewPager绑定事件监听器
当在手机屏幕上左右滑动时,实现Tab左右切换效果,同时会触发OnPageChangeListener()事件监听器,将对应的图片点亮。
五.主程序代码
在主程序中,还要为四个LinearLayout绑定监听事件,当点击LinearLayout时,图片点亮,ViewPager切换到对应的内容。
点击下载源码>>
相对于ViewPager实现Tab,采用Fragment方法可以避免所有代码集中在主程序中,将Tab对应显示的内容单独分离出来,方便后期维护。
一.底部Tab布局文件
底部Tab布局文件bottom.xml与“ViewPager实现Tab”中的bottom.xml代码相同。
二.主布局文件
通过include标签将bottom.xml添加到主布局文件中,并添加Fragment组件。
三.创建对应于每个Tab选项卡的Fragment
接下来创建每个Tab的View页面,实例中含有4个Tab,则需要创建4个Fragment文件。
下面只写一个Fragment进行演示,创建一个类,让其继承Fragment,实现onCreateView()方法。
上面R.layout.tab_weixin文件对应的代码为:
四.实现切换效果
当点击Tab时,实现切换效果——显示对应的Fragment,将图片设置为亮色。
在Android中,对Fragment的操作都是通过FragmentTransaction来执行。
切换时,首先先将所有初始化了的Fragment隐藏,然后判断将要切换到的Fragment是否为空,如果为空就将其初始化,并将其添加到FragmentTransaction事物中,接下来将指定为图片设置为亮色、显示指定的Fragment。
五.主程序代码
让MainActivity继承FragmentActivity。
注意:前面出现的 Fragment,FragmentManager,FragmentTransaction,FragmentActivity都是导入android.support.v4.app包下的类,不要与android.app.Fragment混淆。
点击下载源码>>
一.布局文件
底部Tab布局文件bottom.xml和主布局文件与“Fragment实现Tab”中的相应文件相同。
二.每个Tab选项卡对应的Fragment
每个Tab选项卡对应的Fragment与“Fragment实现Tab”的对应文件相同。
三.为ViewPager设置FragmentPagerAdapter适配器
先创建一个
创建FragmentPagerAdapter需要传入一个FragmentManager参数,可以通过getSupportFragmentManager()方法获取FragmentManager。
四.为ViewPager设置监听事件
当在手机屏幕上左右滑动时,Tab内容左右切换,并触发OnPageChangeListener监听器,将对应的Tab图片设置为亮色。
上面setTab(position)对应的方法为:
五.主程序代码
注意:前面出现的 Fragment,FragmentActivity,FragmentPagerAdapter同样需要导入android.support.v4.app包下的类。
点击下载源码>>
下面实现一个Tab例子,效果图如下所示:
一.AndroidStudio导入ViewPagerIndicator
1.在app上右击,选择open module Settings
2.点击Dependencies,然后点击右侧的“+”,选择1.Library dependency
3.在输入框中输入ViewPagerIndicator,点击旁边的搜索图标,出现匹配的文件后,点击OK
二.主布局文件
主布局文件包含TabPageIndicator和ViewPager两个组件。
三.Tab内容对应的布局文件
布局文件fragment.xml中采用相对布局,只有一个TextView。
四.创建FragmentPagerAdapter适配器
创建FragmentPagerAdapter适配器,需要实现getItem(),getCount(),etPageTitle()三个方法。
五.创建TabFragment类
TabFragment需要实现Fragment,在onCreateView()方法中创建Tab对应显示的页面内容。
六.主程序代码
在主程序中,让MainActivity继承FragmentActivity,并为ViewPager设置适配器,同时为TabPageIndicator设置ViewPager。
注意:前面出现的 Fragment,FragmentActivity,FragmentManager,FragmentPagerAdapter同样需要导入android.support.v4.app包下的类。
七.为Tab设置样式
在style.xml中加入如下代码:
并将AndroidManifest.xml中application标签的android:theme属性改为@style/MyTheme
点击下载源码>>
ViewPager实现Tab
下面将通过一个实例来讲解如何用ViewPager实现Tab,效果图如下所示:上面实现了仿微信Tab导航效果,当点击底部的4个Tab之一时,上面的内容随之切换,同时也可通过左右滑动进行内容切换。
一.底部Tab布局文件
底部Tab的高度限定为70dp并让其子元素横向排列,然后添加4个LinearLayout ,利用layout_weight属性将每个LinearLayout的宽度设置为父元素的四分之一。
底部Tab布局文件bottom.xml代码如下所示:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="70dp" android:background="@drawable/bottom_bar" android:orientation="horizontal"> <LinearLayout android:id="@+id/tab_weixin" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:orientation="vertical"> <ImageButton android:id="@+id/tab_weixin_img" android:layout_width="wrap_content" android:layout_height= "wrap_content" android:src="@drawable/tab_weixin_pressed" android:clickable="false" android:background="#00000000"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16dp" android:textColor="#ffffff" android:text="微信"/> </LinearLayout> <LinearLayout android:id="@+id/tab_frd" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:orientation="vertical"> <ImageButton android:id="@+id/tab_frd_img" android:clickable="false" android:layout_width="wrap_content" android:layout_height= "wrap_content" android:src="@drawable/tab_find_frd_normal" android:background="#00000000"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16dp" android:textColor="#ffffff" android:text="朋友"/> </LinearLayout> <LinearLayout android:id="@+id/tab_address" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:orientation="vertical"> <ImageButton android:id="@+id/tab_address_img" android:clickable="false" android:layout_width="wrap_content" android:layout_height= "wrap_content" android:src="@drawable/tab_address_normal" android:background="#00000000"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16dp" android:textColor="#ffffff" android:text="通讯录"/> </LinearLayout> <LinearLayout android:id="@+id/tab_settings" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:orientation="vertical"> <ImageButton android:id="@+id/tab_settings_img" android:clickable="false" android:layout_width="wrap_content" android:layout_height= "wrap_content" android:src="@drawable/tab_settings_normal" android:background="#00000000"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16dp" android:textColor="#ffffff" android:text="设置"/> </LinearLayout> </LinearLayout>
注意:要将ImageButton的clickable的属性设置为false,否则点击ImageButton时,Tab无法实现切换。
二.创建主布局文件
通过include标签将bottom.xml添加到主布局文件中,这样可以优化布局层次,避免混乱。
<include layout="@layout/bottom"/>
然后在主布局文件中加入ViewPager,代码如下所示:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v4.view.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> </android.support.v4.view.ViewPager> <include layout="@layout/bottom"/> </LinearLayout>
三.为ViewPager添加适配器
首先,创建PagerAdapter适配器,实现destroyItem(),instantiateItem(),getCount(),isViewFromObject()这四个方法。
PagerAdapter pagerAdapter = new PagerAdapter() { /** * 摧毁View * @param container * @param position * @param object */ @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(mViewList.get(position)); } /** * 初始化View * @param container * @param position * @return */ @Override public Object instantiateItem(ViewGroup container, int position) { View view = mViewList.get(position); container.addView(view); return view; } @Override public int getCount() { return mViewList.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } };
然后为ViewPager添加适配器:
mViewPager.setAdapter(pagerAdapter);
四.为ViewPager绑定事件监听器
当在手机屏幕上左右滑动时,实现Tab左右切换效果,同时会触发OnPageChangeListener()事件监听器,将对应的图片点亮。
mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} @Override public void onPageSelected(int position) { resetImg(); switch (position){ case 0: mWeixinImg.setImageResource(R.drawable.tab_weixin_pressed); break; case 1: mFrdImg.setImageResource(R.drawable.tab_find_frd_pressed); break; case 2: mAddressImg.setImageResource(R.drawable.tab_address_pressed); break; case 3: mSettingsImg.setImageResource(R.drawable.tab_settings_pressed); break; } } @Override public void onPageScrollStateChanged(int state) {} });
五.主程序代码
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private ViewPager mViewPager;
private List<View> mViewList = new ArrayList<>();
private LinearLayout mTabWeixin;
private LinearLayout mTabFrd;
private LinearLayout mTabAddress;
private LinearLayout mTabSetting;
private ImageButton mWeixinImg;
private ImageButton mFrdImg;
private ImageButton mAddressImg;
private ImageButton mSettingsImg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//去掉活动条
if(getSupportActionBar()!=null){
getSupportActionBar().hide();
}
initView();
initEvent();
}
private void initEvent() {
mTabWeixin.setOnClickListener(this);
mTabFrd.setOnClickListener(this);
mTabAddress.setOnClickListener(this);
mTabSetting.setOnClickListener(this);
mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} @Override public void onPageSelected(int position) { resetImg(); switch (position){ case 0: mWeixinImg.setImageResource(R.drawable.tab_weixin_pressed); break; case 1: mFrdImg.setImageResource(R.drawable.tab_find_frd_pressed); break; case 2: mAddressImg.setImageResource(R.drawable.tab_address_pressed); break; case 3: mSettingsImg.setImageResource(R.drawable.tab_settings_pressed); break; } } @Override public void onPageScrollStateChanged(int state) {} });
}
private void initView() {
mViewPager = (ViewPager) findViewById(R.id.view_pager);
mTabWeixin = (LinearLayout) findViewById(R.id.tab_weixin);
mTabFrd = (LinearLayout) findViewById(R.id.tab_frd);
mTabAddress = (LinearLayout) findViewById(R.id.tab_address);
mTabSetting = (LinearLayout) findViewById(R.id.tab_settings);
mWeixinImg = (ImageButton) findViewById(R.id.tab_weixin_img);
mFrdImg = (ImageButton) findViewById(R.id.tab_frd_img);
mAddressImg = (ImageButton) findViewById(R.id.tab_address_img);
mSettingsImg = (ImageButton) findViewById(R.id.tab_settings_img);
LayoutInflater layoutInflater = LayoutInflater.from(this);
View viewWeixin = layoutInflater.inflate(R.layout.tab_weixin,null);
View viewFrd = layoutInflater.inflate(R.layout.tab_frd,null);
final View viewAddress = layoutInflater.inflate(R.layout.tab_address,null);
View viewSettings = layoutInflater.inflate(R.layout.tab_settings,null);
mViewList.add(viewWeixin);
mViewList.add(viewFrd);
mViewList.add(viewAddress);
mViewList.add(viewSettings);
PagerAdapter pagerAdapter = new PagerAdapter() { /** * 摧毁View * @param container * @param position * @param object */ @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(mViewList.get(position)); } /** * 初始化View * @param container * @param position * @return */ @Override public Object instantiateItem(ViewGroup container, int position) { View view = mViewList.get(position); container.addView(view); return view; } @Override public int getCount() { return mViewList.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } };
mViewPager.setAdapter(pagerAdapter);
}
@Override
public void onClick(View v) {
resetImg();
switch (v.getId()){
case R.id.tab_weixin :
//将图片设置为亮色
mWeixinImg.setImageResource(R.drawable.tab_weixin_pressed);
//设置ViewPager当前显示的View
mViewPager.setCurrentItem(0);
break;
case R.id.tab_frd :
//将图片设置为亮色
mFrdImg.setImageResource(R.drawable.tab_find_frd_pressed);
//设置ViewPager当前显示的View
mViewPager.setCurrentItem(1);
break;
case R.id.tab_address :
//将图片设置为亮色
mAddressImg.setImageResource(R.drawable.tab_address_pressed);
//设置ViewPager当前显示的View
mViewPager.setCurrentItem(2);
break;
case R.id.tab_settings :
//将图片设置为亮色
mSettingsImg.setImageResource(R.drawable.tab_settings_pressed);
//设置ViewPager当前显示的View
mViewPager.setCurrentItem(3);
break;
}
}
/**
* 将所有图片切换成暗色
*/
private void resetImg() {
mWeixinImg.setImageResource(R.drawable.tab_weixin_normal);
mFrdImg.setImageResource(R.drawable.tab_find_frd_normal);
mAddressImg.setImageResource(R.drawable.tab_address_normal);
mSettingsImg.setImageResource(R.drawable.tab_settings_normal);
}
}
在主程序中,还要为四个LinearLayout绑定监听事件,当点击LinearLayout时,图片点亮,ViewPager切换到对应的内容。
点击下载源码>>
Fragment实现Tab
下面通过Fragment实现上面相同的效果,只是Tab不能通过左右滑动进行切换。相对于ViewPager实现Tab,采用Fragment方法可以避免所有代码集中在主程序中,将Tab对应显示的内容单独分离出来,方便后期维护。
一.底部Tab布局文件
底部Tab布局文件bottom.xml与“ViewPager实现Tab”中的bottom.xml代码相同。
二.主布局文件
通过include标签将bottom.xml添加到主布局文件中,并添加Fragment组件。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> </FrameLayout> <include layout="@layout/bottom"/> </LinearLayout>
三.创建对应于每个Tab选项卡的Fragment
接下来创建每个Tab的View页面,实例中含有4个Tab,则需要创建4个Fragment文件。
下面只写一个Fragment进行演示,创建一个类,让其继承Fragment,实现onCreateView()方法。
public class WeixinFragment extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.tab_weixin,container,false); } }
上面R.layout.tab_weixin文件对应的代码为:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:textSize="30dp" android:text="This is tab Weixin"/> </LinearLayout>
四.实现切换效果
当点击Tab时,实现切换效果——显示对应的Fragment,将图片设置为亮色。
在Android中,对Fragment的操作都是通过FragmentTransaction来执行。
/** * 显示指定Tab,并将对应的图片设置为亮色 * @param i */ private void setSelect(int i) { FragmentManager fm = getSupportFragmentManager(); //获得FragmentManager FragmentTransaction transaction = fm.beginTransaction(); //开启事务 hideFragment(transaction); switch (i){ case 0: if (weixinFragment==null){ weixinFragment = new WeixinFragment(); transaction.add(R.id.content, weixinFragment); } //将图片设置为亮色 mWeixinImg.setImageResource(R.drawable.tab_weixin_pressed); //显示指定Fragment transaction.show(weixinFragment); break; case 1: if (frdFragment==null){ frdFragment = new FrdFragment(); transaction.add(R.id.content, frdFragment); } //将图片设置为亮色 mFrdImg.setImageResource(R.drawable.tab_find_frd_pressed); //显示指定Fragment transaction.show(frdFragment); break; case 2: if (addressFragment==null){ addressFragment = new AddressFragment(); transaction.add(R.id.content, addressFragment); } //将图片设置为亮色 mAddressImg.setImageResource(R.drawable.tab_address_pressed); //显示指定Fragment transaction.show(addressFragment); break; case 3: if (settingFragment==null){ settingFragment = new SettingsFragment(); transaction.add(R.id.content, settingFragment); } //将图片设置为亮色 mSettingsImg.setImageResource(R.drawable.tab_settings_pressed); //显示指定Fragment transaction.show(settingFragment); break; } transaction.commit(); //提交事务 } /** * 将所有Fragment隐藏起来 * @param transaction */ private void hideFragment(FragmentTransaction transaction) { if (weixinFragment!=null){ transaction.hide(weixinFragment); } if (frdFragment!=null){ transaction.hide(frdFragment); } if(addressFragment!=null) { transaction.hide(addressFragment); } if(settingFragment!=null){ transaction.hide(settingFragment); } }
切换时,首先先将所有初始化了的Fragment隐藏,然后判断将要切换到的Fragment是否为空,如果为空就将其初始化,并将其添加到FragmentTransaction事物中,接下来将指定为图片设置为亮色、显示指定的Fragment。
五.主程序代码
让MainActivity继承FragmentActivity。
import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.view.View; import android.view.Window; import android.widget.ImageButton; import android.widget.LinearLayout; public class MainActivity extends FragmentActivity implements View.OnClickListener{ private LinearLayout mTabWeixin; private LinearLayout mTabFrd; private LinearLayout mTabAddress; private LinearLayout mTabSetting; private ImageButton mWeixinImg; private ImageButton mFrdImg; private ImageButton mAddressImg; private ImageButton mSettingsImg; private WeixinFragment weixinFragment; private FrdFragment frdFragment; private AddressFragment addressFragment; private SettingsFragment settingFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); initView(); initEvent(); setSelect(0); //显示第一个Tab } private void initEvent() { mTabWeixin.setOnClickListener(this); mTabFrd.setOnClickListener(this); mTabAddress.setOnClickListener(this); mTabSetting.setOnClickListener(this); } private void initView() { mTabWeixin = (LinearLayout) findViewById(R.id.tab_weixin); mTabFrd = (LinearLayout) findViewById(R.id.tab_frd); mTabAddress = (LinearLayout) findViewById(R.id.tab_address); mTabSetting = (LinearLayout) findViewById(R.id.tab_settings); mWeixinImg = (ImageButton) findViewById(R.id.tab_weixin_img); mFrdImg = (ImageButton) findViewById(R.id.tab_frd_img); mAddressImg = (ImageButton) findViewById(R.id.tab_address_img); mSettingsImg = (ImageButton) findViewById(R.id.tab_settings_img); } @Override public void onClick(View v) { resetImg(); switch (v.getId()){ case R.id.tab_weixin : setSelect(0); break; case R.id.tab_frd : setSelect(1); break; case R.id.tab_address : setSelect(2); break; case R.id.tab_settings : setSelect(3); break; } } /** * 显示指定Tab,并将对应的图片设置为亮色 * @param i */ private void setSelect(int i) { FragmentManager fm = getSupportFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); hideFragment(transaction); switch (i){ case 0: if (weixinFragment==null){ weixinFragment = new WeixinFragment(); transaction.add(R.id.content, weixinFragment); } //将图片设置为亮色 mWeixinImg.setImageResource(R.drawable.tab_weixin_pressed); //显示指定Fragment transaction.show(weixinFragment); break; case 1: if (frdFragment==null){ frdFragment = new FrdFragment(); transaction.add(R.id.content, frdFragment); } //将图片设置为亮色 mFrdImg.setImageResource(R.drawable.tab_find_frd_pressed); //显示指定Fragment transaction.show(frdFragment); break; case 2: if (addressFragment==null){ addressFragment = new AddressFragment(); transaction.add(R.id.content, addressFragment); } //将图片设置为亮色 mAddressImg.setImageResource(R.drawable.tab_address_pressed); //显示指定Fragment transaction.show(addressFragment); break; case 3: if (settingFragment==null){ settingFragment = new SettingsFragment(); transaction.add(R.id.content, settingFragment); } //将图片设置为亮色 mSettingsImg.setImageResource(R.drawable.tab_settings_pressed); //显示指定Fragment transaction.show(settingFragment); break; } transaction.commit(); } /** * 将所有Fragment隐藏起来 * @param transaction */ private void hideFragment(FragmentTransaction transaction) { if (weixinFragment!=null){ transaction.hide(weixinFragment); } if (frdFragment!=null){ transaction.hide(frdFragment); } if(addressFragment!=null) { transaction.hide(addressFragment); } if(settingFragment!=null){ transaction.hide(settingFragment); } } /** * 将所有图片切换成暗色 */ private void resetImg() { mWeixinImg.setImageResource(R.drawable.tab_weixin_normal); mFrdImg.setImageResource(R.drawable.tab_find_frd_normal); mAddressImg.setImageResource(R.drawable.tab_address_normal); mSettingsImg.setImageResource(R.drawable.tab_settings_normal); } }
注意:前面出现的 Fragment,FragmentManager,FragmentTransaction,FragmentActivity都是导入android.support.v4.app包下的类,不要与android.app.Fragment混淆。
点击下载源码>>
FragmentPagerAdapter+ViewPager实现Tab
FragmentPagerAdapter+ViewPager实现Tab,既能左右滑动切换Tab,又可将Fragment单独分离出来,方便维护。一.布局文件
底部Tab布局文件bottom.xml和主布局文件与“Fragment实现Tab”中的相应文件相同。
二.每个Tab选项卡对应的Fragment
每个Tab选项卡对应的Fragment与“Fragment实现Tab”的对应文件相同。
三.为ViewPager设置FragmentPagerAdapter适配器
先创建一个
List<Fragment>:
List<Fragment> listFragment = new ArrayList<>(); weixinFragment = new WeixinFragment(); frdFragment = new FrdFragment(); addressFragment = new AddressFragment(); settingFragment = new SettingsFragment(); listFragment.add(weixinFragment); listFragment.add(frdFragment); listFragment.add(addressFragment); listFragment.add(settingFragment);
创建FragmentPagerAdapter需要传入一个FragmentManager参数,可以通过getSupportFragmentManager()方法获取FragmentManager。
FragmentPagerAdapter adapter = new FragmentPagerAdapter(getSupportFragmentManager()) { @Override public Fragment getItem(int position) { return listFragment.get(position); } @Override public int getCount() { return listFragment.size(); } }; viewPager.setAdapter(adapter);
四.为ViewPager设置监听事件
当在手机屏幕上左右滑动时,Tab内容左右切换,并触发OnPageChangeListener监听器,将对应的Tab图片设置为亮色。
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} @Override public void onPageSelected(int position) { setTab(position); } @Override public void onPageScrollStateChanged(int state) {} });
上面setTab(position)对应的方法为:
/** * 将指定的Tab图片设置为亮色 * @param i */ private void setTab(int i) { resetImg(); switch (i){ case 0: mWeixinImg.setImageResource(R.drawable.tab_weixin_pressed); break; case 1: mFrdImg.setImageResource(R.drawable.tab_find_frd_pressed); break; case 2: mAddressImg.setImageResource(R.drawable.tab_address_pressed); break; case 3: mSettingsImg.setImageResource(R.drawable.tab_settings_pressed); break; } } /** * 将所有图片切换成暗色 */ private void resetImg() { mWeixinImg.setImageResource(R.drawable.tab_weixin_normal); mFrdImg.setImageResource(R.drawable.tab_find_frd_normal); mAddressImg.setImageResource(R.drawable.tab_address_normal); mSettingsImg.setImageResource(R.drawable.tab_settings_normal); }
五.主程序代码
package com.example.administrator.tabproject;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends FragmentActivity implements View.OnClickListener{
private ViewPager viewPager;
private List<Fragment> listFragment;
private LinearLayout mTabWeixin;
private LinearLayout mTabFrd;
private LinearLayout mTabAddress;
private LinearLayout mTabSetting;
private ImageButton mWeixinImg;
private ImageButton mFrdImg;
private ImageButton mAddressImg;
private ImageButton mSettingsImg;
private WeixinFragment weixinFragment;
private FrdFragment frdFragment;
private AddressFragment addressFragment;
private SettingsFragment settingFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initEvent();
setSelect(1);
}
private void initEvent() {
mTabWeixin.setOnClickListener(this);
mTabFrd.setOnClickListener(this);
mTabAddress.setOnClickListener(this);
mTabSetting.setOnClickListener(this);
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} @Override public void onPageSelected(int position) { setTab(position); } @Override public void onPageScrollStateChanged(int state) {} });
}
private void initView() {
viewPager = (ViewPager) findViewById(R.id.view_pager);
mTabWeixin = (LinearLayout) findViewById(R.id.tab_weixin);
mTabFrd = (LinearLayout) findViewById(R.id.tab_frd);
mTabAddress = (LinearLayout) findViewById(R.id.tab_address);
mTabSetting = (LinearLayout) findViewById(R.id.tab_settings);
mWeixinImg = (ImageButton) findViewById(R.id.tab_weixin_img);
mFrdImg = (ImageButton) findViewById(R.id.tab_frd_img);
mAddressImg = (ImageButton) findViewById(R.id.tab_address_img);
mSettingsImg = (ImageButton) findViewById(R.id.tab_settings_img);
listFragment = new ArrayList<>();
weixinFragment = new WeixinFragment();
frdFragment = new FrdFragment();
addressFragment = new AddressFragment();
settingFragment = new SettingsFragment();
listFragment.add(weixinFragment);
listFragment.add(frdFragment);
listFragment.add(addressFragment);
listFragment.add(settingFragment);
FragmentPagerAdapter adapter = new FragmentPagerAdapter(getSupportFragmentManager()) { @Override public Fragment getItem(int position) { return listFragment.get(position); } @Override public int getCount() { return listFragment.size(); } }; viewPager.setAdapter(adapter);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.tab_weixin :
setSelect(0);
break;
case R.id.tab_frd :
setSelect(1);
break;
case R.id.tab_address :
setSelect(2);
break;
case R.id.tab_settings :
setSelect(3);
break;
}
}
private void setSelect(int i) {
setTab(i);
viewPager.setCurrentItem(i);
}
/**
* 将指定的Tab图片设置为亮色
* @param i
*/
private void setTab(int i) {
resetImg();
switch (i){
case 0:
mWeixinImg.setImageResource(R.drawable.tab_weixin_pressed);
break;
case 1:
mFrdImg.setImageResource(R.drawable.tab_find_frd_pressed);
break;
case 2:
mAddressImg.setImageResource(R.drawable.tab_address_pressed);
break;
case 3:
mSettingsImg.setImageResource(R.drawable.tab_settings_pressed);
break;
}
}
/**
* 将所有图片切换成暗色
*/
private void resetImg() {
mWeixinImg.setImageResource(R.drawable.tab_weixin_normal);
mFrdImg.setImageResource(R.drawable.tab_find_frd_normal);
mAddressImg.setImageResource(R.drawable.tab_address_normal);
mSettingsImg.setImageResource(R.drawable.tab_settings_normal);
}
}
注意:前面出现的 Fragment,FragmentActivity,FragmentPagerAdapter同样需要导入android.support.v4.app包下的类。
点击下载源码>>
ViewPagerIndicator+ViewPager实现Tab
使用开源控件ViewPagerIndicator+ViewPager实现Tab,即可点击Tab进行切换,又可左右滑动切换。同时可以大大简化代码,方便维护。下面实现一个Tab例子,效果图如下所示:
一.AndroidStudio导入ViewPagerIndicator
1.在app上右击,选择open module Settings
2.点击Dependencies,然后点击右侧的“+”,选择1.Library dependency
3.在输入框中输入ViewPagerIndicator,点击旁边的搜索图标,出现匹配的文件后,点击OK
二.主布局文件
主布局文件包含TabPageIndicator和ViewPager两个组件。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.viewpagerindicator.TabPageIndicator android:id="@+id/tab_page_indicator" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/transparent"/> <android.support.v4.view.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>
三.Tab内容对应的布局文件
布局文件fragment.xml中采用相对布局,只有一个TextView。
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/id_tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="25sp" android:textStyle="bold" android:gravity="center" android:layout_centerInParent="true"/> </RelativeLayout>
四.创建FragmentPagerAdapter适配器
创建FragmentPagerAdapter适配器,需要实现getItem(),getCount(),etPageTitle()三个方法。
import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; public class TabAdapter extends FragmentPagerAdapter { public static String[] TITLES = new String[]{"Tab1","Tab2","Tab3","Tab4","Tab5"}; public TabAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { TabFragment tabFragment = new TabFragment(position); return tabFragment; } @Override public int getCount() { return TITLES.length; } @Override public CharSequence getPageTitle(int position) { return TITLES[position]; } }
五.创建TabFragment类
TabFragment需要实现Fragment,在onCreateView()方法中创建Tab对应显示的页面内容。
import android.annotation.SuppressLint; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; @SuppressLint("ValidFragment") public class TabFragment extends Fragment { private int pos; @SuppressLint("ValidFragment") public TabFragment(int pos) { this.pos = pos; } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment,container,false); TextView textView = (TextView) view.findViewById(R.id.id_tv); textView.setText(TabAdapter.TITLES[pos]); return view; } }
六.主程序代码
在主程序中,让MainActivity继承FragmentActivity,并为ViewPager设置适配器,同时为TabPageIndicator设置ViewPager。
import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewPager; import com.viewpagerindicator.TabPageIndicator; public class MainActivity extends FragmentActivity { private TabPageIndicator tabPageIndicator; private ViewPager viewPager; private TabAdapter adpater; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { tabPageIndicator = (TabPageIndicator) findViewById(R.id.tab_page_indicator); viewPager = (ViewPager) findViewById(R.id.view_pager); adpater = new TabAdapter(getSupportFragmentManager()); viewPager.setAdapter(adpater); //为ViewPager设置适配器 tabPageIndicator.setViewPager(viewPager); //为TabPageIndicator设置ViewPager } }
注意:前面出现的 Fragment,FragmentActivity,FragmentManager,FragmentPagerAdapter同样需要导入android.support.v4.app包下的类。
七.为Tab设置样式
在style.xml中加入如下代码:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> <style name="MyTheme" parent="AppTheme"> <item name="vpiTabPageIndicatorStyle">@style/MyWidget.TabPageIndicator</item> <item name="android:windowNoTitle">true</item> <item name="android:animationDuration">5000</item> <item name="android:windowContentOverlay">@null</item> </style> <style name="MyWidget.TabPageIndicator" parent="Widget"> <item name="android:gravity">center</item> <item name="android:background">@drawable/vpi__tab_indicator</item> <item name="android:paddingLeft">22dip</item> <item name="android:paddingRight">22dip</item> <item name="android:paddingTop">8dp</item> <item name="android:paddingBottom">8dp</item> <item name="android:textAppearance">@style/MyTextAppearance.TabPageIndicator</item> <item name="android:textSize">16sp</item> <item name="android:maxLines">1</item> </style> <style name="MyTextAppearance.TabPageIndicator" parent="Widget"> <item name="android:textStyle">bold</item> <item name="android:textColor">#262626</item> </style>
并将AndroidManifest.xml中application标签的android:theme属性改为@style/MyTheme
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/MyTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
点击下载源码>>
相关文章推荐
- 关于android studio导入工程的正确姿势
- Android中的进程间通信(IPC机制)
- android DiskLruCache使用方法
- android studio 问题集
- 《Android群英传》---读书笔记5
- 巧用Snackbar代替Toast
- web文件下载和Android文件下载的区别小结
- Android创建桌面快捷方式
- Android10
- Android09
- Android studio编程时出现的错误:unspecified on project app resolves to an APK archive which is not supported
- 使用命令行编译和安装Android程序
- EasyClient android 编译arm64-v8a库遇到的坑
- android studio 快捷键
- Android ExceptionHandler
- Android中如何实现圆形按钮的颜色变化
- Android studio连接不上创建好的模拟器
- Android自定义View之View的绘制流程
- android复习路之tween动画篇
- Android学习笔记46:使用Post方式提交数据