Android:我无法拥有 ViewPager WRAP_CONTENT

Posted

技术标签:

【中文标题】Android:我无法拥有 ViewPager WRAP_CONTENT【英文标题】:Android: I am unable to have ViewPager WRAP_CONTENT 【发布时间】:2012-01-13 17:54:41 【问题描述】:

我已经设置了一个简单的 ViewPager,它在每个页面上都有一个高度为 200dp 的 ImageView。

这是我的寻呼机:

pager = new ViewPager(this);
pager.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
pager.setBackgroundColor(Color.WHITE);
pager.setOnPageChangeListener(listener);
layout.addView(pager);

尽管高度设置为 wrap_content,但即使图像视图只有 200dp,寻呼机也始终填满屏幕。我试图用“200”替换寻呼机的高度,但这给了我不同分辨率的不同结果。我无法将“dp”添加到该值。如何将 200dp 添加到寻呼机的布局?

【问题讨论】:

请star issuecode.google.com/p/android/issues/detail?id=54604 【参考方案1】:

我的情况是添加 android:fillViewport="true" 解决了这个问题

【讨论】:

【参考方案2】:

将 ViewPager 的父布局指定为 NestedScrollView

   <androidx.core.widget.NestedScrollView
    android:layout_
    android:layout_
    android:paddingLeft="5dp"
    android:paddingRight="5dp"
    android:fillViewport="true">
        <androidx.viewpager.widget.ViewPager
            android:id="@+id/viewPager"
            android:layout_
            android:layout_>
        </androidx.viewpager.widget.ViewPager>
    </androidx.core.widget.NestedScrollView>

别忘了设置android:fillViewport="true"

这将拉伸滚动视图及其子项的内容以填充视口。

https://developer.android.com/reference/android/widget/ScrollView.html#attr_android:fillViewport

【讨论】:

【参考方案3】:

我找到了一个有点像合并这里提到的一些解决方案的解决方案。

这个想法是测量 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_
        android:layout_
        tools:context=".MainActivity">

    <com.android.myapplication.WrapHeightViewPager
            android:layout_ android:id="@+id/viewPager"
            android:background="#33ff0000"
            android:layout_/>

</FrameLayout>

view_pager_page.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical" android:gravity="center"
              android:layout_
              android:layout_>

    <ImageView android:layout_ android:layout_
               android:src="@android:drawable/sym_def_app_icon"/>


    <TextView android:layout_ android:layout_ 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 library,获取“currentView”的方法是从你设置的pager-view-holder获取它:

    val item = obj as PagerViewHolder
    currentView = item.itemView

【讨论】:

以上是关于Android:我无法拥有 ViewPager WRAP_CONTENT的主要内容,如果未能解决你的问题,请参考以下文章

为啥android中的ViewPager只能在V4 Support库中使用

Android Studio 无法解析 fragmentActivity 和 ViewPager 导入

带有ListView的Android ViewPager在调用notifyDatasetchanged时无法记住最后一个位置

android viewpager怎么使用 findviewbytag

为啥Android ViewPager2 类是final?

覆盖viewpager内容的Android导航栏