我按照本教程https://tausiq.wordpress.com/2014/06/06/android-multiple-fragments-stack-in-each-viewpager-tab/
但是存在一些错误 - 如果我们在Fragment A2屏幕上并按下按钮" Home"然后回到应用程序 - 我看到片段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
}
...
}
在我的应用程序中,我从CamerasFragment打开VideoFragment并按下按钮&#34; Home&#34;然后回到应用程序 - 我看到CamerasFragment在VideoFragment,为什么???
答案 0 :(得分:0)
我自己找到了问题的答案 - 在CamerasFragment课程中我添加了使用backStackEntryCount
的检查:
override fun onResume() {
val fragmentCount = childFragmentManager.backStackEntryCount
if (fragmentCount >=1) {
makeInvisibleScreen()
} else {
makeVisibleScreen()
}
super.onResume()
}
我认为一切都很清楚