Android 如果卷起应用程序并再次返回,则在ViewPager中将一个片段与下一个片段混合
我遵循这个教程 但是存在一些错误-如果我们在Fragment A2屏幕上,按下“Home”按钮,然后返回应用程序-我看到了Fragment A1和Fragment A2,如何修复它 我在Kotlin上的代码示例: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
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()
}