1:问题描述
在软件有一个主界面FragmentManagerActivity,在主界面的下面实现了BottomBar功能状态栏,点击每一项时会加载相应的Fragment,根据要求,需要在某一个fragment中实现,TabLayout和ViewPager的结合效果,如图所示:
2:代码实现
(1):首先实现点击下面第3个fragment的xml文件的代码编写,布局为fragment_temporary_task。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:id="@+id/draft_box_scrollview"
tools:context=".fragment.TemporaryTaskFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.material.tabs.TabLayout
android:id="@+id/fragment_temp_tabLayout"
android:layout_width="match_parent"
android:layout_height="30dp"
app:tabIndicatorColor="@color/lightblue"
app:tabTextColor="@color/gray"
app:tabSelectedTextColor="@color/lightblue"
app:tabTextAppearance="@style/TabLayoutTextStyle"
app:tabMode="fixed"
app:tabBackground="@drawable/selector_bg">
</com.google.android.material.tabs.TabLayout>
<androidx.viewpager.widget.ViewPager
android:id="@+id/fragment_temp_viewpager"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="0dp">
</androidx.viewpager.widget.ViewPager>
</LinearLayout>
</LinearLayout>
对应的Fragment文件
public class TemporaryTaskFragment extends Fragment {
private static final String TAG = "TemporaryTaskFragment";
private TabLayout mTabLayout;
private ViewPager mViewPager;
private TemporaryFragmentAdapter myFragmentPagerAdapter;
private TabLayout.Tab one;
private TabLayout.Tab two;
public TemporaryTaskFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.e(TAG,"onCreateView");
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_temporary_task, container, false);
initview(view);
return view;
}
private void initview(View view) {
//使用适配器将ViewPager与Fragment绑定在一起
mViewPager = view.findViewById(R.id.fragment_temp_viewpager);
myFragmentPagerAdapter = new TemporaryFragmentAdapter(getChildFragmentManager());
mViewPager.setAdapter(myFragmentPagerAdapter);
//将TabLayout与ViewPager绑定在一起
mTabLayout = view.findViewById(R.id.fragment_temp_tabLayout);
mTabLayout.setupWithViewPager(mViewPager);
//指定Tab的位置
one = mTabLayout.getTabAt(0);
two = mTabLayout.getTabAt(1);
}
}
注:如果此fragment是activity则需要将TemporaryFragmentAdapter()中传入getActivity().getSupportFragmentManager(),此处传入getChildFragmentManager()是因为在fragment内含有很多个fragment,又在fragment中嵌套了子fragment,如果设置为前者而不是getChildFragmentManager(),则会出现在滑动viewpager时出现错误。
(2):编写ViewPager的Adapter文件
public class TemporaryFragmentAdapter extends FragmentPagerAdapter {
private static final String TAG = "TemporaryTaskFragmentAd";
private final String[] mTitles = {"test1","test2"};
public TemporaryTaskFragmentAdapter(@NonNull FragmentManager fm) {
super(fm);
}
@NonNull
@Override
public Fragment getItem(int position) {
Log.e(TAG,"position:"+position);
if (position == 0){
return new DraftFragment();
}else if (position == 1){
return new CheckFragment();
}
return new DraftFragment();
}
@Override
public int getCount() {
return mTitles.length;
}
//ViewPager与TabLayout绑定后,这里获取到PageTitle就是Tab的Text
@Override
public CharSequence getPageTitle(int position) {
return mTitles[position];
}
}
这样在滑动时,就会跳转到相应的“任务起草”Fragment或“隐患上报”Fragment,而不会出现错误。