Android ViewPager2:无法根据其内容调整 ViewPager2 的宽度
Android ViewPager2: Not being able to make ViewPager2 width adjust to its content
这是我的主要非滚动内容:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
</data>
<RelativeLayout
android:id="@+id/llMainMain"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="150dp"
android:gravity="center">
<include
android:id="@+id/logo"
layout="@layout/testme_logo" />
</LinearLayout>
<LinearLayout
android:id="@+id/llSummary"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginTop="110dp"
android:paddingTop="130dp"
android:gravity="center_horizontal"
android:orientation="vertical">
<TextView
android:id="@+id/tvSummaryText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:textStyle="bold"
android:textSize="24sp" />
<LinearLayout
android:id="@+id/llLoadingSummary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/tvLoadingSummary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:textColor="#000000"
android:clickable="false"
android:layout_gravity="center"
android:gravity="center"
android:textIsSelectable="false"
android:text="@string/activitymain_textview_loadingsummary" />
</LinearLayout>
<TextView
android:id="@+id/tvNoTests"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:paddingStart="60dp"
android:paddingEnd="60dp"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:textSize="14sp"
android:gravity="center"
android:visibility="gone"
android:textIsSelectable="false"
android:text="@string/activitymain_textview_notests" />
<Button
android:id="@+id/btnDownloadTests"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:visibility="gone"
android:text="@string/mainmenu_button_downloadtests" />
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/pager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="invisible"
android:background="#ffffff" />
<ImageView
android:contentDescription="@string/pref_category_animations"
android:id="@+id/ivAnimated"
android:layout_marginTop="-350px"
android:layout_gravity="center"
android:layout_width="100dp"
android:layout_height="100dp" />
</LinearLayout>
<include
android:id="@+id/footermenu"
layout="@layout/footermenu" />
</RelativeLayout>
</layout>
这是滚动区域-pager-:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
</data>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:orientation="horizontal">
<androidx.cardview.widget.CardView
android:id="@+id/cardViewTests"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
app:cardCornerRadius="5dp"
app:cardElevation="10dp"
android:theme="@style/Theme.MaterialComponents.Light">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingBottom="10dp"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:orientation="vertical">
<TextView
android:id="@+id/tvFinishedTestsText"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginBottom="10dp"
android:gravity="center"
android:textStyle="bold"
android:textSize="20sp" />
<Button
android:id="@+id/tvFinishedTestsValue"
android:layout_width="50dp"
android:layout_height="50dp"
android:textAlignment="center"
android:layout_gravity="center"
android:textColor="#fff"
android:textSize="20sp"
android:textStyle="bold"
android:background="@drawable/circle" />
</LinearLayout>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:id="@+id/cardViewScore"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
app:cardCornerRadius="5dp"
app:cardElevation="10dp"
android:theme="@style/Theme.MaterialComponents.Light">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingBottom="10dp"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:orientation="vertical">
<TextView
android:id="@+id/tvScoreText"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginBottom="10dp"
android:gravity="center"
android:textStyle="bold"
android:textSize="20sp" />
<Button
android:id="@+id/tvScoreValue"
android:layout_width="50dp"
android:layout_height="50dp"
android:textAlignment="center"
android:layout_gravity="center"
android:textColor="#fff"
android:textSize="20sp"
android:textStyle="bold"
android:background="@drawable/circle" />
</LinearLayout>
</androidx.cardview.widget.CardView>
</LinearLayout>
<TextView
android:id="@+id/tvTestText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textStyle="bold"
android:textSize="20sp" />
</LinearLayout>
</layout>
我期望的是,当向左或向右滑动时,框不会移动到屏幕的开头(或结尾),而是移动到有限的区域。
我附上了两张屏幕截图,以便您了解我在说什么。在第二个中,我有意设置了一个彩色背景,因此当每个视图都设置为 wrap_content.
时,您可以注意到 ViewPager2 如何不调整其内容 (wrap_content)
我的期望:
苦苦思索了好几天,终于可以编程实现了:
mViewPager.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mViewPager.getViewTreeObserver().removeOnGlobalLayoutListener(this);
int viewPagerWidth = (mViewPager.findViewById(R.id.cardViewContainer)).getWidth();
int screenWidth = TMScreen.getScreenWidth(MainActivity.this);
int viewPagerMargin = TMScreen.dp2px(10);
int viewPagerPadding = (screenWidth - viewPagerWidth - viewPagerMargin) / 2;
mViewPager.setPadding(viewPagerPadding, 0, viewPagerPadding, 0);
}
});
这是我的主要非滚动内容:
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
</data>
<RelativeLayout
android:id="@+id/llMainMain"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="150dp"
android:gravity="center">
<include
android:id="@+id/logo"
layout="@layout/testme_logo" />
</LinearLayout>
<LinearLayout
android:id="@+id/llSummary"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginTop="110dp"
android:paddingTop="130dp"
android:gravity="center_horizontal"
android:orientation="vertical">
<TextView
android:id="@+id/tvSummaryText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:textStyle="bold"
android:textSize="24sp" />
<LinearLayout
android:id="@+id/llLoadingSummary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/tvLoadingSummary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:textColor="#000000"
android:clickable="false"
android:layout_gravity="center"
android:gravity="center"
android:textIsSelectable="false"
android:text="@string/activitymain_textview_loadingsummary" />
</LinearLayout>
<TextView
android:id="@+id/tvNoTests"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:paddingStart="60dp"
android:paddingEnd="60dp"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:textSize="14sp"
android:gravity="center"
android:visibility="gone"
android:textIsSelectable="false"
android:text="@string/activitymain_textview_notests" />
<Button
android:id="@+id/btnDownloadTests"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:visibility="gone"
android:text="@string/mainmenu_button_downloadtests" />
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/pager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="invisible"
android:background="#ffffff" />
<ImageView
android:contentDescription="@string/pref_category_animations"
android:id="@+id/ivAnimated"
android:layout_marginTop="-350px"
android:layout_gravity="center"
android:layout_width="100dp"
android:layout_height="100dp" />
</LinearLayout>
<include
android:id="@+id/footermenu"
layout="@layout/footermenu" />
</RelativeLayout>
</layout>
这是滚动区域-pager-:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
</data>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:orientation="horizontal">
<androidx.cardview.widget.CardView
android:id="@+id/cardViewTests"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
app:cardCornerRadius="5dp"
app:cardElevation="10dp"
android:theme="@style/Theme.MaterialComponents.Light">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingBottom="10dp"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:orientation="vertical">
<TextView
android:id="@+id/tvFinishedTestsText"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginBottom="10dp"
android:gravity="center"
android:textStyle="bold"
android:textSize="20sp" />
<Button
android:id="@+id/tvFinishedTestsValue"
android:layout_width="50dp"
android:layout_height="50dp"
android:textAlignment="center"
android:layout_gravity="center"
android:textColor="#fff"
android:textSize="20sp"
android:textStyle="bold"
android:background="@drawable/circle" />
</LinearLayout>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:id="@+id/cardViewScore"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
app:cardCornerRadius="5dp"
app:cardElevation="10dp"
android:theme="@style/Theme.MaterialComponents.Light">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingBottom="10dp"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:orientation="vertical">
<TextView
android:id="@+id/tvScoreText"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginBottom="10dp"
android:gravity="center"
android:textStyle="bold"
android:textSize="20sp" />
<Button
android:id="@+id/tvScoreValue"
android:layout_width="50dp"
android:layout_height="50dp"
android:textAlignment="center"
android:layout_gravity="center"
android:textColor="#fff"
android:textSize="20sp"
android:textStyle="bold"
android:background="@drawable/circle" />
</LinearLayout>
</androidx.cardview.widget.CardView>
</LinearLayout>
<TextView
android:id="@+id/tvTestText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textStyle="bold"
android:textSize="20sp" />
</LinearLayout>
</layout>
我期望的是,当向左或向右滑动时,框不会移动到屏幕的开头(或结尾),而是移动到有限的区域。
我附上了两张屏幕截图,以便您了解我在说什么。在第二个中,我有意设置了一个彩色背景,因此当每个视图都设置为 wrap_content.
时,您可以注意到 ViewPager2 如何不调整其内容 (wrap_content)我的期望:
苦苦思索了好几天,终于可以编程实现了:
mViewPager.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mViewPager.getViewTreeObserver().removeOnGlobalLayoutListener(this);
int viewPagerWidth = (mViewPager.findViewById(R.id.cardViewContainer)).getWidth();
int screenWidth = TMScreen.getScreenWidth(MainActivity.this);
int viewPagerMargin = TMScreen.dp2px(10);
int viewPagerPadding = (screenWidth - viewPagerWidth - viewPagerMargin) / 2;
mViewPager.setPadding(viewPagerPadding, 0, viewPagerPadding, 0);
}
});