如果汇总应用程序并再次返回一个片段与 ViewPager 中的下一个片段混合



我按照本教程 https://tausiq.wordpress.com/2014/06/06/android-multiple-fragments-stack-in-each-viewpager-tab/

但是存在一些错误 - 如果我们在片段 A2 屏幕上并按"主页"按钮然后返回应用程序 - 我看到片段 A1 和片段 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
            }
        ...
        }

在我的应用程序中,我从CameraFragment打开VideoFragment并按"主页"按钮,然后返回应用程序 - 我看到CameraFragment位于VideoFragment,为什么???

我自己找到了我的问题的答案 - 在课堂上 相机片段 我添加了检查使用backStackEntryCount

 override fun onResume() {
        val fragmentCount = childFragmentManager.backStackEntryCount
        if (fragmentCount >=1) {
            makeInvisibleScreen()
        } else {
            makeVisibleScreen()
        }
        super.onResume()
    }

我想一切都清楚了

最新更新