当前位置: 首页 > 知识库问答 >
问题:

ViewPager2无法正确处理片段并单击事件

卫嘉言
2023-03-14

我只是想知道我是不是做错了什么,因为我对这一切都是陌生的<如果您还有什么需要我补充的,请告诉我
这是回购分支,如果您想查看所有代码,我将尝试在其中实现ViewPager。

所以我有4个用Fragments表示的类别,每个类别都包含一个ArrayList的项目,每个项目都有一个onItemClickListener,应该会再现一些音频。
我正在尝试使用ViewPager显示Fragments,但问题是当我从片段滚动到另一个,然后回到已经创建的片段时,它不会注册触摸事件,什么都不会发生,甚至没有错误或异常。
如果我转到新创建的片段触摸工作得很好。
此外,在切换回已经创建的片段如果我滚动一点点到另一个片段并返回或通过片段ArrayList出于某种原因,它开始识别ArrayList中的触摸再次项目。

  • 如果滚动位置为0,则ViewPager2中的片段不会响应单击
  • ViewPager2与SwipeRefreshLayout冲突
  • Android ViewPager2的片段中包含一个recyclerview未滚动
  • 我尝试使用协调布局(coordinatorlayout)来包装查看页面2,但没有任何区别
  • 我一直在阅读一些用Kotlin编写的官方viewPager2示例,但它们似乎都没有类似的情况(我也很难阅读Kotlin代码)

word\u列表。xml:

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/root_list_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/tan_background" />

activity_main.xml:

html prettyprint-override"><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="MainActivity">

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"/>

</FrameLayout>

这是Fragments中的一个,其他三个基本相同,只是arrayList中的项目发生了变化和其他一些小事情:

// ...Skipped some irrelevant code...

public class NumbersFragment extends Fragment {
    private ArrayList<Word> mWords;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View rootView = inflater.inflate(R.layout.word_list, container, false);

        mWords = new ArrayList<>();
        // ...Add all the items to the list...

        // Make the adapter for the word items
        WordAdapter adapter = new WordAdapter(getActivity(), mWords, R.color.category_numbers);
        // Find the root view of the list
        ListView listView = rootView.findViewById(R.id.root_list_view);
        // Add adapter to the root list view
        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.d("NumbersFragment", "CLICKED");
                }
            }

        });

        return rootView;
    }

    @Override
    public void onPause() {
        super.onPause();

        Log.d("NumbersFragment", "Fragment paused");
    }

}

这是类别适配器,它管理片段:

public class CategoryAdapter extends FragmentStateAdapter {
    private static final int NUM_CATEGORIES = 4;

    // Required public constructor
    public CategoryAdapter(@NonNull FragmentActivity fragmentActivity) {
        super(fragmentActivity);
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        // Depending on which page the user is in,
        // create a fragment of the corresponding category
        switch (position) {
            case 0:
                return new NumbersFragment();
            case 1:
                return new FamilyFragment();
            case 2:
                return new ColorsFragment();
            default:
                return new PhrasesFragment();
        }
    }

    @Override
    public int getItemCount() {
        return NUM_CATEGORIES;
    }
}

这是我的主要活动:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Set the content of the activity to use the activity_main.xml layout file
        setContentView(R.layout.activity_main);

        // Find the view pager that will allow the user to swipe between fragments
        ViewPager2 viewPager = findViewById(R.id.viewpager);

        // Create an adapter that knows which fragment should be shown on each page
        CategoryAdapter adapter = new CategoryAdapter(this);
        //or CategoryAdapter adapter = new CategoryAdapter(getSupportFragmentManager(), getLifecycle());

        // Set the adapter into the view pager
        viewPager.setAdapter(adapter);
    }
}

共有1个答案

罗寒
2023-03-14

将此添加到MainActivity查看页面中。setOffscreenPageLimit(3) 创建viewpager后

这是因为ViewPager的默认屏幕外限制为1,ViewPager2的默认屏幕外限制为0。

在ViewPager2中,切换选项卡时,将自动刷新上一个选项卡。

在ViewPager中,如果您有3个或更多选项卡,当您自动切换到第三个选项卡时,第一个选项卡将被销毁,当您转到第一个选项卡时,它将被重新创建。

查看页面。setOffscreenPageLimit(3) 从此行切换到选项卡时,将预加载前3个选项卡,并预加载后3个选项卡,因此不会刷新任何内容。

 类似资料:
  • 问题内容: 在捕获阶段而不是冒泡阶段是否可能会出现angularjs ng-click处理事件?我想按照从父项开始到被单击元素结束的顺序汇总每个父项元素的数据。 问题答案: 让我们在ngEventDirs.js#L50上查看源代码 如您所见,和使用所有其他事件指令。 因此,答案是 否定的,这是不可能的 。 如果确实需要,可以为此编写一个自定义指令。例如,修改一下代码: 并像这样使用它: 柱塞示例:

  • 我正在尝试学习如何在android中实现片段。因此,我在activity_main中创建了两个按钮和一个片段。xml。如果我点击第一个按钮,片段1应该充气,同样,如果我点击第二个按钮,片段2应该充气。 但是问题是它没有替换片段。当我调试代码时,在View.class中执行clecle()方法返回false。 LogCat中也没有错误。 我无法找出代码的问题。 这里是主要活动。xml 这是fragm

  • 我已经回顾了其他几个类似的问题,但我读到的那些问题并没有帮助解决我的问题。我的目标是基于int用户输入打印菜单值,并继续提供选择,直到用户点击6退出。这是我的代码(我是Java新手)。

  • 我正在开发一个包含一个活动和多个片段的android应用程序。我的应用程序包含导航抽屉。它的布局包含listview。单击它的项目,我用ft.replace(R.id.my\u placehodler,new MyFragment())动态更改片段,并将事务添加到。当我每次实例化新片段时都进行新事务。在我看来,这不是一个好办法。你能给我一些关于进行片段事务的正确方法的建议吗?

  • 我编写了一个类,其中有一个函数通过接受多个输入,但是运行结果证明它只接受第二个参数,就像接受第一个参数一样,下面是一个简化的代码: 并且输出,丢失: 到底是什么问题?我该怎么解决这个问题?

  • 我有一个带有底部导航视图的活动,其中有3个相关片段。其中之一是带有ViewPager2的片段,ViewPager2使用FragmentStateAdapter。在适配器的createfragment(int position)方法中,我返回另一个片段的两个实例,该片段有一个选项菜单,在它的onCreate()中,我调用setHasOptionsMenu(true)。问题是,在适配器初始化时,所有片