Android NestedScrollView/ScrollView包裹ViewPager自适应高度
当Android的NestedScrollView/ScrollView这类滚动View包裹ViewPager时候,ViewPager中的Fragment包含的又是一系列高度值不固定的View如RecyclerView等等,就会造成ViewPager高度无法自适应子Fragment里面的View的高度,解决方法其中之一就是重新改造ViewPager,让其能自动适应子Fragment里面的View高度,改造后的AutofitHeightViewPager:
import android.content.Context; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import java.util.HashMap; import java.util.LinkedHashMap; public class AutofitHeightViewPager extends ViewPager { public static final String POSITION = "position"; private int mCurPosition; private int mHeight = 0; private HashMap<Integer, View> mChildrenViews = new LinkedHashMap<Integer, View>(); private boolean scrollble = true; public AutofitHeightViewPager(Context context) { super(context); } public AutofitHeightViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (mChildrenViews.size() > mCurPosition) { View child = mChildrenViews.get(mCurPosition); if (child != null) { child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); mHeight = child.getMeasuredHeight(); } } if (mHeight != 0) { heightMeasureSpec = MeasureSpec.makeMeasureSpec(mHeight, MeasureSpec.EXACTLY); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } public void updateHeight(int current) { this.mCurPosition = current; if (mChildrenViews.size() > current) { ViewGroup.LayoutParams layoutParams = getLayoutParams(); if (layoutParams == null) { layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, mHeight); } else { layoutParams.height = mHeight; } setLayoutParams(layoutParams); } } public void setViewPosition(View view, int position) { mChildrenViews.put(position, view); } @Override public boolean onTouchEvent(MotionEvent ev) { if (!scrollble) { return true; } return super.onTouchEvent(ev); } public boolean isScrollble() { return scrollble; } public void setScrollble(boolean scrollble) { this.scrollble = scrollble; } }
自适应高度的ViewPager思路是每一次切换时候,重新设置ViewPager的高度值。
使用方法有四点必须实现:
1,先把AutofitHeightViewPager像Android原生的ViewPager一样写进xml布局。
2,在上层Java代码的mViewPager添加的切换事件addOnPageChangeListener里面每次updateHeight,例如:
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { mViewPager.updateHeight(position); } @Override public void onPageScrollStateChanged(int state) { } });
3,构建mViewPager肯定要设置FragmentPagerAdapter,在把创建Fragment喂给FragmentPagerAdapter时候,给Fragment把当前Fragment位置position设置进去,例如:
Fragment xxxFragment = new XXXFragment(); Bundle xxxBunle = new Bundle(); xxxBunle.putInt(AutofitHeightViewPager.POSITION, 1); //1为当前位置,这里的位置索引即为要传递的值,不同的Fragment按照先后添加顺序添加和传递索引 xxxFragment.setArguments(xxxBunle); mPagerAdapter.addFragment(xxxFragment)
4,然后转入到具体的XXXFragment里面,把当前XXXFragment创建的View高度传回给AutofitHeightViewPager,一般是在onCreateView:
int pos = getArguments().getInt(AutofitHeightViewPager.POSITION); (强制转换为ViewPager所在的Activity) getActivity()).mViewPager.setViewPosition(view, pos);
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android 浅谈 maxEms 属性
小菜最近调整一个小需求,为了整体显示效果,需要限制一部分文字的长度,超过部分以...代替。 小菜本想偷个懒,用 android:maxLength="6" 属性配合 android:maxLines="1" 以及 android:ellipsize="end" 来实现,但是只可限制字符床度为6,没有省略号。然后想起有一个 android:maxEms="6" 属性来实现,默认超过长度以省略号结束。结果发现并非按字符长度计算,小菜还是太天真了。 android:maxEms="6" Tips1: android:singleLine="true" 属性已经在 API 中不建议使用,小菜在现有的设备中测试与 android:maxLines="1" 属性效果完全一致。Tips2: 在使用 android:maxEms="6" 属性时, TextView 的宽度需为 wrap_content 方式。 以下是小菜测试时遇到的问题: 左侧是从 maxEms = “1” 开始递增到 “16”,右侧是测量文字所占的宽度: 纯汉字 纯字母 纯数字 测试发现: 无论是文字还是字母或是数字,设置完 max...
- 下一篇
Android/iOS及设计中ARGB颜色值百分比透明度换算
Android/iOS及设计中ARGB颜色值百分比透明度换算 设计上经常要求对一个颜色值进行一定百分比的透明度,比如给定一个颜色0xFF0000FF(蓝色)要求80%透明,该如何处理呢?80%透明的蓝色值是多少呢? 常见的颜色是RGB表示的,就比如上面的蓝色0xFF0000FF,这个颜色值是16进制表示的,其中0x后面接着的两个16进制数字‘FF’就是ARGB中的‘A’,即alpha。A表示该颜色的不透明度。 A = 00(转为十进制是0)是完全透明;A = FF(转换为十进制是255)是完全不透明。 接着到的后面的每两位表示一个颜色,RGB(R,red;G,green;B,blue)。A值控制着对后面颜色的透明度处理。 计算机中表示颜色的透明度范围是(0 ~ 255,即16进制的00-FF)。0(00)表示完全透明。255(FF)表示完全不透明。 其实透明和不透明是一个硬币的两面,描述的都是一回事。比如说把一个颜色透明80%,换一个角度说是把这个颜色不透明20%。 假设设计要求对某一个颜色的透明80%,也就是说不透明度20% ( 1 - 80% = 20% ),那么就是255 x 2...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Mario游戏-低调大师作品
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用