标签: android-viewpager2

ViewPager2 异常:java.lang.IllegalStateException:违反了设计假设

我自己无法重现此问题,但我在运行小米 MI 9 的生产中注意到此问题Android 10。以下是我使用的ViewPager2RecyclerView版本:

androidx.recyclerview:recyclerview:1.1.0 
androidx.viewpager2:viewpager2:1.0.0
Run Code Online (Sandbox Code Playgroud)

这是堆栈跟踪:

Fatal Exception: java.lang.IllegalStateException: Design assumption violated.
       at androidx.viewpager2.adapter.FragmentStateAdapter.placeFragmentInViewHolder(FragmentStateAdapter.java:287)
       at androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(FragmentStateAdapter.java:276)
       at androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(FragmentStateAdapter.java:67)
       at androidx.recyclerview.widget.RecyclerView.dispatchChildAttached(RecyclerView.java:7556)
       at androidx.recyclerview.widget.RecyclerView$5.addView(RecyclerView.java:860)
       at androidx.recyclerview.widget.ChildHelper.addView(ChildHelper.java:107)
       at androidx.recyclerview.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:8601)
       at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8559)
       at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1643)
       at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
       at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:675)
       at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
       at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851)
       at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4404)
       at android.view.View.layout(View.java:21963)
       at android.view.ViewGroup.layout(ViewGroup.java:6317)
       at androidx.viewpager2.widget.ViewPager2.onLayout(ViewPager2.java:527)
       at android.view.View.layout(View.java:21963)
       at android.view.ViewGroup.layout(ViewGroup.java:6317)
       at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1915)
       at android.view.View.layout(View.java:21963)
       at android.view.ViewGroup.layout(ViewGroup.java:6317)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
       at android.view.View.layout(View.java:21963)
       at android.view.ViewGroup.layout(ViewGroup.java:6317)
       at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
       at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
       at android.view.View.layout(View.java:21963)
       at android.view.ViewGroup.layout(ViewGroup.java:6317) …
Run Code Online (Sandbox Code Playgroud)

android android-viewpager android-recyclerview androidx android-viewpager2

3
推荐指数
1
解决办法
4032
查看次数

ViewPager2 的 OnTouchListener

我最近将应用程序中的 ViewPager 更改为 ViewPager2。我已经为 viewPager 对象设置了一个 onTouchListener 来检测手势(onFling 和 onLongPress),如下所示:

mViewPager.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        mDetector.onTouchEvent(motionEvent); // use the custom gesture detector to detect onFling and onLongPress touch events.
        return true; 
    }
});
Run Code Online (Sandbox Code Playgroud)

在重构到 ViewPager2 之前,viewPager 的 onTouchListener 工作正常。我试过这个答案,但没有用。任何人都知道为什么会出现这种情况以及我该如何解决?

android ontouchlistener android-viewpager android-viewpager2

3
推荐指数
1
解决办法
1233
查看次数

如何在另一个 ViewPager2 中使用 ViewPager2

我在另一个 ViewPager2 中使用了一个 ViewPager2。因此,幻灯片仅适用于根 ViewPager。如何让 ViewPager 工作?

android android-viewpager android-recyclerview android-viewpager2

3
推荐指数
1
解决办法
1372
查看次数

嵌套的viewpager2

我正在尝试实现这样的布局:

在此处输入图片说明

我附上了示例项目:https : //drive.google.com/file/d/1jEKOONMWN3MblLN1EmePsWTWNCNQVfN-/view?usp=sharing

我遇到的问题是第二个视图寻呼机对触摸事件没有反应。

理想情况下,如果用户在选择“两个”选项卡时向右滑动,则第二个视图寻呼机将在用户滑动时更改页面 - 从图片中,如果选择“第四”,则向右滑动将选择“第五”,向左滑动将选择“第三”。从“第三个”向左滑动将导致第一个查看页面选择“一个”。

有没有办法用视图寻呼机 2 做到这一点?

谢谢您的回答。

android android-viewpager2

3
推荐指数
1
解决办法
719
查看次数

在 Android 的 ViewPager2 中检测滑动出界

我正在使用ViewPager2并希望检测用户何时在第一页上向左滑动或在最后一页上向右滑动。

我知道这可以使用此处ViewPager讨论的旧方法来实现,但这种方法不可行,因为它是最终的并且不能子类化。ViewPager2

ViewPager2提供了OnPageChangeCallback但这也不能使用,因为滑动越界时没有页面事件。

我错过了什么吗?

android androidx android-viewpager2

3
推荐指数
1
解决办法
1530
查看次数

扩展 FragmentStateAdapter 时每个构造函数有什么区别?

我正在学习片段,在我正在制作的应用程序中,我有一个底部导航栏,第一个导航栏有一个带有 ViewPager2 的片段。对于 viewpager2,我创建了一个扩展 FragmentStateAdapter 的自定义适配器,首先我使用了接收 FragmentActivity 的构造函数,然后使用了接收 FragmentManager 和 Lifecycle 的构造函数。我使用它们的方式是这样的:

CustomAdapter adapter = new CustomAdapter(getActivity());
CustomAdapter adapter = new CustomAdapter(getChildFragmentManager(), getLifeCycle());
Run Code Online (Sandbox Code Playgroud)

两者似乎都工作正常,但我想知道使用其中之一有什么区别,以及为什么在第二个适配器上使用 getChildFragmentManager() 而不是 getFragmentManager() 。

旁注:需要明确的是,我一次只使用了一个构造函数。

