开发者社区 问答 正文

ViewPager卡住了

我在我的应用程序中使用视图分页器,内部有多个片段,我也使用这些代码禁用了viewpager滑动,但是在我的布局“ fragment_hr_link.xml”中,我可以滑动它,但是卡在了两个片段之间

viewPager.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return true;
        }
    });

它在我的某些片段中工作正常,但是,我在此布局上遇到问题,滑动有效,但卡住了

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.hr.HrLinkFragment">

<ScrollView
    android:fillViewport="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:padding="15dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <GridLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:rowCount="3"
            android:columnCount="2"
            android:alignmentMode="alignMargins"
            android:columnOrderPreserved="false">

            <androidx.cardview.widget.CardView
                android:clickable="true"
                android:focusable="true"
                android:foreground="?android:attr/selectableItemBackground"
                android:id="@+id/card_view_hr_daily_schedule"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_columnWeight="1"
                android:layout_rowWeight="1"
                app:cardElevation="6dp"
                app:cardCornerRadius="8dp"
                android:layout_margin="12dp" >

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:padding="16dp"
                    android:orientation="vertical">

                    <ImageView
                        android:layout_width="80dp"
                        android:layout_height="80dp"
                        android:src="@drawable/ic_launcher_foreground"
                        android:layout_gravity="center" />

                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="Daily Schedule"
                        android:textSize="16sp"
                        android:textColor="#3253F8"
                        android:layout_marginTop="12dp"
                        android:textAlignment="center" />
                </LinearLayout>
            </androidx.cardview.widget.CardView>

            <androidx.cardview.widget.CardView
                android:clickable="true"
                android:focusable="true"
                android:foreground="?android:attr/selectableItemBackground"
                android:id="@+id/card_view_hr_daily_time_record"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_columnWeight="1"
                android:layout_rowWeight="1"
                app:cardElevation="6dp"
                app:cardCornerRadius="8dp"
                android:layout_margin="12dp" >

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:padding="16dp"
                    android:orientation="vertical">

                    <ImageView
                        android:layout_width="80dp"
                        android:layout_height="80dp"
                        android:src="@drawable/ic_launcher_foreground"
                        android:layout_gravity="center" />

                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="Daily Time Record"
                        android:textSize="16sp"
                        android:textColor="#3253F8"
                        android:layout_marginTop="12dp"
                        android:textAlignment="center" />
                </LinearLayout>
            </androidx.cardview.widget.CardView>

            <androidx.cardview.widget.CardView
                android:clickable="true"
                android:focusable="true"
                android:foreground="?android:attr/selectableItemBackground"
                android:id="@+id/card_view_hr_evaluation"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_columnWeight="1"
                android:layout_rowWeight="1"
                app:cardElevation="6dp"
                app:cardCornerRadius="8dp"
                android:layout_margin="12dp" >

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:padding="16dp"
                    android:orientation="vertical">

                    <ImageView
                        android:layout_width="80dp"
                        android:layout_height="80dp"
                        android:src="@drawable/ic_launcher_foreground"
                        android:layout_gravity="center" />

                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="Evalution"
                        android:textSize="16sp"
                        android:textColor="#3253F8"
                        android:layout_marginTop="12dp"
                        android:textAlignment="center" />
                </LinearLayout>
            </androidx.cardview.widget.CardView>

            <androidx.cardview.widget.CardView
                android:clickable="true"
                android:focusable="true"
                android:foreground="?android:attr/selectableItemBackground"
                android:id="@+id/card_view_hr_leave_balance"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_columnWeight="1"
                android:layout_rowWeight="1"
                app:cardElevation="6dp"
                app:cardCornerRadius="8dp"
                android:layout_margin="12dp" >

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:padding="16dp"
                    android:orientation="vertical">

                    <ImageView
                        android:layout_width="80dp"
                        android:layout_height="80dp"
                        android:src="@drawable/ic_launcher_foreground"
                        android:layout_gravity="center" />

                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="Leave Balance"
                        android:textSize="16sp"
                        android:textColor="#3253F8"
                        android:layout_marginTop="12dp"
                        android:textAlignment="center" />
                </LinearLayout>
            </androidx.cardview.widget.CardView>
        </GridLayout>
    </LinearLayout>
</ScrollView>

展开
收起
垚tutu 2019-12-19 16:19:05 721 分享 版权
阿里云 AI 助理回答

看起来你已经尝试通过重写OnTouchListener并始终返回true来禁用ViewPager的滑动功能,这通常能够阻止触摸事件传递给ViewPager。但是,如果在特定的布局(如“fragment_hr_link.xml”)中该方法没有按预期工作,可能是以下原因导致的:

  1. 内部可滑动视图冲突:如果你的Fragment布局"fragment_hr_link.xml"中包含其他可滑动的视图(如NestedScrollView、RecyclerView或另一个ViewPager等),这些视图可能捕获了滑动事件,导致与ViewPager的触摸事件处理发生冲突。你需要确保这些内部可滑动视图也正确地处理或消耗掉它们不需要的触摸事件。

  2. Fragment自身的处理逻辑:有可能是你的Fragment内部有代码逻辑干扰了触摸事件的正常传递。检查Fragment的onCreateView或相关触摸事件监听器,确保没有其他地方意外地消费或改变了触摸事件的行为。

  3. 视图层次问题:有时候,视图的层级结构和Z轴顺序可能导致触摸事件被错误的视图接收。确认你的布局文件中没有视图覆盖在ViewPager之上,并且无意中拦截了触摸事件。

  4. 自定义ViewPager或其子类:如果你使用的是自定义的ViewPager或者它的某个子类,确保这个类没有覆写触摸事件处理逻辑,从而影响了你的禁用滑动代码的效果。

解决方案建议

  • 针对内部可滑动视图:对于内部的可滑动视图,你可以根据需要在相应的Adapter或ViewHolder中覆写onTouchEvent或设置nestedScrollingEnabledfalse来禁用其滚动功能。
// 如果是RecyclerView
recyclerView.setNestedScrollingEnabled(false);
  • 优化Fragment中的触摸事件处理:确保Fragment中没有额外的触摸事件监听器与你的禁用滑动逻辑冲突。

  • 检查视图层次:使用Android Studio的Layout Inspector工具检查运行时的视图层次结构,确认没有其他视图遮挡或干扰ViewPager。

  • 自定义ViewPager检查:如果使用了自定义ViewPager,请仔细审查其源码,确保没有引入新的问题。

如果以上方法都不能解决问题,考虑在调试模式下详细跟踪触摸事件的分发流程,以定位具体哪里出了问题。希望这些建议能帮助到你!

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: