Как я могу получить клики пользователей от ViewPager2, который использует Fragment? - PullRequest
1 голос
/ 03 апреля 2020

Я с нетерпением жду, когда пользователь нажмет кнопку, находящуюся внутри фрагмента. Я использую ViewPager2 для пролистывания между различными фрагментами.

В одном из фрагментов у меня есть кнопка, где я хочу установить onClickListener, однако когда я пытаюсь установить onClickListener кнопки на onOcreateView, я получаю это ошибка:

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 Ответ

0 голосов
/ 04 апреля 2020

Используйте findViewById вместо findViewWithTag Я думаю, что это должно решить вашу проблему.

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