2017-08-26 29 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時,它開始工作!

如果有人遇到同樣的事情,請留下此處。

相關問題