Android 如果卷起应用程序并再次返回,则在ViewPager中将一个片段与下一个片段混合

Android 如果卷起应用程序并再次返回,则在ViewPager中将一个片段与下一个片段混合,android,android-fragments,kotlin,android-viewpager,Android,Android Fragments,Kotlin,Android Viewpager,我遵循这个教程 但是存在一些错误-如果我们在Fragment A2屏幕上,按下“Home”按钮,然后返回应用程序-我看到了Fragment A1和Fragment A2,如何修复它 我在Kotlin上的代码示例: public class MyViewPagerAdapter extends FragmentPagerAdapter { private SparseArray<Fragment> registeredFragments = new SparseArray&l

我遵循这个教程

但是存在一些错误-如果我们在Fragment A2屏幕上,按下“Home”按钮,然后返回应用程序-我看到了Fragment A1和Fragment A2,如何修复它

我在Kotlin上的代码示例:

public class MyViewPagerAdapter extends FragmentPagerAdapter {

    private SparseArray<Fragment> registeredFragments = new SparseArray<>();

    public MyViewPagerAdapter( FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        final Fragment result;
        switch (position) {
            case 0:
                result = new CamerasFragment();
                break;
            case 1:
                result = new SettingsFragment();
                break;
            default:
                result = null;
                break;
        }
        return result;
    }

    @Override
    public int getCount() {
        return 2;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Fragment fragment = (Fragment) super.instantiateItem(container, position);
        registeredFragments.put(position, fragment);
        return fragment;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        registeredFragments.remove(position);
        super.destroyItem(container, position, object);
    }

    public Fragment getRegisteredFragment(int position) {
        return registeredFragments.get(position);
    }

}


    class MainActivity : AppCompatActivity() {

                        private lateinit var carouselFragment: CarouselFragment

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

                            if (savedInstanceState == null) {
                                initScreen()
                            } else {
                                carouselFragment = supportFragmentManager.fragments[0] as CarouselFragment
                            }
                        }

                        private fun initScreen() {
                            carouselFragment = CarouselFragment()
                            val fragmentManager = supportFragmentManager
                            fragmentManager.beginTransaction()
                                    .replace(R.id.container, carouselFragment)
                                    .commit()
                        }

                        override fun onBackPressed() {
                            if (!carouselFragment.onBackPressed()) {
                                super.onBackPressed()
                            } else {
                                // carousel handled the back pressed task
                                // do not call super
                            }
                        }

                        fun onAddContract(view: View) {
                            showToast("Will open contract adding screen", this)
                        }

                    }


    class CarouselFragment : Fragment() {

                    lateinit var navigation: BottomNavigationView
                    lateinit var mainViewPager: ViewPager
                    private var adapter: MyViewPagerAdapter? = null

                    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
                                              savedInstanceState: Bundle?): View? {
                        val rootView = inflater!!.inflate(R.layout.fragment_carousel, container, false)

                        navigation = rootView.findViewById(R.id.navigation)
                        mainViewPager = rootView.findViewById(R.id.mainViewPager)
                        return rootView
                    }

                    override fun onActivityCreated(savedInstanceState: Bundle?) {
                        super.onActivityCreated(savedInstanceState)
                        setupMainViewPager()
                    }

                    fun onBackPressed(): Boolean {
                        val currentFragment = adapter!!.getRegisteredFragment(mainViewPager.currentItem) as OnBackPressListener
                        return currentFragment.onBackPressed()
                        // this Fragment couldn't handle the onBackPressed call
                    }

                    private fun setupMainViewPager() {
                        // Note that we are passing childFragmentManager, not FragmentManager
                        adapter = MyViewPagerAdapter(childFragmentManager)
                        mainViewPager.adapter = adapter
                        mainViewPager.offscreenPageLimit = 2

                        navigation.itemIconTintList = null
                        navigation.menu.getItem(0).setIcon(R.drawable.ic_camera_active)
                        navigation.setOnNavigationItemSelectedListener(onNavigationItemSelectedListener)
                        mainViewPager.addOnPageChangeListener(onViewPagerChangeListener)
                    }

                    private val onNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
                        when (item.itemId) {
                            R.id.tabbar_my_camera -> {
                                mainViewPager.currentItem = 0
                                navigation.menu.getItem(0).setIcon(R.drawable.ic_camera_active)
                                navigation.menu.getItem(1).setIcon(R.drawable.ic_settings)
                                return@OnNavigationItemSelectedListener true
                            }
                            R.id.tabbar_settings -> {
                                mainViewPager.currentItem = 1
                                navigation.menu.getItem(0).setIcon(R.drawable.ic_camera)
                                navigation.menu.getItem(1).setIcon(R.drawable.ic_settings_active)
                                return@OnNavigationItemSelectedListener true
                            }
                        }
                        false
                    }

                    private val onViewPagerChangeListener = (object : ViewPager.OnPageChangeListener {
                        override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
                        }

                        override fun onPageSelected(position: Int) {
                            mainViewPager.adapter
                            navigation.menu.getItem(position).isChecked = true
                            if (position == 0) {
                                mainViewPager.currentItem = 0
                                navigation.menu.getItem(0).setIcon(R.drawable.ic_camera_active)
                                navigation.menu.getItem(1).setIcon(R.drawable.ic_settings)
                            } else {
                                mainViewPager.currentItem = 1
                                navigation.menu.getItem(0).setIcon(R.drawable.ic_camera)
                                navigation.menu.getItem(1).setIcon(R.drawable.ic_settings_active)
                            }
                        }
                        override fun onPageScrollStateChanged(state: Int) {
                        }
                    })

            }


        public class RootFragment extends Fragment implements OnBackPressListener {
            @Override
            public boolean onBackPressed() {
                return new BackPressImpl(this).onBackPressed();
            }
        }


        class CamerasFragment : RootFragment(), CamerasContract.View, CamerasAdapter.Listener, SwipeRefreshLayout.OnRefreshListener {
        ...
            override fun onItemClick(list: ContractData) {
                val videoFragment = VideoFragment().newInstance(list.id)
                val transaction = childFragmentManager.beginTransaction()
                transaction.addToBackStack(null)        // Store the Fragment in stack
                transaction.replace(R.id.cameraFrame, videoFragment) // as the reference to replace fragment
                transaction.commitAllowingStateLoss()
        }
        ...
        }

        class VideoFragment : RootFragment(), View.OnClickListener, VideoContract.View {
        ...
         fun newInstance(idContract: Int?): VideoFragment {
                val bundle = Bundle()
                bundle.putInt(ID_CONTRACT, idContract!!)
                val fragment = VideoFragment()
                fragment.arguments = bundle
                return fragment
            }
        ...
        }
