Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查看寻呼机在旋转屏幕后保留旧片段_Java_Android_Android Fragments_Android Viewpager - Fatal编程技术网

Java 查看寻呼机在旋转屏幕后保留旧片段

Java 查看寻呼机在旋转屏幕后保留旧片段,java,android,android-fragments,android-viewpager,Java,Android,Android Fragments,Android Viewpager,我有一个查看寻呼机,有4个片段。(im使用FragmentStatePagerAdapter) 每个片段都有一个“FrameLayout/container”,我在其中添加和替换了许多片段 一切正常,但当我更改屏幕方向时,行的第一个片段将恢复为实际片段。然后两者同时出现。 我正在放一张图片,上面有一个例子: [当我旋转屏幕时] http://i.stack.imgur.com/kxaVn.png 我的主要活动代码 class MainActivity : AppCompatActivit

我有一个查看寻呼机,有4个片段。(im使用FragmentStatePagerAdapter)

每个片段都有一个“FrameLayout/container”,我在其中添加和替换了许多片段

一切正常,但当我更改屏幕方向时,行的第一个片段将恢复为实际片段。然后两者同时出现。

我正在放一张图片,上面有一个例子:

[当我旋转屏幕时]

http://i.stack.imgur.com/kxaVn.png 
我的主要活动代码

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


}

旋转屏幕时,将重新创建活动和片段,使其从位置0开始

  • 在重建viewpager时保存片段位置只需选择所需片段
  • 查看此链接
  • 禁用屏幕旋转

  • 旋转屏幕时,将重新创建活动和片段,使其从位置0开始

  • 在重建viewpager时保存片段位置只需选择所需片段
  • 查看此链接
  • 禁用屏幕旋转

  • 片段是从位置0重新创建的,但不幸的是,实际片段被保留为“幽灵”。。。有没有办法强制对屏幕进行“干净”的重新绘制?片段是从位置0重新创建的,但不幸的是,实际片段被保留为“幽灵”。。。有没有办法强制对屏幕进行“干净”的重新喷漆?
         if(savedInstanceState == null) {
            activity
                    .supportFragmentManager
                    .beginTransaction()
                    .add(R.id.containerGuide, YourFragment())
                    .commit()
        }