我自己无法重现此问题,但我在运行小米 MI 9 的生产中注意到此问题Android 10。以下是我使用的ViewPager2和RecyclerView版本:
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
我最近将应用程序中的 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
我在另一个 ViewPager2 中使用了一个 ViewPager2。因此,幻灯片仅适用于根 ViewPager。如何让 ViewPager 工作?
android android-viewpager android-recyclerview android-viewpager2
我正在尝试实现这样的布局:
我附上了示例项目:https : //drive.google.com/file/d/1jEKOONMWN3MblLN1EmePsWTWNCNQVfN-/view?usp=sharing
我遇到的问题是第二个视图寻呼机对触摸事件没有反应。
理想情况下,如果用户在选择“两个”选项卡时向右滑动,则第二个视图寻呼机将在用户滑动时更改页面 - 从图片中,如果选择“第四”,则向右滑动将选择“第五”,向左滑动将选择“第三”。从“第三个”向左滑动将导致第一个查看页面选择“一个”。
有没有办法用视图寻呼机 2 做到这一点?
谢谢您的回答。
我正在使用ViewPager2并希望检测用户何时在第一页上向左滑动或在最后一页上向右滑动。
我知道这可以使用此处ViewPager讨论的旧方法来实现,但这种方法不可行,因为它是最终的并且不能子类化。ViewPager2
ViewPager2提供了OnPageChangeCallback但这也不能使用,因为滑动越界时没有页面事件。
我错过了什么吗?
我正在学习片段,在我正在制作的应用程序中,我有一个底部导航栏,第一个导航栏有一个带有 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
我有一个视图层次结构,如下图所示。
我遇到奇怪的滚动行为,例如,
AppBar随之崩溃。这可以。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
这个报告的错误给我带来了问题; https://issuetracker.google.com/issues/183847283
当与 FragmentStateAdapter 结合使用时,ViewPager2.setCurrentItem 并不总是有效。TabLayout 正确更改(如果有),但 ViewPager2 本身未显示正确的页面。
有没有人找到解决方法?
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应正确编译
我在视图寻呼机 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)