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时无法记住最后一个位置