标签: android-viewpager2

以编程方式更改页面时如何减慢 ViewPager2 中的过渡动画

我在 ViewPager2 中有一个自定义翻转转换,我禁用了用户输入,因此它只能以编程方式更改页面,但是,转换的速度太快了。

我需要的行为是 2 个片段,第一个片段加载,几毫秒后我以编程方式触发转换,我看到动画和第二个片段,就是这样。

这是寻呼机相关代码:

viewPager.apply {
    adapter = ViewPagerAdapter(this@HostFragment)
    setPageTransformer(VerticalFlipTransformation())
    isUserInputEnabled = false
}
Run Code Online (Sandbox Code Playgroud)

在某个时刻,我会像这样触发转换:

viewPager.currentItem = 1
Run Code Online (Sandbox Code Playgroud)

这是我的适配器:

private class ViewPagerAdapter(fragment: Fragment) :
    FragmentStateAdapter(fragment) {

    override fun getItemCount() = 2

    override fun createFragment(position: Int) = if (position == 0) {
        Fragment1()
    } else {
        Fragment2()
    }
}
Run Code Online (Sandbox Code Playgroud)

最后这是我正在使用的转换:

class VerticalFlipTransformation : ViewPager2.PageTransformer {

    override fun transformPage(page: View, position: Float) {
        page.translationX = -position * page.width
        page.cameraDistance = 20000f

        if (position < 0.5 && position > -0.5) …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-viewpager2

5
推荐指数
0
解决办法
2984
查看次数

尝试更改焦点并使用滑动手势滚动时出现 ViewPager2 + 辅助功能 + 对讲问题

我一直在尝试通过对讲来实现具有可访问性的 ViewPager2,但焦点没有移出第二个部分可见项目。我想通过对讲和可访问性来遍历和滚动 viewpager2,但无法实现这一点。

--------------
| <item> | <item> | <item> | <item> | <item> |
--------------
Run Code Online (Sandbox Code Playgroud)

请帮助我。我已经搜索了很多尝试了各种东西,但没有任何对我有用。

 ViewPager2.accessibilityDelegate = object : AccessibilityDelegate() {
        override fun onRequestSendAccessibilityEvent(
            host: ViewGroup?,
            child: View?,
            event: AccessibilityEvent?
        ): Boolean {
            if (event?.eventType == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED) {
                ViewPager2.currentItem = ViewPager2.indexOfChild(child)
            }
            return super.onRequestSendAccessibilityEvent(host, child, event)
        }
    }
Run Code Online (Sandbox Code Playgroud)

android accessibility android-view talkback android-viewpager2

5
推荐指数
1
解决办法
2087
查看次数

如何为viewpager2片段设置自定义标签?

如何为viewpager2片段设置自定义标签?

如何为 viewpager 片段设置标签?

上述问题提供了答案ViewPager。但这怎么办呢ViewPager2

android fragmentstatepageradapter android-viewpager2 fragmentstateadapter

5
推荐指数
0
解决办法
195
查看次数

ViewPager2默认位置

我正在使用ViewPager2创建幻灯片。例如,幻灯片显示有3个项目,我想在活动打开时显示第二个项目。我使用setCurrentItem(int item, boolean smoothScroll)方法,但是它不起作用,什么也没发生。我该如何实现?

viewPager.adapter = adapter
viewPager.setCurrentItem(1, true)
Run Code Online (Sandbox Code Playgroud)

android android-viewpager2

4
推荐指数
8
解决办法
360
查看次数

页面必须填满整个ViewPager2(使用match_parent)

我有一个项目布局,在其中显示图像,产品名称和产品图像。我必须使用约束布局以1:1.5的比例显示图像。但是,当我加载小图像时,下面的文本不显示。

以下是我的XML项目代码:-

<?xml version="1.0" encoding="utf-8"?>
<layout 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">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/coordinatorLayoutCartRoot"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.jackandphantom.circularimageview.RoundedImage
            android:id="@+id/imageViewSlider"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:scaleType="centerCrop"
            app:layout_constraintBottom_toTopOf="@id/tvTitle"
            app:layout_constraintDimensionRatio="WH,1:1.4"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:rounded_radius="0"
            tools:src="@tools:sample/avatars" />

        <TextView
            android:id="@+id/tvTitle"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="4dp"
            android:text="Fitted crew neck sweater"
            android:textColor="@color/colorBlack"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/imageViewSlider" />

        <TextView
            android:id="@+id/tvPrice"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:padding="4dp"
            android:text="$34.00"
            android:textColor="@color/colorBlack"
            android:textStyle="bold"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/tvTitle" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
Run Code Online (Sandbox Code Playgroud)
  1. 输出长图:-https : //i.imgur.com/QVnljX6.png
  2. 输出小图像:-https : //i.imgur.com/0ZwkVwE.png

而且,如果我用wrap_content替换match_parent,则应用程序崩溃并显示以下错误:-

java.lang.IllegalStateException:页面必须填充整个ViewPager2(使用match_parent)

android android-viewpager2

4
推荐指数
7
解决办法
620
查看次数

为什么 FragmentStateAdapter 在 ViewPager2 中不起作用?

安卓工作室 3.6

我希望在我的活动中在 ViewPager2 中使用 2 个片段。

这是我的活动:

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager2.widget.ViewPager2;
public class QRBluetoothSwipeActivity extends AppCompatActivity {
    private ViewPager2 myViewPager2;
    private ViewPagerFragmentAdapter myAdapter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        // Make sure this is before calling super.onCreate
        setTheme(R.style.AppTheme); // show splash screen
        super.onCreate(savedInstanceState);
        setContentView(R.layout.qr_bluetooth_swipe_activity);
        init();
    }

    private void init() {
        myAdapter = new ViewPagerFragmentAdapter(getSupportFragmentManager());
        myAdapter.addFragment(new BluetoothPageFragment());
        myAdapter.addFragment(new QrPageFragment());
        myViewPager2.setOrientation(ViewPager2.ORIENTATION_VERTICAL);
        myViewPager2.setAdapter(myAdapter);
    }

}
Run Code Online (Sandbox Code Playgroud)

这里 ViewPagerFragmentAdapter

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.viewpager2.adapter.FragmentStateAdapter;

import java.util.ArrayList;

public class …
Run Code Online (Sandbox Code Playgroud)

android android-viewpager2

4
推荐指数
1
解决办法
1万
查看次数

在viewpager2中无限滚动

我们如何在 ViewPager2 中实现无限滚动

因为OnPageChangeListener()在这个寻呼机中没有。但是setPageTransformer()每当我们更改页面时,都会有Listener 获取回调。

因此,viewpager2 问题的任何解决方案

注意:我正在为 viewpager2 使用 recyclerview 适配器

java android android-viewpager2

4
推荐指数
2
解决办法
4661
查看次数

如何解决垂直 RecyclerView 内水平 ViewPager2 和 RecyclerView 的滚动问题?

我有一个 RecyclerView(例如,rootRecyclerView),它可以根据某些 API 响应具有不同类型的行。我实现了其中一个是水平的ViewPager2,另一个是水平实现的 RecyclerView(例如,childRecyclerView)。

rootRecyclerView 垂直滑动,而 viewPager2 和 childRecyclerView 水平滑动。

问题:

当我在屏幕上滑动时,如果滑动是在 或 上viewPager2childRecyclerView则滑动必须水平完全笔直。否则,它们不会水平滚动;滑动是由 进行的rootRecyclerView,因此您会看到垂直移动。

因此,发生这种情况是因为您的拇指会沿弯曲/圆形方向移动,从而在 X 轴和 Y 轴上产生移动,因此 rootRecyclerView 会拦截滑动,从而产生这种不愉快的用户体验。

我确实尝试解决这个问题,例如OnItemTouchListener向 childRecyclerView 添加一个,如下所示:

