2017-03-22 5 views
0

Ich habe eine Ansicht Pager, mit 4 Fragmente. (Ich benutze FragmentStatePagerAdapter)Ansicht Pager hält altes Fragment nach dem Drehen Bildschirm

Jedes Fragment hat einen "FrameLayout/Container", wo ich viele Fragmente hinzufügen und ersetzen kann.

Alles funktioniert gut, aber wenn ich Bildschirmausrichtung ändern, wird das erste Fragment der Zeile über tatsächliche Fragment wiederhergestellt. Dann erscheinen beide gleichzeitig.

Im Bild mit einem Beispiel setzen, was passiert:

First Fragment

Second Fragment

[wenn ich drehen Bildschirm]

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

Mein MainActivity-Code

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)) 
    } 


} 

}

Jede Hilfe ist willkommen!

EDIT: Eigentlich ist, was ViewPager das tatsächliche Fragment als "Ghost" halten und dann das erste Fragment der Linie wiederherstellen.

Gibt es eine Möglichkeit, den Bildschirm zu reinigen und diesen "Ghost" zu entfernen?

EDIT 2: Die Lösung gefunden. Ich musste überprüfen, ob eine Instanz des Fragments bereits vorhanden ist, bevor Sie das Fragment auf jedem "Container" hinzufügen Das Problem war nicht auf ViewPager oder Adapter. Jedes Mal, wenn ich die Ausrichtung ändere, wurde ein neues Fragment eingefügt.

Also, legen Sie einfach die Überprüfung unten:

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

Antwort

0

Wenn die Aktivität drehbaren Bildschirm und die Fragmente werden so seinen Start von Position 0 ..

  1. Speicher Fragment Position neu erstellt, wenn viewpager ist wieder aufbauen Wähle einfach das Fragment, das du brauchst.
  2. Überprüfen Sie diesen Link https://developer.android.com/guide/topics/resources/runtime-changes.html
  3. Deaktivieren Sie Bildschirmrotationen.
+0

Das Fragment wird von Position 0 neu erstellt, aber leider wird das tatsächliche Fragment als "Geist" gehalten ... Gibt es eine Möglichkeit, ein "sauberes" Repaint des Bildschirms zu erzwingen? – cesarsicas

Verwandte Themen