我发现了一个解决方案,它有点像这里提到的一些解决方案的合并。
其思想是测量ViewPager的当前视图。
以下是完整的代码:
MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewPager.adapter = WrapHeightViewPager.CustomPagerAdapter(this)
}
}
activity_main.xml
<FrameLayout
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"
tools:context=".MainActivity">
<com.android.myapplication.WrapHeightViewPager
android:layout_width="match_parent" android:id="@+id/viewPager"
android:background="#33ff0000"
android:layout_height="wrap_content"/>
</FrameLayout>
view_pager_page.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:src="@android:drawable/sym_def_app_icon"/>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/textView"/>
</LinearLayout>
WrapHeightViewPager.kt
class WrapHeightViewPager : ViewPager {
constructor(context: Context) : super(context) {}
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {}
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
val adapter = adapter as CustomPagerAdapter?
val currentView = adapter?.currentView
if (currentView != null) {
currentView.measure(widthMeasureSpec, heightMeasureSpec)
super.onMeasure(
widthMeasureSpec,
View.MeasureSpec.makeMeasureSpec(currentView.measuredHeight, View.MeasureSpec.EXACTLY)
)
return
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
}
class CustomPagerAdapter(private val context: Context) : PagerAdapter() {
var currentView: View? = null
override fun instantiateItem(parent: ViewGroup, position: Int): Any {
val inflater = LayoutInflater.from(context)
val view = inflater.inflate(R.layout.view_pager_page, parent, false)
view.textView.text = "item$position"
parent.addView(view)
return view
}
override fun setPrimaryItem(container: ViewGroup, position: Int, obj: Any) {
super.setPrimaryItem(container, position, obj)
currentView = obj as View
}
override fun destroyItem(collection: ViewGroup, position: Int, view: Any) = collection.removeView(view as View)
override fun getCount(): Int = 3
override fun isViewFromObject(view: View, obj: Any) = view === obj
override fun getPageTitle(position: Int): CharSequence? = "item $position"
}
}
如果你使用RecyclerPagerAdapter库,获取"currentView"的方法是从你设置的pager-view-holder中获取:
val item = obj as PagerViewHolder
currentView = item.itemView