2017-08-26 54 views
0

我试图创建一个注册页面,但是如果用户已经注册,那么我希望他们能够滑过以查看Sign In表单。FragmentPagerAdapter中具有不同内容的选项卡

具体来说,我试图按照这种问答&答: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二者延伸片段,并且每个具有一个相应的布局。

这个问题似乎是与此功能在SignInActivity:

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

在这一点上它崩溃了,出现错误:

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

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

任何人都可以看到我要去哪里错了吗?谢谢你的帮助。

回答

0

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

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

如果有人遇到同样的事情,请留下此处。

相关问题