IllegalArgumentException в FragmentManagerImpl.moveToState с ViewPager - PullRequest
0 голосов
/ 21 апреля 2020

Я получаю странное исключение IllegalArgument в одном из моих приложений в игровом магазине. После того как я заглянул в документацию здесь обнаружил, что там написано, что класс Choreographer координирует время анимации, ввода и рисования. Насколько я знаю из трассировки стека ниже, это проблема внутри viewpager, но я не мог понять, что именно вызывает проблему. Я использую вкладки с ViewPager и в некоторых случаях вложенные вкладки внутри самой вкладки.

Вот журнал ошибок, который я получил от Crashlytics:

Fatal Exception: java.lang.IllegalArgumentException: No view found for id 0x7f0a0186 (com.xx.xx:id/viewpager) for fragment h{4d646be (5da049a5-e273-475d-b319-b7b90de9b1fe) id=0x7f0a0186}
       at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:93)
       at androidx.fragment.app.FragmentManagerImpl.i(FragmentManagerImpl.java:49)
       at androidx.fragment.app.BackStackRecord.isPostponed(BackStackRecord.java:42)
       at androidx.fragment.app.FragmentManagerImpl.postponePostponableTransactions(FragmentManagerImpl.java:42)
       at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:42)
       at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:2)
       at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:37)
       at androidx.fragment.app.FragmentManagerImpl.c(FragmentManagerImpl.java:88)
       at androidx.fragment.app.FragmentManagerImpl.execSingleAction(FragmentManagerImpl.java:3)
       at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:3)
       at androidx.fragment.app.FragmentStatePagerAdapter.instantiateItem(FragmentStatePagerAdapter.java:4)
       at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:2)
       at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:2)
       at androidx.viewpager.widget.ViewPager$3.run(ViewPager.java:8)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
       at android.view.Choreographer.doCallbacks(Choreographer.java:761)
       at android.view.Choreographer.doFrame(Choreographer.java:693)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
       at android.os.Handler.handleCallback(Handler.java:873)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:214)
       at android.app.ActivityThread.main(ActivityThread.java:7124)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)

Вот класс фрагментов вкладки, в которой я использую другую вкладку:

public class SymbolsMasterFragment extends Fragment {


        public SymbolsMasterFragment() {
            // Required empty public constructor
        }


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

            ViewPager viewPager = (ViewPager) view.findViewById(R.id.viewpager);
            setupViewPager(viewPager);

            TabLayout tabLayout = (TabLayout) view.findViewById(R.id.viewpagertab);
            tabLayout.setupWithViewPager(viewPager);

            return view;
        }

        private void setupViewPager(ViewPager viewPager) {

            ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());
            adapter.addFragment(SymbolsFragment.newInstance(1), "Stars");
            adapter.addFragment(SymbolsFragment.newInstance(2), "Arrow");
            viewPager.setAdapter(adapter);
        }

        class ViewPagerAdapter extends FragmentStatePagerAdapter {
            private final List<Fragment> mFragmentList = new ArrayList<>();
            private final List<String> mFragmentTitleList = new ArrayList<>();

            public ViewPagerAdapter(FragmentManager supportFragmentManager) {
                super(supportFragmentManager, FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
            }


            @Override
            public Fragment getItem(int position) {
                return mFragmentList.get(position);
            }

            @Override
            public int getCount() {
                return mFragmentList.size();
            }

            public void addFragment(Fragment fragment, String title) {
                mFragmentList.add(fragment);
                mFragmentTitleList.add(title);
            }

            @Override
            public CharSequence getPageTitle(int position) {
                return mFragmentTitleList.get(position);
            }
        }

    }
...