2017-03-22 5 views
0

私は4ページのフラグメントを持つビューページャーを持っています。 (私はFragmentStatePagerAdapterを使用しています)ビューページャーは、画面を回転させた後に古いフラグメントを保持します。

各フラグメントには、「FrameLayout/container」があります。ここでは、多くのフラグメントを追加して置き換えます。

すべてが正常に動作しますが、画面の向きを変更すると、行の最初のフラグメントが復元されます。両方同時に表示されます。

イムは、何が起こるかの例で絵を置く:

First Fragment

Second Fragment

を[私は、画面を回転させたとき]

http://i.stack.imgur.com/kxaVn.png 

マイMainActivityコード

class MainActivity : AppCompatActivity() { 


val numPages = 4 
var pager: ViewPager? = null 
private val TITLES = arrayOf("Feed", "Catalogo","Guia","Rendimento") 
var menuImages:Array<ImageView>?=null 
var menuTexts:Array<TextView>?=null 

var fragments = arrayListOf<Fragment>() 


private var fragmentCreated1: FeedContainerFragment? = null 
private var fragmentCreated2: CatalogContainerFragment? = null 
private var fragmentCreated3: GuideContainerFragment? = null 
private var fragmentCreated4: TestContainerFragment? = null 



override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    setContentView(R.layout.activity_default) 


    fragments.add(FeedContainerFragment()) 
    fragments.add(CatalogContainerFragment()) 
    fragments.add(GuideContainerFragment()) 
    fragments.add(TestContainerFragment()) 


    menuImages= arrayOf(findViewById(R.id.icon_feed) as ImageView, 
         findViewById(R.id.icon_catalogue) as ImageView, 
         findViewById(R.id.icon_guide) as ImageView, 
         findViewById(R.id.icon_form) as ImageView) 

    menuTexts= arrayOf(findViewById(R.id.text_feed) as TextView, 
        findViewById(R.id.text_catalogue) as TextView, 
        findViewById(R.id.text_guide) as TextView, 
        findViewById(R.id.text_form) as TextView) 




    menuImages?.get(0)?.setColorFilter(ContextCompat.getColor(baseContext,R.color.colorAccent)) 
    menuTexts?.get(0)?.setTextColor(ContextCompat.getColor(baseContext,R.color.colorAccent)) 


    //view pager 

    pager = findViewById(R.id.pager) as ViewPager 
    val pagerAdapter = ScreenSlidePagerAdapter(supportFragmentManager) 


    pager?.adapter = pagerAdapter 
    pager?.offscreenPageLimit = 4 


    pager?.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { 
     override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { 

     } 

     override fun onPageSelected(position: Int) { 
      pager?.adapter?.notifyDataSetChanged() 
      repaintMenuDefaultColor() 

      menuImages?.get(position)?.setColorFilter(ContextCompat.getColor(baseContext,R.color.colorAccent)) 
      menuTexts?.get(position)?.setTextColor(ContextCompat.getColor(baseContext,R.color.colorAccent)) 

     } 

     override fun onPageScrollStateChanged(state: Int) { 

     } 
    }) 


    //Navigation Menus 
    MenuUtils.generateMaterialMenu(this) 
    MenuUtils.generateBottomMenu(this, this.pager!!) 


} 

private inner class ScreenSlidePagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) { 
    override fun getCount(): Int { 
     return numPages 
    } 

    override fun getItem(position: Int): Fragment { 
     when(position) { 
      0->return FeedContainerFragment() 
      1->return CatalogContainerFragment() 
      2->return GuideContainerFragment() 
      3->return TestContainerFragment() 

      else->return FeedContainerFragment() 
     } 

    } 


    override fun getPageTitle(position: Int): CharSequence { 
     return TITLES[position] 
    } 

    override fun getItemPosition(obj: Any?): Int { 

     if (obj is Refreshable) { 
      return POSITION_NONE 
     } 
     return super.getItemPosition(obj) 
    } 



    override fun instantiateItem(container:ViewGroup, position:Int):Any { 
     val createdFragment = super.instantiateItem(container, position) as Fragment 
     when (position) { 
      0 -> fragmentCreated1 = createdFragment as FeedContainerFragment 
      1 -> fragmentCreated2 = createdFragment as CatalogContainerFragment 
      2 -> fragmentCreated3 = createdFragment as GuideContainerFragment 
      3 -> fragmentCreated4 = createdFragment as TestContainerFragment 

     } 


     return createdFragment 
    } 

} 


override fun onBackPressed() { 
    if (fragmentManager.backStackEntryCount > 0) { 
     fragmentManager.popBackStack() 
    } else { 
     super.onBackPressed() 
    } 
} 


fun repaintMenuDefaultColor(){ 
    this.menuImages?.map { 
     it.setColorFilter(ContextCompat.getColor(baseContext,R.color.menu_icon)) 
    } 

    this.menuTexts?.map { 
     it.setTextColor(ContextCompat.getColor(baseContext,R.color.menu_text)) 
    } 


} 

}

ヘルプはようこそ!

編集実際に起こっていることは、ViewPagerが実際のフラグメントを「ゴースト」として保持してから、そのラインの最初のフラグメントを復元することです。

画面をクリーニングし、その "ゴースト"を削除する方法はありますか?

EDIT 2:溶液が見つかりました。各「コンテナ」にフラグメントを追加する前に、フラグメントのインスタンスが既に存在するかどうかを確認する必要がありました 問題はViewPagerまたはAdapterにありませんでした。オリエンテーションを変更するたびに、新しい断片が含まれていました。だから、

、ちょうど下の検証を置く:アクティビティ画面を回転させ、断片は位置0からのスタートして再作成されたとき。..

 if(savedInstanceState == null) { 
     activity 
       .supportFragmentManager 
       .beginTransaction() 
       .add(R.id.containerGuide, YourFragment()) 
       .commit() 
    } 

答えて

0

  1. viewpagerが再構築された保存フラグメント位置をあなたが必要とする断片を選んでください。
  2. このリンクをチェックアウトhttps://developer.android.com/guide/topics/resources/runtime-changes.html
  3. 画面の回転を無効にします。
+0

フラグメントは位置0から再作成されますが、残念ながら実際のフラグメントは「ゴースト」として保持されています...スクリーンの「きれいな」再描画を強制する方法はありますか? – cesarsicas

関連する問題