公共类MyViewPagerAdapter扩展了FragmentPagerAdapter{
专用SparseArray registeredFragments=新SparseArray();
公共MyViewPagerAdapter(碎片管理器fm){
超级(fm);
}
@凌驾
公共片段getItem(int位置){
最终碎片结果;
开关(位置){
案例0:
结果=新的CamerasFragment();
打破
案例1:
结果=新设置片段();
打破
违约:
结果=空;
打破
}
返回结果;
}
@凌驾
public int getCount(){
返回2;
}
@凌驾
公共对象实例化项(视图组容器,int位置){
Fragment Fragment=(Fragment)super.instanceItem(容器,位置);
注册碎片。放置(位置,碎片);
返回片段;
}
@凌驾
公共项(视图组容器、int位置、对象){
注册碎片。移除(位置);
超级项目(容器、位置、对象);
}
公共片段getRegisteredFragment(int位置){
返回registeredFragments.get(位置);
}
}
类MainActivity:AppCompatActivity(){
私有lateinit var carouselFragment:carouselFragment
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
如果(savedInstanceState==null){
initScreen()
}否则{
carouselFragment=supportFragmentManager.fragments[0]作为carouselFragment
}
}
私人屏幕(){
carouselFragment=carouselFragment()
val fragmentManager=supportFragmentManager
fragmentManager.beginTransaction()
.更换(R.id.集装箱、转盘碎片)
.commit()
}
重写函数onBackPressed(){
如果(!carouselFragment.onBackPressed()){
super.onBackPressed()
}否则{
//carousel处理后压任务
//不要叫超级
}
}
合同的乐趣(视图:视图){
showToast(“将打开合同添加屏幕”,此选项)
}
}
类CarouselFragment:Fragment(){
lateinit变量导航:BottomNavigationView
lateinit var mainViewPager:ViewPager
专用var适配器:MyViewPagerAdapter?=null
覆盖创建视图(充气机:布局充气机?,容器:视图组?,
savedInstanceState:捆绑?:查看{
val rootView=充气机!!.充气(R.layout.fragment_旋转木马,容器,false)
navigation=rootView.findviewbyd(R.id.navigation)
mainViewPager=rootView.findViewById(R.id.mainViewPager)
返回根视图
}
覆盖活动创建的乐趣(savedInstanceState:Bundle?){
super.onActivityCreated(savedInstanceState)
setupMainViewPager()
}
fun onBackPressed():布尔值{
val currentFragment=adapter!!.getRegisteredFragment(mainViewPager.currentItem)作为OnBackPressListener
返回currentFragment.onBackPressed()
//此片段无法处理onBackPressed调用
}
私人娱乐设置MainViewPager(){
//请注意,我们传递的是childFragmentManager,而不是FragmentManager
适配器=MyViewPagerAdapter(子碎片管理器)
mainViewPager.adapter=适配器
mainViewPager.offscreenPageLimit=2
navigation.ItemIContitList=null
navigation.menu.getItem(0).setIcon(R.drawable.ic\u camera\u active)
navigation.setOnNavigationItemSelectedListener(onNavigationItemSelectedListener)
mainViewPager.addOnPageChangeListener(OnViewPageRchengListener)
}
private val onNavigationItemSelectedListener=BottomNavigationView.onNavigationItemSelectedListener{item->
时间(item.itemId){
R.id.tabbar\u我的\u摄像头->{
mainViewPager.currentItem=0
navigation.menu.getItem(0).setIcon(R.drawable.ic\u camera\u active)
导航.menu.getItem(1).setIcon(R.drawable.ic_设置)
return@OnNavigationItemSelectedListener真的
}
R.id.tabbar\u设置->{
mainViewPager.currentItem=1
navigation.menu.getItem(0).setIcon(R.drawable.ic_摄像头)
 override fun onResume() {
        val fragmentCount = childFragmentManager.backStackEntryCount
        if (fragmentCount >=1) {
            makeInvisibleScreen()
        } else {
            makeVisibleScreen()
        }
        super.onResume()
    }