Я получаю странное исключение 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);
}
}
}