私は4ページのフラグメントを持つビューページャーを持っています。 (私はFragmentStatePagerAdapterを使用しています)ビューページャーは、画面を回転させた後に古いフラグメントを保持します。
各フラグメントには、「FrameLayout/container」があります。ここでは、多くのフラグメントを追加して置き換えます。
すべてが正常に動作しますが、画面の向きを変更すると、行の最初のフラグメントが復元されます。両方同時に表示されます。
イムは、何が起こるかの例で絵を置く:
を[私は、画面を回転させたとき]
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から再作成されますが、残念ながら実際のフラグメントは「ゴースト」として保持されています...スクリーンの「きれいな」再描画を強制する方法はありますか? – cesarsicas