在这里总结一下tab栏切换的几种方法
方法一:
TabLayout加ViewPager切换Fragment
main布局
<androidx.viewpager.widget.ViewPager
android:id="@+id/tab_vp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/tab_tab" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_tab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" />
思路 我们先设置一个集合去储存fragment把每个fragment添加到集添加到适配器
fragment适配器
public class FragmentAdapter extends FragmentPagerAdapter {
private ArrayList<Fragment> list;
public FragmentAdapter(@NonNull FragmentManager fm, ArrayList<Fragment> list) {
super(fm);
this.list = list;
}
public FragmentAdapter(@NonNull FragmentManager fm, int behavior, ArrayList<Fragment> list) {
super(fm);
this.list = list;
}
public FragmentAdapter(@NonNull FragmentManager fm) {
super(fm);
}
@NonNull
@Override
public Fragment getItem(int position) {
return list.get(position);
}
@Override
public int getCount() {
return list.size();
}
}
java代码
public class TabActivity extends AppCompatActivity {
@BindView(R.id.tab_vp)
ViewPager tabVp;
@BindView(R.id.tab_tab)
TabLayout tabTab;
private ArrayList<Fragment> list;
private FragmentAdapter fragmentAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tab);
ButterKnife.bind(this);
initView();
}
private void initView() {
//添加到fragment集合
list = new ArrayList<>();
list.add(new ClassroomFragment());
list.add(new AnswerQuestionsFragment());
list.add(new ActivitysFragment());
list.add(new MyFragment());
//把集合添加给适配器
fragmentAdapter = new FragmentAdapter(getSupportFragmentManager(), list);
tabVp.setAdapter(fragmentAdapter);
//tab绑定vp
tabTab.setupWithViewPager(tabVp);
//让他默认显示第0个下标的fragment
tabTab.setSelectedTabIndicatorHeight(0);
//给tab栏设置文字,图片选择器等,最后的setIcon是设置图片或点击效果
tabTab.getTabAt(0).setText("首页").setIcon(R.drawable.tab_classroom);
tabTab.getTabAt(1).setText("答疑").setIcon(R.drawable.tab_answerquestions);
tabTab.getTabAt(2).setText("活动").setIcon(R.drawable.tab_activitys);
tabTab.getTabAt(3).setText("我的").setIcon(R.drawable.tab_my);
}
选择器 需要在drawable创建xml文件 文件类型selector类型 自定义点击效果
android:state_selecte还有几个点击的样式大家可以自己试试
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/ketang_uncheck" android:state_selected="false" />
<item android:drawable="@mipmap/ketang_check" android:state_selected="true" />
</selector>
总结:这种方法因为ViewPager的预加载功能不是每次进页面都回走start()生命周期
为了提高用户体验,我们可以在fragment使用一些懒加载方案,实现加载延迟。这时我们会用到getUserVisibleHint()与setUserVisibleHint()这两个方法。
@Override
public boolean getUserVisibleHint() {
return super.getUserVisibleHint();
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
if (isVisibleToUser) {
initData();
Log.e("TAG", "MYsetUserVisibleHint: 数据加载");
}
super.setUserVisibleHint(isVisibleToUser);
}
当fragment被用户可见时,setUserVisibleHint()会调用且传入true值,当fragment不被用户可见时,setUserVisibleHint()则得到false值。