如何从使用 Fragment 的 ViewPager2 获得用户点击?

Posted

技术标签:

【中文标题】如何从使用 Fragment 的 ViewPager2 获得用户点击?【英文标题】:How can I get user clicks from a ViewPager2 that uses Fragment? 【发布时间】:2020-07-16 02:54:30 【问题描述】:

我期待用户点击片段内的按钮。我正在使用 ViewPager2 在不同的片段之间滑动。

在其中一个片段中,我有一个要设置 onClickListener 的按钮,但是当我尝试在 onOcreateView 上设置按钮的 onClickListener 时,出现此错误:

E/InputEventReceiver: Exception dispatching input event.
A/cifireca.words: java_vm_ext.cc:570] JNI DETECTED ERROR IN APPLICATION: JNI CallVoidMethodV called with pending exception java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
    java_vm_ext.cc:570]   at android.view.View cifireca.words.FragmentStock.onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) (FragmentStock.java:40)
    java_vm_ext.cc:570]   at void androidx.fragment.app.Fragment.performCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) (Fragment.java:2600)
    java_vm_ext.cc:570]   at void androidx.fragment.app.FragmentManagerImpl.moveToState(androidx.fragment.app.Fragment, int, int, int, boolean) (FragmentManagerImpl.java:881)
    java_vm_ext.cc:570]   at void androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(androidx.fragment.app.Fragment) (FragmentManagerImpl.java:1238)
    java_vm_ext.cc:570]   at void androidx.fragment.app.BackStackRecord.executeOps() (BackStackRecord.java:434)
    java_vm_ext.cc:570]   at void androidx.fragment.app.FragmentManagerImpl.executeOps(java.util.ArrayList, java.util.ArrayList, int, int) (FragmentManagerImpl.java:2079)
    java_vm_ext.cc:570]   at void androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(java.util.ArrayList, java.util.ArrayList, int, int) (FragmentManagerImpl.java:1869)
    java_vm_ext.cc:570]   at void androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(java.util.ArrayList, java.util.ArrayList) (FragmentManagerImpl.java:1824)
    java_vm_ext.cc:570]   at void androidx.fragment.app.FragmentManagerImpl.execSingleAction(androidx.fragment.app.FragmentManagerImpl$OpGenerator, boolean) (FragmentManagerImpl.java:1696)
    java_vm_ext.cc:570]   at void androidx.fragment.app.BackStackRecord.commitNow() (BackStackRecord.java:293)
    java_vm_ext.cc:570]   at void androidx.viewpager2.adapter.FragmentStateAdapter.placeFragmentInViewHolder(androidx.viewpager2.adapter.FragmentViewHolder) (FragmentStateAdapter.java:341)
    java_vm_ext.cc:570]   at void androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(androidx.viewpager2.adapter.FragmentViewHolder) (FragmentStateAdapter.java:276)
    java_vm_ext.cc:570]   at void androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(androidx.recyclerview.widget.RecyclerView$ViewHolder) (FragmentStateAdapter.java:67)

我可以看到确实是由setOnClickListener引起的,但是我不确定如何解决这个问题。

我实现 onClickListener 的方法如下:

public class FragmentStock extends Fragment 
   ...
   private Button buttonAccept;
   ...
   @Override
   public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 
       ViewGroup viewGroup = (ViewGroup) inflater.inflate(R.layout.fragment_stock, container, false);
       ...
       buttonAccept = viewGroup.findViewWithTag(R.id.button_stockAccept);
       buttonAccept.setOnClickListener(new View.OnClickListener() 
           @Override
           public void onClick(View view) 
               ... do whatever
           
       );
       return viewGroup;
   
...

【问题讨论】:

【参考方案1】:

使用findViewById 而不是findViewWithTag 我认为它应该可以解决您的问题。

buttonAccept = viewGroup.findViewById(R.id.button_stockAccept);

【讨论】:

成功了!我以前改变过,忘记扭转改变,我看不到那个错误。我真的很感激!谢谢!

以上是关于如何从使用 Fragment 的 ViewPager2 获得用户点击?的主要内容,如果未能解决你的问题,请参考以下文章

【求助】SlidingMenu 左右滑动菜单与viewpage冲突问题

安卓中实现界面数据懒加载

如何在 ViewPager 中从 Activity 移动到 Fragment?未找到片段 ID 的视图

Android移动应用开发之Viewpage2+fragment实现微信滑动界面的效果

Android中Scrollview嵌套viewpage问题:viewpage设置非固定高点,按照自定义的scrollview 还是不能解决.

android 中怎么关掉viewpage的滑动效果