Fragment+Viewpager实现底部选项卡切换
一、用到的java类文件
- HomepageActivity
- MessageFragment
- HomeFragment
- RecommendFragment
- SettingFragment
- ShareFragment
- CustomPagerAdapter
二、用到的布局资源文件
- activity_homepage
- fragment_message
- fragment_home
- fragment_recommend
- fragment_setting
- fragment_share
- styles(res文件中的values文件中)
三、HomepageActivity代码
public class HomepageActivity extends FragmentActivity implements View.OnClickListener {
// 获取fragment管理器
FragmentManager fragmentmanager;
//声明存储fragment的集合
private ArrayList<Fragment> fragments;
//声明四个导航对应fragment
MessageFragment messageFragment;
HomeFragment homeFragment;
RecommendFragment recommendFragment;
SettingFragment settingFragment;
ShareFragment shareFragment;
//声明ViewPager
private ViewPager viewPager;
//声明导航栏中对应的布局
private LinearLayout ll_message, ll_home, ll_recommend, ll_setting, ll_share;
//声明导航栏中包含的imageview和textview
private ImageView image_message, image_home, image_recommend, image_setting, image_share;
private TextView tv_message, tv_home, tv_recommend, tv_setting, tv_share;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_homepage);
//初始化加载首页布局
initView();
//调用自定义initListener方法,为各个组件添加监听事件
initListener();
//设置默认选择的pager和导航栏的状态,即优先显示哪个fragment
viewPager.setCurrentItem(2);
image_home.setSelected(true);
tv_home.setSelected(true);
}
/**
* 事件监听
*/
private void initListener() {
//为四大导航组件添加监听
ll_message.setOnClickListener(this);
ll_home.setOnClickListener(this);
ll_recommend.setOnClickListener(this);
ll_setting.setOnClickListener(this);
ll_share.setOnClickListener(this);
//为viewpager添加页面变化的监听以及事件处理
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
// 当页面滑动时,这个方法将被调用,无论是编程方式启动一个平滑滚动,还是用户手动触摸滑动。
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
// 当onPageSelected()被调用时,页面切换动画还没结束,还会继续调用onPageScrolled()
// 当页面滑动时,对应的textview,imageview相应发生改变
@Override
public void onPageSelected(int position) {
// 设置初始状态下底部导航的图标
resetImg();
//根据位置直接决定显示哪个fragment
viewPager.setCurrentItem(position);
switch (position) {
case 0:
image_message.setSelected(true);
image_message.setImageResource(R.drawable.message_pressed);
tv_message.setSelected(true);
image_home.setSelected(false);
tv_home.setSelected(false);
image_recommend.setSelected(false);
tv_recommend.setSelected(false);
image_setting.setSelected(false);
tv_setting.setSelected(false);
image_share.setSelected(false);
tv_share.setSelected(false);
break;
case 1:
image_message.setSelected(false);
tv_message.setSelected(false);
image_home.setSelected(true);
image_home.setImageResource(R.drawable.home_pressed);
tv_home.setSelected(true);
image_recommend.setSelected(false);
tv_recommend.setSelected(false);
image_setting.setSelected(false);
tv_setting.setSelected(false);
image_share.setSelected(false);
tv_share.setSelected(false);
break;
case 2:
image_message.setSelected(false);
tv_message.setSelected(false);
image_home.setSelected(false);
tv_home.setSelected(false);
image_recommend.setSelected(true);
image_recommend.setImageResource(R.drawable.recommend_pressed);
tv_recommend.setSelected(true);
image_setting.setSelected(false);
tv_setting.setSelected(false);
image_share.setSelected(false);
tv_share.setSelected(false);
break;
case 3:
image_message.setSelected(false);
tv_message.setSelected(false);
image_home.setSelected(false);
tv_home.setSelected(false);
image_recommend.setSelected(false);
tv_recommend.setSelected(false);
image_setting.setSelected(true);
image_setting.setImageResource(R.drawable.setting_pressed);
tv_setting.setSelected(true);
image_share.setSelected(false);
tv_share.setSelected(false);
break;
case 4:
image_message.setSelected(false);
tv_message.setSelected(false);
image_home.setSelected(false);
tv_home.setSelected(false);
image_recommend.setSelected(false);
tv_recommend.setSelected(false);
image_setting.setSelected(false);
tv_setting.setSelected(false);
image_share.setSelected(true);
image_share.setImageResource(R.drawable.share_pressed);
tv_share.setSelected(true);
}
}
// 当滑动状态改变时被调用,有助于发现当用户开始拖拽,当页面自动的安放在当前页面,或当页面完全停止
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
/**
* 加载布局资源文件
*/
private void initView() {
//在主布局中根据id找到ViewPager
viewPager = (ViewPager) findViewById(R.id.viewPager);
//实例化所属五个fragment
messageFragment = new MessageFragment();
homeFragment = new HomeFragment();
recommendFragment = new RecommendFragment();
settingFragment = new SettingFragment();
shareFragment = new ShareFragment();
fragments = new ArrayList<>();
//添加fragments到集合中
fragments.add(messageFragment);
fragments.add(shareFragment);
fragments.add(homeFragment);
fragments.add(recommendFragment);
fragments.add(settingFragment);
fragmentmanager = getSupportFragmentManager();
CustomPagerAdapter adapter = new CustomPagerAdapter(fragmentmanager, fragments);
viewPager.setAdapter(adapter);
ll_message = (LinearLayout) findViewById(R.id.ll_message);
ll_share = (LinearLayout) findViewById(R.id.ll_share);
ll_home = (LinearLayout) findViewById(R.id.ll_home);
ll_recommend = (LinearLayout) findViewById(R.id.ll_recommend);
ll_setting = (LinearLayout) findViewById(R.id.ll_setting);
image_message = (ImageView) findViewById(R.id.tab_message_img);
image_share = (ImageView) findViewById(R.id.tab_share_img);
image_home = (ImageView) findViewById(R.id.tab_home_img);
image_recommend = (ImageView) findViewById(R.id.tab_recommend_img);
image_setting = (ImageView) findViewById(R.id.tab_setting_img);
tv_message = (TextView) findViewById(R.id.tv_message);
tv_share = (TextView) findViewById(R.id.tv_share);
tv_home = (TextView) findViewById(R.id.tv_home);
tv_recommend = (TextView) findViewById(R.id.tv_recommend);
tv_setting = (TextView) findViewById(R.id.tv_setting);
}
/**
* 设置导航栏的点击事件并同步更新对应的ViewPager
* 点击事件其实就是更改导航布局中对应的Text/ImageView的选中状态
* 与上述的滑动状态同理
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ll_message:
viewPager.setCurrentItem(0); // viewpager显示最左边的fragment,例如messagefragment
image_message.setSelected(true);
image_message.setImageResource(R.drawable.message_pressed);
tv_message.setSelected(true);
image_home.setSelected(false);
tv_home.setSelected(false);
image_recommend.setSelected(false);
tv_recommend.setSelected(false);
image_setting.setSelected(false);
tv_setting.setSelected(false);
image_share.setSelected(false);
tv_share.setSelected(false);
break;
case R.id.ll_share:
viewPager.setCurrentItem(1);
image_message.setSelected(false);
tv_message.setSelected(false);
image_home.setSelected(false);
tv_home.setSelected(false);
image_recommend.setSelected(false);
tv_recommend.setSelected(false);
image_setting.setSelected(false);
tv_setting.setSelected(false);
image_share.setSelected(true);
image_share.setImageResource(R.drawable.share_pressed);
tv_share.setSelected(true);
break;
case R.id.ll_home:
viewPager.setCurrentItem(2);
image_message.setSelected(false);
tv_message.setSelected(false);
image_home.setSelected(true);
image_home.setImageResource(R.drawable.home_pressed);
tv_home.setSelected(true);
image_recommend.setSelected(false);
tv_recommend.setSelected(false);
image_setting.setSelected(false);
tv_setting.setSelected(false);
image_share.setSelected(false);
tv_share.setSelected(false);
break;
case R.id.ll_recommend:
viewPager.setCurrentItem(3);
image_message.setSelected(false);
tv_message.setSelected(false);
image_home.setSelected(false);
tv_home.setSelected(false);
image_recommend.setSelected(true);
image_recommend.setImageResource(R.drawable.recommend_pressed);
tv_recommend.setSelected(true);
image_setting.setSelected(false);
tv_setting.setSelected(false);
image_share.setSelected(false);
tv_share.setSelected(false);
break;
case R.id.ll_setting:
viewPager.setCurrentItem(4);
image_message.setSelected(false);
tv_message.setSelected(false);
image_home.setSelected(false);
tv_home.setSelected(false);
image_recommend.setSelected(false);
tv_recommend.setSelected(false);
image_setting.setSelected(true);
image_setting.setImageResource(R.drawable.setting_pressed);
tv_setting.setSelected(true);
image_share.setSelected(false);
tv_share.setSelected(false);
break;
}
}
/**
* 将当前fragment的图标显示不同状态(初始状态)
* 例如当前fragment为homefragment,则底部图标为白色
*/
private void resetImg() {
image_message.setImageResource(R.drawable.message);
image_home.setImageResource(R.drawable.home);
image_recommend.setImageResource(R.drawable.recommend);
image_setting.setImageResource(R.drawable.setting);
image_share.setImageResource(R.drawable.share);
}
}
四、 CustomPagerAdapter代码
public class CustomPagerAdapter extends FragmentPagerAdapter {
//fragment与viewpager结合
private List<Fragment> fragments;
// 构造方法
public CustomPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm); // 调用父类含参构造方法(FragmentPagerAdapter)
this.fragments = fragments; // 将fragment传入Adapter中
fm.beginTransaction().commit(); // 打开事务、提交事务
}
// 根据position返回对应位置的fragment,在instantiateItem(实例化元素)方法中调用
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
// 首先调用此方法,计算页面个数
@Override
public int getCount() {
return this.fragments.size();
}
// 返回当前item位置(position)
@Override
public long getItemId(int position) {
return position;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
//super.destroyItem(container, position, object);
// 注释此行代码,不删除当前加载完毕的fragment,避免重复加载
}
}
五、MessageFragment代码,其他四个部分fragment同理
public class MessageFragment extends android.support.v4.app.Fragment {
private View view;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_message, null);
return view;
}
}
六、activity_homepage代码
<?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">
<!--页面顶部蓝色条纹 -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="45dp"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:background="#367cf6" />
<ImageView
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_centerInParent="true" />
</RelativeLayout>
<!--页面中间部分fragment+viewpager -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<FrameLayout
android:id="@+id/frame_layout"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</FrameLayout>
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
<!--灰色水平线 -->
<View style="@style/bg_line" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/ll_message"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="#367cf6"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/tab_message_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="消息"
android:textColor="#ffffff" />
</LinearLayout>
<!--灰色竖线 -->
<View style="@style/bg_line_vertical" />
<LinearLayout
android:id="@+id/ll_share"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#367cf6"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/tab_share_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_share"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="分享"
android:textColor="#ffffff" />
</LinearLayout>
<!--灰色竖线 -->
<View style="@style/bg_line_vertical" />
<LinearLayout
android:id="@+id/ll_home"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#367cf6"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/tab_home_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_home"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="首页"
android:textColor="#ffffff" />
</LinearLayout>
<!--灰色竖线 -->
<View style="@style/bg_line_vertical" />
<LinearLayout
android:id="@+id/ll_recommend"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#367cf6"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/tab_recommend_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_recommend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="推荐"
android:textColor="#ffffff" />
</LinearLayout>
<!--灰色竖线 -->
<View style="@style/bg_line_vertical" />
<LinearLayout
android:id="@+id/ll_setting"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#367cf6"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/tab_setting_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_setting"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设置"
android:textColor="#ffffff" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
七、fragment_message,其余四个fragment同理
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:text="消息"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
八、styles文件添加view(res文件夹下values文件夹下)
<!-- view水平分割线样式 -->
<style name="bg_line">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">1px</item>
<item name="android:background">#ffffff</item>
</style>
<!-- view竖直分割线样式 -->
<style name="bg_line_vertical">
<item name="android:layout_width">1px</item>
<item name="android:layout_height">match_parent</item>
<item name="android:background">#ffffff</item>
</style>
参考链接
https://www.cnblogs.com/lianghui66/p/3607091.html
https://blog.csdn.net/baidu_26352053/article/details/72457719
https://blog.csdn.net/baidujiangwei18/article/details/51330813
https://blog.csdn.net/noaboutfengyue/article/details/50354592