產(chǎn)品需求:
一個dialog中有個點擊顯示詳情按鈕,而詳情要是在彈窗內(nèi)部展示孤荣,產(chǎn)品需要的效果是想頁面跳轉(zhuǎn)一樣有一個向右的動畫效果甸陌,這個時候就想到了在dialog中嵌套viewpager來完成
碰到的問題:
- 選擇方案
在dialog中嵌套viewpager會存在報錯的異常,網(wǎng)上有很多多說了盐股,給出的解決方案是使用dialogfragment來替代dialog嵌套viewpager钱豁,由于自身項目中fragment使用也很多,所以就直接選用這套方案疯汁。 - 高度匹配問題
由于viewpager里面的布局高度為wrap_content時并沒作用牲尺,會出現(xiàn)高度撐不滿或者空白區(qū)域很多的情況,這個時候需要一個復(fù)寫viewpager的自定義控件幌蚊,計算子空間高度谤碳,取最大高度設(shè)置會viewapager高度,復(fù)寫onMeasure方法溢豆,代碼如下
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int height = 0;
for(int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
int h = child.getMeasuredHeight();
if(h > height) height = h;
}
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
- 新問題的出現(xiàn)
本以為就此可以結(jié)束蜒简,但是在添加了詳情界面的列表是,出現(xiàn)了高度鋪滿屏幕的問題漩仙,新出現(xiàn)的問題是搓茬,列表界面的height測量出來是無效高的,只要沒有設(shè)置指定的高度讯赏,是會把所有的高度給到列表的垮兑,所以通過上訴的重寫onMeasure測量出來的最大child的高度就是撐屏幕的高度冷尉。仔細(xì)研究需求漱挎,根據(jù)我們界面,詳情列表的展示區(qū)域是和當(dāng)前界面的展示區(qū)域是一樣高度的雀哨,所以改造onMeasure方法 之測量第一個pager的高度作為viewpager的高度磕谅,代碼如下
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
var height = 0
//下面遍歷所有child的高度
for (i in 0 until childCount) {
if (i == 0) {
val child = getChildAt(i)
child.measure(widthMeasureSpec,
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED))
val h = child.measuredHeight
if (h > height)
//采用最大的view的高度。
height = h
}
}
var heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY)
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
}
- 額外的需求
去除viewpager的滑動效果雾棺,只有在點擊的時候進(jìn)行跳轉(zhuǎn)膊夹,實現(xiàn)點擊右滑動畫,只需要在剛才自定義viewpager的控件中添加:
fun setNoScroll(noScroll: Boolean) {
this.noScroll = noScroll
}
override fun onTouchEvent(arg0: MotionEvent): Boolean {
return if (noScroll)
false
else
super.onTouchEvent(arg0)
}
override fun onInterceptTouchEvent(arg0: MotionEvent): Boolean {
return if (noScroll)
false
else
super.onInterceptTouchEvent(arg0)
}
- 邊距問題
最后碰到一個非常奇怪的問題捌浩,設(shè)置viewpager內(nèi)部pager的邊距時 直接設(shè)置在跟布局viewpager上放刨,在內(nèi)部pager設(shè)置邊距可能會和跟布局padding沖突,僅此記錄尸饺。