    private float Y_BUFFER = ViewConfiguration.get(getContext())
                                     .getScaledPagingTouchSlop(); // 10;
    private float preX = 0f;
    private float preY = 0f;
childRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
            @Override
            public boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
                if(e.getAction()==MotionEvent.ACTION_DOWN){
                    childRecyclerView.getParent().requestDisallowInterceptTouchEvent(true);
                }
                if(e.getAction() == MotionEvent.ACTION_MOVE){
                    if (Math.abs(e.getX() …
Run Code Online (Sandbox Code Playgroud)

java android kotlin android-recyclerview android-viewpager2

4
推荐指数
1
解决办法
3477
查看次数

Google Map + ViewPager2 刷卡冲突

任何处理 ViewPager2 + Fragments + GoogleMap 的人?

我遇到了一个非常有趣的问题,在我的 viewpager 中,我有两个选项卡,每个选项卡都呈现片段。

其中一个片段生成了一张谷歌地图。

当我尝试通过该地图进行操作时,我得到了 viewpager2 试图向左和向右滑动的效果,这真的很烦人,所以我解决它的方法并不是很好。

我通过构造函数将 viewpager 暴露给其中一个片段,并触发了对顶部 viewpager 活动的回调。

在那里,我执行了一个简单isUserInputEnabled的逻辑,而地图处于活动状态时禁用滑动。

一旦片段附加此回调寄存器并调用逻辑。

一旦片段分离,此回调将调用重新启用的逻辑。

这是一个解决方案,但我觉得它不好。有什么更好的想法吗?

与视图重叠对我来说似乎是一个错误。

/* top activity that hosts viewpager2 and it's tabs(fragments) */
class ViewTap extends AppCompatActivity
all the good stuff about viewpager2: ViewPager2
fun registerUi(){
...TapPagerAdapter(...this)
}
override fun fireSensitivityResolver(fragment: Fragment, flag: Boolean){
 if(fragment is ViewMapLoader){
  this.mViewPager2.isUserInputEnabled = !flag
 }
}

/* callback defintion fo handling events about Tab Capale thingies */
interface TabCapableIf {
 fun …
Run Code Online (Sandbox Code Playgroud)

android google-maps android-fragments kotlin android-viewpager2

4
推荐指数
1
解决办法
700
查看次数

共享元素转换为包含 ViewPager 的片段

我正在尝试执行从片段 A 中的 RecyclerView 项目到片段 B 的共享元素转换。转换名称设置在两个布局中最外层的 CardView 上。我的实现与示例中的实现基本相同。

一切正常,直到我在片段 B 中添加了一个 ViewPager2。

我尝试按照答案中的步骤进行操作,但没有运气。

堆栈跟踪:

java.lang.IndexOutOfBoundsException: Index: 5, Size: 5
        at java.util.ArrayList.get(ArrayList.java:437)
        at androidx.fragment.app.FragmentTransitionImpl.setNameOverridesReordered(FragmentTransitionImpl.java:182)
        at androidx.fragment.app.DefaultSpecialEffectsController.startTransitions(DefaultSpecialEffectsController.java:665)
        at androidx.fragment.app.DefaultSpecialEffectsController.executeOperations(DefaultSpecialEffectsController.java:114)
        at androidx.fragment.app.SpecialEffectsController.executePendingOperations(SpecialEffectsController.java:294)
        at androidx.fragment.app.Fragment$3.run(Fragment.java:2776)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Run Code Online (Sandbox Code Playgroud)

编辑:显示我的依赖项以回应建议片段版本需要更新的答案:

ext.kotlin_version = "1.5.10"
ext.navigation_version="2.4.0-alpha02"

implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.5.0'
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'

implementation 'androidx.preference:preference-ktx:1.1.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.3.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'

coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3'
implementation …
Run Code Online (Sandbox Code Playgroud)

android android-fragments shared-element-transition android-architecture-navigation android-viewpager2

4
推荐指数
1
解决办法
296
查看次数