android view android-fragments android-viewpager android-viewpager2

3
推荐指数
1
解决办法
1249
查看次数

AppBar 不随嵌套 ViewPager2 滚动

我有一个视图层次结构,如下图所示。

查看层次结构

我遇到奇怪的滚动行为,例如,

  1. 如果我从区域 1 滚动(缓慢拖动或猛击),则会AppBar随之崩溃。这可以。
  2. 但如果我从区域 2 慢慢拖拽,它就AppBar不会倒塌。它停留在那里并RecyclerView进入其下方。然而,它在快速运行时效果很好。

activity_challenge_detail.xml

<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
        android:id="@+id/swipeRefresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".challengedetail.ChallengeDetailActivity">

        <androidx.coordinatorlayout.widget.CoordinatorLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <com.google.android.material.appbar.AppBarLayout
                android:id="@+id/app_bar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@color/black">

                <com.google.android.material.appbar.CollapsingToolbarLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    app:contentScrim="@color/black"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="parent"
                    app:layout_scrollFlags="scroll|exitUntilCollapsed">

                    <androidx.constraintlayout.widget.ConstraintLayout
                        android:id="@+id/header"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        app:layout_collapseMode="parallax"
                        app:layout_collapseParallaxMultiplier="0.2">

                        <FrameLayout
                            android:id="@+id/challengeBannerFrame"
                            android:layout_width="match_parent"
                            android:layout_height="0dp"
                            android:foreground="@drawable/banner_gradient"
                            app:layout_constraintDimensionRatio="H,1:1"
                            app:layout_constraintEnd_toEndOf="parent"
                            app:layout_constraintStart_toStartOf="parent"
                            app:layout_constraintTop_toTopOf="parent">

                            <ImageView
                                android:id="@+id/challengeBanner"
                                android:layout_width="match_parent"
                                android:layout_height="match_parent"
                                android:contentDescription="@string/challenge_banner"
                                android:scaleType="centerCrop"
                                tools:src="@tools:sample/avatars" />
                        </FrameLayout>
                    </androidx.constraintlayout.widget.ConstraintLayout>

                    <androidx.appcompat.widget.Toolbar
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:minHeight="@dimen/dp16"
                        app:layout_collapseMode="pin">

                        <com.company.widget.StatusBarSpacer
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content" />
                    </androidx.appcompat.widget.Toolbar>
                </com.google.android.material.appbar.CollapsingToolbarLayout>

                <androidx.appcompat.widget.Toolbar
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@android:color/transparent"
                    app:contentInsetEnd="0dp"
                    app:contentInsetStart="0dp"
                    app:layout_collapseMode="pin">

                    <androidx.constraintlayout.widget.ConstraintLayout
                        android:layout_width="match_parent" …
Run Code Online (Sandbox Code Playgroud)

android android-layout android-coordinatorlayout android-viewpager2

3
推荐指数
1
解决办法
1439
查看次数

ViewPager2 setCurrentItem 错误解决方法?

这个报告的错误给我带来了问题; https://issuetracker.google.com/issues/183847283

当与 FragmentStateAdapter 结合使用时,ViewPager2.setCurrentItem 并不总是有效。TabLayout 正确更改(如果有),但 ViewPager2 本身未显示正确的页面。

有没有人找到解决方法?

android android-viewpager2

3
推荐指数
1
解决办法
2332
查看次数

Android-导入ViewPager2库时程序类型已经存在com.transition.R

Gradle引发程序类型已经存在:androidx.transition.R"导入后androidx.viewpager2:viewpager2:1.0.0-beta02

implementation 'androidx.viewpager2:viewpager2:1.0.0-beta02'
implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.vectordrawable:vectordrawable:1.0.1'
implementation 'androidx.annotation:annotation:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'

AGPBI: {"kind":"error","text":"Program type already present: androidx.transition.R","sources":[{}],"tool":"D8"}
Run Code Online (Sandbox Code Playgroud)

预期结果: Gradle应正确编译

androidx android-viewpager2

2
推荐指数
1
解决办法
554
查看次数

FragmentManager 已经在执行事务 viewpager2

我在视图寻呼机 2 中使用 4 个片段。突然出现此错误。崩溃并不总是出现。我搜索了其他问题,但找不到有关 viewpager2 的任何解决方案。

来自手机的崩溃报告无法获得全貌

setUpViewPager()从调用这个在onStart()MainActivity

public void setupViewPager() {
        MainActivityViewPager adapter = new MainActivityViewPager(getSupportFragmentManager(), getLifecycle());

        binding.viewpager.setUserInputEnabled(false);

        binding.viewpager.setOffscreenPageLimit(3);

        binding.viewpager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
            @Override
            public void onPageSelected(int position) {
                if (prevMenuItem != null) {
                    prevMenuItem.setChecked(false);
                } else {
                    binding.bottomNavigation.getMenu().getItem(0).setChecked(false);
                }
                binding.bottomNavigation.getMenu().getItem(position).setChecked(true);
                prevMenuItem = binding.bottomNavigation.getMenu().getItem(position);
            }
        });

        binding.viewpager.setAdapter(adapter);
    }

Run Code Online (Sandbox Code Playgroud)

主ActivityViewPager


public class MainActivityViewPager extends FragmentStateAdapter {


    public MainActivityViewPager(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) {
        super(fragmentManager, lifecycle);
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        switch …
Run Code Online (Sandbox Code Playgroud)

android fragmentmanager android-viewpager2

2
推荐指数
1
解决办法
1577
查看次数