ViewPager在Fragment中返回了IllegalStateException异常

4
我可以帮您进行翻译。需要创建包含PagerView的选项卡,但运行以下代码会返回IllegalStateException错误:
源代码:
public class HomeFragment extends Fragment {

private TabLayout tabs;
private ClassesFragment classesFragment;
private ExamsFragment examsFragment;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    classesFragment = new ClassesFragment();
    examsFragment = new ExamsFragment();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.fragment_main_classes, container, false);
    Toolbar toolbar = getActivity().findViewById(R.id.toolbar);

    ViewPager viewPager = new ViewPager(getContext());
    viewPager.setLayoutParams(new Toolbar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    setupViewPager(viewPager);
    toolbar.addView(viewPager);

    tabs = new TabLayout(getContext());
    tabs.setLayoutParams(new Toolbar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
    toolbar.addView(tabs);
    tabs.setupWithViewPager(viewPager);
    return v;
}

// Add Fragments to Tabs
private void setupViewPager(ViewPager viewPager) {
    PagerAdapter adapter = new PagerAdapter(getChildFragmentManager());
    adapter.addFragment("Занятия", ExamsFragment.newInstance());
    viewPager.setAdapter(adapter);
}

private class PagerAdapter extends FragmentPagerAdapter {
    private List<Fragment> fragments = new ArrayList<>();
    private List<String> titles = new ArrayList<>();

    public PagerAdapter(FragmentManager fm) {
        super(fm);
        fragments.add(ExamsFragment.newInstance());
        titles.add("new");
    }

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

    public void addFragment(String title, Fragment fragment)
    {
        titles.add(title);
        fragments.add(fragment);
    }

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

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

非法状态异常:

过程:com.company.user.blabla,PID:22256 java.lang.IllegalStateException:ViewPager与适配器com.company.user.blabla.fragments.HomeFragment$PagerAdapter@ca3cef6需要一个视图ID 在android.support.v4.app.FragmentPagerAdapter.startUpdate(FragmentPagerAdapter.java: 81)中 在android.support.v4.view.ViewPager.populate(ViewPager.java: 1119)中 在android.support.v4.view.ViewPager.populate(ViewPager.java: 1087)中 在android.support.v4.view.ViewPager.onMeasure(ViewPager.java: 1613)中 在android.view.View.measure(View.java: 21998)中 在android.support.v7.widget.Toolbar.measureChildCollapseMargins(Toolbar.java: 1547)中 在android.support.v7.widget.Toolbar.onMeasure(Toolbar.java: 1655)中 在android.view.View.measure(View.java: 21998)中 在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java: 6580)中 在android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java: 1514)中 在android.widget.LinearLayout.measureVertical(LinearLayout.java: 806)中 在android.widget.LinearLayout.onMeasure(LinearLayout.java: 685)中 在android.support.design.widget.AppBarLayout.onMeasure(AppBarLayout.java: 223)中 在android.view.View.measure(View.java: 21998)中 在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java: 6580)中 在android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java: 713)中 在android.support.design.widget.AppBarLayout$ Behavior.onMeasureChild(AppBarLayout.java: 1040)中 在android.support.design.widget.AppBarLayout$ Behavior.onMeasureChild(AppBarLayout.java: 770)中 在android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java: 783)中 在android.view.View.measure(View.java: 21998)中 在android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java: 1080)中 在android.view.View.measure(View.java: 21998)中 在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java: 6580)中 在android.widget.FrameLayout.onMeasure(FrameLayout.java: 185)中 在android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java: 139)中 在android.view.View.measure(View.java: 21998)中 在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java: 6580)中 在android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java: 1514)中 在android.widget.LinearLayout.measureVertical(LinearLayout.java: 806)中 在android.widget.LinearLayout.onMeasure(LinearLayout.java: 685)中 在android.view.View.measure(View.java: 21998)中 在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java: 6580)中 在android.widget.FrameLayout.onMeasure(FrameLayout.java: 185)中 在android.view.View.measure(View.java: 21998)中 在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java: 6580)中 在android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java: 1514)中 在android.widget.LinearLayout.measureVertical(LinearLayout.java: 806)中 在android.widget.LinearLayout.onMeasure(LinearLayout.java: 685)中 在android.view.View.measure(View.java: 21998)中 在android.view.ViewGroup.measureChildWithMargins(ViewGroup.java: 6580)中 在android.widget.FrameLayout.onMeasure(FrameLayout.java: 185)中 在com.android.internal.policy.DecorView.onMeasure(DecorView.java: 721)中 在android.view.View.measure(View.java: 21998)中 在android.view.ViewRootImpl.performMeasure(ViewRootImpl.java: 2410)中 在android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java: 1498)中 在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java: 1751)中 在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java: 1386)中 在android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java: 6733)中 在android.view.Choreographer $ CallbackRecord.run(Choreographer.java: 911)中 在android.view.Choreographer.doCallbacks(Choreographer.java: 723)中 在android.view.Choreographer.doFrame(Choreographer.java: 658)中 在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:

我在安卓方面没有太多经验。搜索并不是很有用或者说我搜索的方式不正确。我应该怎样解决这个问题呢?


实际上,你的 viewPager 需要一个适当的视图 ID。不要在程序中创建它,而是在布局文件中添加一个带有 ID 的 viewPager,然后使用 findViewBy() 来获取它。 - Omkar
ViewPager与适配器一起使用时需要视图ID。我在Android方面没有太多经验。像任何事情一样,首先阅读错误消息。只有在它毫无意义时才去谷歌搜索。 - Eugen Pechanec
1个回答

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接