以编程方式设置 ViewPager 高度会自动滚动到最底部
Setting ViewPager height programmatically automatically scrolls to very bottom
我是 Android 开发的初学者。目前,我正在为我们的项目制作一个应用程序。在我的应用程序中,我在布局中间有一个 TabLayout
和 ViewPager below it
的片段。在我的 XML 布局中,我将 ViewPager
的高度设置为 match_parent
以填充下方剩余的 space。
我有两个 ViewPager
的片段,第一个片段包含 GridView
,另一个包含 ListView
.
这些视图将填充来自我的 Firebase 的数据。现在我所做的是根据屏幕的高度减去TabLayout
的高度以及状态栏来设置ViewPager
的高度,所以当用户滚动到最底部时,TabLayout
将位于应用栏下方,就像它们合并在一起一样。
我的问题是,在以编程方式设置 ViewPager
的高度后,NestedScrollView
自动滚动到最底部。 我测试了我的应用程序在 Android 11 (API 30) 上运行良好,但是当我在 Android 5 (API 21) 上 运行 时,我看到了滚动问题。
我还尝试在设置高度后立即使用 nestedScrollView.fullScroll(View.FOCUS_UP)
和 nestedScrollView.scrollTo(0, 0)
以编程方式滚动 NestedScrollView,但似乎没有任何反应。
这是我的片段布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/toolbar"
android:fitsSystemWindows="true"
android:theme="@style/AppTheme2">
<androidx.core.widget.NestedScrollView
android:id="@+id/nestedScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:fillViewport="true"
android:overScrollMode="never">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/topLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/civ_profile_picture"
android:layout_width="125dp"
android:layout_height="125dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dp"
android:scaleType="centerCrop"
android:src="@drawable/placeholder_profile_picture"
app:civ_border_color="@color/white"
app:civ_border_width="1dp"
tools:ignore="MissingConstraints" />
<RelativeLayout
android:id="@+id/layout_change_profile_picture"
android:layout_width="125dp"
android:layout_height="125dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dp"
android:visibility="gone">
<de.hdodenhof.circleimageview.CircleImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="#88000000"
app:civ_border_color="@color/white"
app:civ_border_width="1dp" />
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_centerInParent="true"
android:src="@drawable/ic_baseline_photo_camera_white_24" />
</RelativeLayout>
<EditText
android:id="@+id/type_edit"
android:layout_width="170dp"
android:layout_height="35dp"
android:layout_below="@id/username_edit"
android:layout_centerHorizontal="true"
android:gravity="center"
android:hint="type"
android:inputType="textNoSuggestions"
android:lines="1"
android:textAlignment="center"
android:textColor="@color/white"
android:textSize="14sp"
android:visibility="gone"
app:boxBackgroundMode="none" />
<EditText
android:id="@+id/username_edit"
android:layout_width="170dp"
android:layout_height="40dp"
android:layout_below="@id/civ_profile_picture"
android:layout_centerHorizontal="true"
android:layout_marginTop="8dp"
android:gravity="center"
android:hint="Username"
android:inputType="textNoSuggestions"
android:lines="1"
android:textAlignment="center"
android:textColor="@color/white"
android:textSize="20sp"
android:visibility="gone"
app:boxBackgroundMode="none" />
<TextView
android:id="@+id/Username"
android:layout_width="190dp"
android:layout_height="wrap_content"
android:layout_below="@id/civ_profile_picture"
android:layout_centerHorizontal="true"
android:layout_marginTop="8dp"
android:background="@null"
android:ellipsize="end"
android:fontFamily="@font/roboto"
android:gravity="center"
android:maxWidth="240dp"
android:maxLines="1"
android:scrollHorizontally="true"
android:text="Username"
android:textAlignment="center"
android:textColor="@color/white"
android:textSize="20dp" />
<TextView
android:id="@+id/TypesArtists"
android:layout_width="190dp"
android:layout_height="wrap_content"
android:layout_below="@id/Username"
android:layout_centerHorizontal="true"
android:layout_marginTop="5dp"
android:background="@null"
android:ellipsize="end"
android:fontFamily="@font/poppins"
android:gravity="center"
android:maxWidth="240dp"
android:maxLines="1"
android:scrollHorizontally="true"
android:text="Type"
android:textAlignment="center"
android:textColor="@color/gray_text_light"
android:textSize="14dp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/TypesArtists"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dp"
android:layout_marginBottom="20dp"
android:orientation="horizontal">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/txt_rating"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="0.0"
android:textColor="@color/white"
android:textSize="18sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/txt_rating"
android:layout_centerHorizontal="true"
android:layout_marginTop="4dp"
android:fontFamily="@font/poppins"
android:text="Rating"
android:textColor="@color/accent1"
android:textSize="14sp" />
</RelativeLayout>
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:layout_marginHorizontal="20dp"
android:background="@color/divider_light" />
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/txt_post_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="0"
android:textColor="@color/white"
android:textSize="18sp" />
<TextView
android:id="@+id/txt_post"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/txt_post_count"
android:layout_centerHorizontal="true"
android:layout_marginTop="4dp"
android:fontFamily="@font/poppins"
android:text="Posts"
android:textColor="@color/accent1"
android:textSize="14sp" />
</RelativeLayout>
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:layout_marginHorizontal="16dp"
android:background="@color/divider_light" />
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/txt_reviews_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="0"
android:textColor="@color/white"
android:textSize="18sp" />
<TextView
android:id="@+id/txt_review"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/txt_reviews_count"
android:layout_centerHorizontal="true"
android:layout_marginTop="4dp"
android:fontFamily="@font/poppins"
android:text="Reviews"
android:textColor="@color/accent1"
android:textSize="14sp" />
</RelativeLayout>
</LinearLayout>
<TextView
android:id="@+id/ratingTxt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/TypesArtists"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dp"
android:fontFamily="@font/poppins"
android:text="rating 0/5"
android:textColor="@color/white"
android:textSize="14dp"
android:visibility="gone" />
<com.iarcuschin.simpleratingbar.SimpleRatingBar
android:id="@+id/rating_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/ratingTxt"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
android:layout_marginBottom="20dp"
android:visibility="gone"
app:srb_drawBorderEnabled="false"
app:srb_fillColor="@color/accent2"
app:srb_isIndicator="true"
app:srb_maxStarSize="14dp"
app:srb_numberOfStars="5"
app:srb_rating="5"
app:srb_starBackgroundColor="#172435"
app:srb_starSize="20dp"
app:srb_stepSize="0.5" />
</RelativeLayout>
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_below="@id/topLayout"
android:layout_centerInParent="true"
android:background="@color/item_dark"
android:outlineSpotShadowColor="@color/Magenta"
app:tabIndicatorColor="@color/Magenta"
app:tabIndicatorHeight="3dp"
app:tabSelectedTextColor="@color/white"
app:tabTextAppearance="@style/TabLayoutTextAppearance"
app:tabTextColor="@color/gray_text_dark"
tools:layout_editor_absoluteX="0dp" />
<androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/tab_layout"
android:background="@color/Background0" />
</RelativeLayout>
</androidx.core.widget.NestedScrollView>
</RelativeLayout>
这里是设置ViewPager高度的方法:
private void setViewPagerParams() {
tabLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
tabLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
//get height of tab layout (px)
int tabLayoutHeight = tabLayout.getHeight();
//get height of screen (px)
Display display = getActivity().getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
//get height of status bar
Rect rectangle = new Rect();
Window window = getActivity().getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rectangle);
int statusBarHeight = rectangle.top;
heightOfViewPager = size.y - (tabLayoutHeight + statusBarHeight);
ViewGroup.LayoutParams viewPagerParams = viewPager.getLayoutParams();
viewPagerParams.height = heightOfViewPager;
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(viewPagerParams);
params.addRule(RelativeLayout.BELOW, R.id.tab_layout);
viewPager.setLayoutParams(params);
}
});
}
更新:
经过数小时的研究和代码修改,我的问题出在我的 XML 文件中。
我将根元素从 RelativeLayout 更改为 LinearLayout,并添加了 android:descendantFocusability="blocksDescendants"
作为其属性。
这个answer帮助了我
另一个更新: 虽然滚动停止了,但根布局 LinearLayout
阻止其所有后代视图被聚焦,从而阻止 [=12= 上的所有输入] 包含在其中。更好的解决方案是将 android:focusableInTouchMode
属性设置为 true
,这样编辑文本仍然可以聚焦,同时防止不必要的滚动。
我是 Android 开发的初学者。目前,我正在为我们的项目制作一个应用程序。在我的应用程序中,我在布局中间有一个 TabLayout
和 ViewPager below it
的片段。在我的 XML 布局中,我将 ViewPager
的高度设置为 match_parent
以填充下方剩余的 space。
我有两个 ViewPager
的片段,第一个片段包含 GridView
,另一个包含 ListView
.
这些视图将填充来自我的 Firebase 的数据。现在我所做的是根据屏幕的高度减去TabLayout
的高度以及状态栏来设置ViewPager
的高度,所以当用户滚动到最底部时,TabLayout
将位于应用栏下方,就像它们合并在一起一样。
我的问题是,在以编程方式设置 ViewPager
的高度后,NestedScrollView
自动滚动到最底部。 我测试了我的应用程序在 Android 11 (API 30) 上运行良好,但是当我在 Android 5 (API 21) 上 运行 时,我看到了滚动问题。
我还尝试在设置高度后立即使用 nestedScrollView.fullScroll(View.FOCUS_UP)
和 nestedScrollView.scrollTo(0, 0)
以编程方式滚动 NestedScrollView,但似乎没有任何反应。
这是我的片段布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/toolbar"
android:fitsSystemWindows="true"
android:theme="@style/AppTheme2">
<androidx.core.widget.NestedScrollView
android:id="@+id/nestedScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:fillViewport="true"
android:overScrollMode="never">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/topLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/civ_profile_picture"
android:layout_width="125dp"
android:layout_height="125dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dp"
android:scaleType="centerCrop"
android:src="@drawable/placeholder_profile_picture"
app:civ_border_color="@color/white"
app:civ_border_width="1dp"
tools:ignore="MissingConstraints" />
<RelativeLayout
android:id="@+id/layout_change_profile_picture"
android:layout_width="125dp"
android:layout_height="125dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dp"
android:visibility="gone">
<de.hdodenhof.circleimageview.CircleImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="#88000000"
app:civ_border_color="@color/white"
app:civ_border_width="1dp" />
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_centerInParent="true"
android:src="@drawable/ic_baseline_photo_camera_white_24" />
</RelativeLayout>
<EditText
android:id="@+id/type_edit"
android:layout_width="170dp"
android:layout_height="35dp"
android:layout_below="@id/username_edit"
android:layout_centerHorizontal="true"
android:gravity="center"
android:hint="type"
android:inputType="textNoSuggestions"
android:lines="1"
android:textAlignment="center"
android:textColor="@color/white"
android:textSize="14sp"
android:visibility="gone"
app:boxBackgroundMode="none" />
<EditText
android:id="@+id/username_edit"
android:layout_width="170dp"
android:layout_height="40dp"
android:layout_below="@id/civ_profile_picture"
android:layout_centerHorizontal="true"
android:layout_marginTop="8dp"
android:gravity="center"
android:hint="Username"
android:inputType="textNoSuggestions"
android:lines="1"
android:textAlignment="center"
android:textColor="@color/white"
android:textSize="20sp"
android:visibility="gone"
app:boxBackgroundMode="none" />
<TextView
android:id="@+id/Username"
android:layout_width="190dp"
android:layout_height="wrap_content"
android:layout_below="@id/civ_profile_picture"
android:layout_centerHorizontal="true"
android:layout_marginTop="8dp"
android:background="@null"
android:ellipsize="end"
android:fontFamily="@font/roboto"
android:gravity="center"
android:maxWidth="240dp"
android:maxLines="1"
android:scrollHorizontally="true"
android:text="Username"
android:textAlignment="center"
android:textColor="@color/white"
android:textSize="20dp" />
<TextView
android:id="@+id/TypesArtists"
android:layout_width="190dp"
android:layout_height="wrap_content"
android:layout_below="@id/Username"
android:layout_centerHorizontal="true"
android:layout_marginTop="5dp"
android:background="@null"
android:ellipsize="end"
android:fontFamily="@font/poppins"
android:gravity="center"
android:maxWidth="240dp"
android:maxLines="1"
android:scrollHorizontally="true"
android:text="Type"
android:textAlignment="center"
android:textColor="@color/gray_text_light"
android:textSize="14dp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/TypesArtists"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dp"
android:layout_marginBottom="20dp"
android:orientation="horizontal">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/txt_rating"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="0.0"
android:textColor="@color/white"
android:textSize="18sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/txt_rating"
android:layout_centerHorizontal="true"
android:layout_marginTop="4dp"
android:fontFamily="@font/poppins"
android:text="Rating"
android:textColor="@color/accent1"
android:textSize="14sp" />
</RelativeLayout>
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:layout_marginHorizontal="20dp"
android:background="@color/divider_light" />
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/txt_post_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="0"
android:textColor="@color/white"
android:textSize="18sp" />
<TextView
android:id="@+id/txt_post"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/txt_post_count"
android:layout_centerHorizontal="true"
android:layout_marginTop="4dp"
android:fontFamily="@font/poppins"
android:text="Posts"
android:textColor="@color/accent1"
android:textSize="14sp" />
</RelativeLayout>
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:layout_marginHorizontal="16dp"
android:background="@color/divider_light" />
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/txt_reviews_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="0"
android:textColor="@color/white"
android:textSize="18sp" />
<TextView
android:id="@+id/txt_review"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/txt_reviews_count"
android:layout_centerHorizontal="true"
android:layout_marginTop="4dp"
android:fontFamily="@font/poppins"
android:text="Reviews"
android:textColor="@color/accent1"
android:textSize="14sp" />
</RelativeLayout>
</LinearLayout>
<TextView
android:id="@+id/ratingTxt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/TypesArtists"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dp"
android:fontFamily="@font/poppins"
android:text="rating 0/5"
android:textColor="@color/white"
android:textSize="14dp"
android:visibility="gone" />
<com.iarcuschin.simpleratingbar.SimpleRatingBar
android:id="@+id/rating_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/ratingTxt"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
android:layout_marginBottom="20dp"
android:visibility="gone"
app:srb_drawBorderEnabled="false"
app:srb_fillColor="@color/accent2"
app:srb_isIndicator="true"
app:srb_maxStarSize="14dp"
app:srb_numberOfStars="5"
app:srb_rating="5"
app:srb_starBackgroundColor="#172435"
app:srb_starSize="20dp"
app:srb_stepSize="0.5" />
</RelativeLayout>
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_below="@id/topLayout"
android:layout_centerInParent="true"
android:background="@color/item_dark"
android:outlineSpotShadowColor="@color/Magenta"
app:tabIndicatorColor="@color/Magenta"
app:tabIndicatorHeight="3dp"
app:tabSelectedTextColor="@color/white"
app:tabTextAppearance="@style/TabLayoutTextAppearance"
app:tabTextColor="@color/gray_text_dark"
tools:layout_editor_absoluteX="0dp" />
<androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/tab_layout"
android:background="@color/Background0" />
</RelativeLayout>
</androidx.core.widget.NestedScrollView>
</RelativeLayout>
这里是设置ViewPager高度的方法:
private void setViewPagerParams() {
tabLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
tabLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
//get height of tab layout (px)
int tabLayoutHeight = tabLayout.getHeight();
//get height of screen (px)
Display display = getActivity().getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
//get height of status bar
Rect rectangle = new Rect();
Window window = getActivity().getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rectangle);
int statusBarHeight = rectangle.top;
heightOfViewPager = size.y - (tabLayoutHeight + statusBarHeight);
ViewGroup.LayoutParams viewPagerParams = viewPager.getLayoutParams();
viewPagerParams.height = heightOfViewPager;
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(viewPagerParams);
params.addRule(RelativeLayout.BELOW, R.id.tab_layout);
viewPager.setLayoutParams(params);
}
});
}
更新:
经过数小时的研究和代码修改,我的问题出在我的 XML 文件中。
我将根元素从 RelativeLayout 更改为 LinearLayout,并添加了 android:descendantFocusability="blocksDescendants"
作为其属性。
这个answer帮助了我
另一个更新: 虽然滚动停止了,但根布局 LinearLayout
阻止其所有后代视图被聚焦,从而阻止 [=12= 上的所有输入] 包含在其中。更好的解决方案是将 android:focusableInTouchMode
属性设置为 true
,这样编辑文本仍然可以聚焦,同时防止不必要的滚动。