1、定义Fragment 数组,存储要使用的所有Fragment
private Fragment[] mFragments;
mFragments = new Fragment[4];
mFragments[0] = new Fragment1();
mFragments[1] = new Fragment2();
mFragments[2] = new Fragment3();
mFragments[3] = new Fragment4();
2、设置默认显示的Fragment
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.fl_show, mFragments[0]);
transaction.commit();
3、隐藏和显示
public void switchContentWeb(Fragment from, Fragment to) {
if (from != to) {
mContent = to;
FragmentTransaction transaction = manager.beginTransaction();
// .setCustomAnimations(
// android.R.anim.fade_in, android.R.anim.fade_out);
if (!to.isAdded()) { // 先判断是否被add过
transaction.hide(from).add(R.id.fl_show, to).commit(); // 隐藏当前的fragment,add下一个到Activity中
} else {
transaction.hide(from).show(to).commit(); // 隐藏当前的fragment,显示下一个
}
}
}
TabLayout + ViewPager + Fragment
Fragment内嵌套包含ViewPager以及多个Fragment
1、定义定义Fragment 数组,存储ViewPager 要使用的所有Fragment
private List<Fragment> fragmentList = new ArrayList<>();
Bundle bundle = new Bundle();
bundle.putSerializable(“argument”, TabListBean);
bundle.putInt("pos",i);
WebFragment webFragment = new WebFragment();
webFragment.setArguments(bundle);
fragmentList.add(webFragment);
adapter = new AmusementFragmentAdapter(getChildFragmentManager(), fragmentList, tabList);
viewPager.setAdapter(adapter);
//懒加载
viewPager.setOffscreenPageLimit(tabList.size() - 1);
//tabLayout关联viewPager
tabLayout.setupWithViewPager(viewPager);
2、设置默认显示项
tabLayout.getTabAt(pos).select();
3、定义viewPager的FragmentAdapter
public class AmusementFragmentAdapter extends FragmentPagerAdapter {
List<Fragment> fragmentList = new ArrayList<Fragment>();
public List<AmusementResponse.TabListBean> tabItemses;
public AmusementFragmentAdapter(FragmentManager fm, List<Fragment> fragmentList, List<AmusementResponse
.TabListBean> itemses) {
super(fm);
this.fragmentList = fragmentList;
this.tabItemses = itemses;
}
@Override
public Fragment getItem(int position) {
LogUtils.e("AmusementFragmentAdapter","getItem:"+position);
return fragmentList.get(position);
}
@Override
public int getCount() {
return tabItemses == null ? 0 : tabItemses.size();
}
@Override
public CharSequence getPageTitle(int position) {
return tabItemses.get(position).getName();
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
LogUtils.e("AmusementFragmentAdapter","destroyItem position:"+position);
// super.destroyItem(container, position, object);
}
}
4、设置TabLayout显示模式及间距
tabLayout.setTabMode(TabLayout.MODE_FIXED);
private void setTabView() {
tabLayout.post(new Runnable() {
@Override
public void run() {
try {
//拿到tabLayout的mTabStrip属性
Field mTabStripField = tabLayout.getClass().getDeclaredField("mTabStrip");
mTabStripField.setAccessible(true);
LinearLayout mTabStrip = (LinearLayout) mTabStripField.get(tabLayout);
int dp6 = Utils.dp2px(AmusementFragment2.this.getContext(), 6);
int dp3 = Utils.dp2px(AmusementFragment2.this.getContext(), 3);
for (int i = 0; i < mTabStrip.getChildCount(); i++) {
View tabView = mTabStrip.getChildAt(i);
//拿到tabView的mTextView属性
Field mTextViewField = tabView.getClass().getDeclaredField("mTextView");
mTextViewField.setAccessible(true);
TextView mTextView = (TextView) mTextViewField.get(tabView);
tabView.setPadding(0, 0, 0, 0);
//因为我想要的效果是 字多宽线就多宽,所以测量mTextView的宽度
int width = 0;
width = mTextView.getWidth();
if (width == 0) {
mTextView.measure(0, 0);
width = mTextView.getMeasuredWidth();
}
//设置tab左右间距为10dp 注意这里不能使用Padding 因为源码中线的宽度是根据 tabView的宽度来设置的
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) tabView.getLayoutParams();
params.width = width + 2 * dp3;
params.leftMargin = dp3;
params.rightMargin = dp3;
tabView.setLayoutParams(params);
tabView.invalidate();
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
});
}
5、监听横竖屏变化,x5 webview横屏看视频返回后 可能会出现view覆盖或异常的情况.
全屏切换后,Tab页中fragment使用的是new
的方式添加WebView到页面中,不添加WebView时进行全屏切换不会出现该问题,确认为WebView的问题。猜测为全屏时处理WebView所致。故在全屏时隐藏WebView所在的ViewPager,正常时再显示ViewPager
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
{//横屏
// saveFragmentState(0,this);
if(android.os.Build.VERSION.SDK_INT >= 26 ){
viewPager.setVisibility(View.GONE);
}
}else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
if(Utils.WEB_TAB_POS >= 0 && Utils.WEB_TAB_POS < tabList.size()){
int pos = Utils.WEB_TAB_POS;
try{
if(android.os.Build.VERSION.SDK_INT >= 26 ){
viewPager.setVisibility(View.VISIBLE);
if(tabLayout != null){
setTabView();
}
}
if(pos > 0){
viewPager.setCurrentItem(0);
viewPager.getAdapter().notifyDataSetChanged();
viewPager.setCurrentItem(pos);
viewPager.getAdapter().notifyDataSetChanged();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}
6、fragment切换时,每个fragment的setUserVisibleHint函数被调用
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser){
Utils.WEB_TAB_POS = position;
}
}