FragmentPagerAdapter中具有不同内容的选项卡

时间:2017-08-26 14:02:29

标签: android-fragments

我正在尝试创建一个注册页面,但如果用户已经注册,那么我希望他们可以滑动以查看“登录”表单。

具体来说,我正在尝试按照这个Q& A:How do I use FragmentPagerAdapter to have tabs with different content?我已经正确地复制了所有内容,据我所见,但我遇到了适配器实例化的部分出现问题片段。

在SignInActivity中我有:

public class SignInActivity extends BaseActivity {

    private TabLayout mTabLayout;
    SignInPagerAdapter mSignInPagerAdapter;
    public List<String> fragments = new Vector<String>();
    ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sign_in);

        // Set up tabs and fragments
        mTabLayout = (TabLayout) findViewById(R.id.tabs);
        mTabLayout.addTab(mTabLayout.newTab().setText(R.string.reg));
        mTabLayout.addTab(mTabLayout.newTab().setText(R.string.sign_in));
        fragments.add(RegisterObjectFragment.class.getName());
        fragments.add(SignInObjectFragment.class.getName());

        mSignInPagerAdapter =
                new SignInPagerAdapter(
                        getSupportFragmentManager());
        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mSignInPagerAdapter);

        mTabLayout.setupWithViewPager(mViewPager);

    }

    private class SignInPagerAdapter extends FragmentPagerAdapter {

        List<String> fragmentsA;

        SignInPagerAdapter(FragmentManager fm) {
            super(fm);
            fragmentsA = fragments;
        }

        @Override
        public Fragment getItem(int i) {
            return Fragment.instantiate(getApplicationContext(), fragmentsA.get(i));
        }

        @Override
        public int getCount() {
            return 2;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            switch(position) {
                case 0:
                    return getString(R.string.register);
                case 1:
                    return getString(R.string.sign_in);
            }
            return null;
        }
    }

布局activity_sign_in.xml包含:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:background="@color/colorBg"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"/>

    </android.support.v4.view.ViewPager>

</android.support.constraint.ConstraintLayout>

然后RegisterObjectFragmentSignInObjectFragment都扩展了Fragment,每个都有相应的布局。

问题似乎与SignInActivity中的此功能有关:

    public Fragment getItem(int i) {
        return Fragment.instantiate(getApplicationContext(), fragmentsA.get(i));
    }

此时它出现了错误:

RegisterObjectFragment cannot be cast to android.support.v4.app.Fragment

似乎期待一个普通的片段,但取而代之的是RegisterObjectFragment。我能找到的每个例子都有这样的东西,但是 - 函数应该返回一个Fragment,而是返回一个用户生成的扩展Fragment。我尝试过使用我遇到的一些变体,但每次都遇到同样的问题 - 它拒绝接受片段以外的其他任何内容。

谁能看到我出错的地方?

1 个答案:

答案 0 :(得分:0)

没关系 - 问题是Fragment类(RegisterObjectFragment和SignInObjectFragment)扩展了android.app.Fragment,而主类使用的是android.support.v4.app.Fragment。

当我将它们全部更改为support.v4时,它开始起作用了!

离开这里,以防其他人陷入同样的​​困境。