以编程方式设置 ViewPager 高度会自动滚动到最底部

Setting ViewPager height programmatically automatically scrolls to very bottom

我是 Android 开发的初学者。目前,我正在为我们的项目制作一个应用程序。在我的应用程序中,我在布局中间有一个 TabLayoutViewPager 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,这样编辑文本仍然可以聚焦,同时防止不必要的滚动。