{
“activeSize”: 16,
“normalSize”: 14,
“activeColor”: “#ED7282”,
“normalColor”: “#666666”,
“select”: 0,
“tabGravity”: 0,
“tabs”: [
{
“title”: “图片”,
“index”: 0,
“tag”: “pics”,
“enable”: true
},
{
“title”: “视频”,
“index”: 1,
“tag”: “video”,
“enable”: true
},
{
“title”: “文本”,
“index”: 1,
“tag”: “text”,
“enable”: true
}
]
}
/**
*/
public static SofaTab getSofaTabConfig() {
if (sSofaTab == null) {
String content = parseFile(“sofa_tabs_config.json”);
sSofaTab = JSON.parseObject(content, SofaTab.class);
Collections.sort(sSofaTab.getTabs(), (o1, o2) -> {
return o1.getIndex() < o2.getIndex() ? -1 : 1;
});
}
return sSofaTab;
}
private static String parseFile(String fileName) {
AssetManager assets = AppGlobals.getApplication().getAssets();
InputStream is = null;
BufferedReader br = null;
StringBuilder builder = new StringBuilder();
try {
is = assets.open(fileName);
br = new BufferedReader(new InputStreamReader(is));
String line = null;
while ((line = br.readLine()) != null) {
builder.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
if (br != null) {
br.close();
}
} catch (Exception e) {
}
}
return builder.toString();
}
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:app=“http://schemas.android.com/apk/res-auto”
xmlns:tools=“http://schemas.android.com/tools”>
<LinearLayout
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“vertical”
tools:context=".ui.sofa.SofaFragment">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width=“match_parent”
android:layout_height="@dimen/dp_45"
app:tabGravity=“center”
app:tabIndicatorColor="
@color/color_theme"
app:tabIndicatorFullWidth=“false”
app:tabIndicatorHeight="@dimen/dp_2"
app:tabInlineLabel=“true”
app:tabMode=“scrollable”
app:tabSelectedTextColor="@color/color_theme"
app:tabTextColor="@color/color_333"
app:tabUnboundedRipple=“true” />
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/view_pager"
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“horizontal” />
@FragmentDestination(pageUrl = “main/tabs/sofa”, asStarter = false)
public class SofaFragment extends Fragment {
private FragmentSofaBinding binding;
private List<SofaTab.TabsBean> tabsList;
private List mFragments = new ArrayList<>();
private TabLayoutMediator mediator;
private SofaTab tabConfig;
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
binding = FragmentSofaBinding.inflate(inflater, container, false);
return binding.getRoot();
}
@SuppressLint(“WrongConstant”)
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mFragments.clear();
mFragments.add(BlankFragment.newInstance(“图片”));
mFragments.add(BlankFragment.newInstance(“视频”));
mFragments.add(BlankFragment.newInstance(“文本”));
tabConfig = getTabConfig();
tabsList = new CopyOnWriteArrayList<>();
for (SofaTab.TabsBean tab : tabConfig.getTabs()) {
if (tab.isEnable()) {
tabsList.add(tab);
}
}
//限制页面预加载
binding.viewPager.setOffscreenPageLimit(ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT);
//viewPager2默认只有一种类型的Adapter。FragmentStateAdapter
//并且在页面切换的时候 不会调用子Fragment的setUserVisibleHint ,取而代之的是onPause(),onResume()、
binding.viewPager.setAdapter(new FragmentStateAdapter(getChildFragmentManager(), this.getLifecycle()) {
@NonNull
@Override
public Fragment createFragment(int position) {
return getTabFragment(position);
}
@Override
public int getItemCount() {
return tabsList.size();
}
});
/**
*/
binding.tabLayout.setTabGravity(tabConfig.getTabGravity());
//viewPager2 就不能和再用TabLayout.setUpWithViewPager()了
//取而代之的是TabLayoutMediator。我们可以在onConfigureTab()方法的回调里面 做tab标签的配置
//其中autoRefresh的意思是:如果viewPager2 中child的数量发生了变化,也即我们调用了adapter#notifyItemChanged()前后getItemCount不同。
//要不要 重新刷野tabLayout的tab标签。视情况而定,像咱们sofaFragment的tab数量一旦固定了是不会变的,传true/false 都问题不大
mediator = new TabLayoutMediator(binding.tabLayout, binding.viewPager, false, (tab, position) -> {
tab.setCustomView(makeTabView(position));
});
mediator.attach();
binding.viewPager.registerOnPageChangeCallback(mPageChangeCallback);
//切换到默认选择项,那当然要等待初始化完成之后才有效
binding.viewPager.post(() -> binding.viewPager.setCurrentItem(tabConfig.getSelect(), false));
}
/**
-
自定义tab的view内容
-
@param position
-
@return
or(binding.tabLayout, binding.viewPager, false, (tab, position) -> {
tab.setCustomView(makeTabView(position));
});
mediator.attach();
binding.viewPager.registerOnPageChangeCallback(mPageChangeCallback);
//切换到默认选择项,那当然要等待初始化完成之后才有效
binding.viewPager.post(() -> binding.viewPager.setCurrentItem(tabConfig.getSelect(), false));
}
/**
-
自定义tab的view内容
-
@param position
-
@return
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)