我正在尝试创建一个注册页面,但如果用户已经注册,那么我希望他们可以滑动以查看“登录”表单。
具体来说,我正在尝试按照这个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>
然后RegisterObjectFragment
和SignInObjectFragment
都扩展了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。我尝试过使用我遇到的一些变体,但每次都遇到同样的问题 - 它拒绝接受片段以外的其他任何内容。
谁能看到我出错的地方?
答案 0 :(得分:0)
没关系 - 问题是Fragment类(RegisterObjectFragment和SignInObjectFragment)扩展了android.app.Fragment,而主类使用的是android.support.v4.app.Fragment。
当我将它们全部更改为support.v4时,它开始起作用了!
离开这里,以防其他人陷入同样的困境。