微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

按一次返回键停留在同一个片段上,如果按两次,它将返回到上一个片段

如何解决按一次返回键停留在同一个片段上,如果按两次,它将返回到上一个片段

我有以下代码

package com.example.covid19
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.fragment.app.add
import androidx.fragment.app.commit
import com.example.covid19.fragments.CountryListFragment
import com.example.covid19.fragments.CountryStatisticFragment
import com.example.covid19.fragments.onClickedListener


class MainActivity : AppCompatActivity(),onClickedListener {
   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       setContentView(R.layout.activity_main)
       //first time the app is launched
       if (savedInstanceState == null) {
           setCountryFragment()
       }
   }

   private fun setCountryFragment() {
       supportFragmentManager.commit {
           setReorderingallowed(true)
           add<CountryListFragment>(R.id.fragment_container_view)
       }
   }

   private fun changeFragment(arg: String) {
       lateinit var nextFragment: Fragment
       val currentFragment: Fragment? =
           supportFragmentManager.findFragmentById(R.id.fragment_container_view)
       if (currentFragment != null && currentFragment is CountryListFragment) {
           nextFragment = CountryStatisticFragment.newInstance(arg)

       } else {
           nextFragment = CountryListFragment.newInstance()

       }
       supportFragmentManager.commit {
           setReorderingallowed(true)
           replace(R.id.fragment_container_view,nextFragment)
           addToBackStack(null)
       }
   }
   override fun onItemClicked(arg: String) {
       changeFragment(arg)
   }
}

当我按下第二个片段 CountryStatisticFragment 中的按钮时,它会闪烁并停留在同一个片段上。我必须按两次才能转到第一个片段! 要“修复”它,我必须添加以下代码

override fun onBackpressed() {
    if(supportFragmentManager.backStackEntryCount > 0) {
        supportFragmentManager.popBackStackImmediate()
        //this should not be needed,but pressing back one time,when being in CountryStatisticFragment leads to a transition to same fragment,CountryStatisticFragment
        super.onBackpressed()
    } else {
        super.onBackpressed()
    }
}

但是感觉这不是正确的处理方式。任何见过类似行为或可以看到我在做什么的人吗?

解决方法

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    //first time the app is launched
    if (savedInstanceState == null) {
        setFragmentA()
    }
}

private fun setFragmentA() {
    supportFragmentManager.commit {
        setReorderingAllowed(true)
        add<FragmentA>(R.id.fragment_container_view)
        addToBackStack(null) // DELETE THIS     
}

首先猜测是在 addToBackStack(null) 中调用 setFragmentA。这会将第一个片段添加到 backstack 中,因此当您按下返回键时,您不仅会退出,还弹出堆栈并以一种奇怪的状态结束。

,

这是我活动的完整准确代码。

package com.example.covid19


import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.fragment.app.add
import androidx.fragment.app.commit
import com.example.covid19.fragments.CountryListFragment
import com.example.covid19.fragments.CountryStatisticFragment
import com.example.covid19.fragments.onClickedListener


class MainActivity : AppCompatActivity(),onClickedListener {
   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       setContentView(R.layout.activity_main)
       //first time the app is launched
       if (savedInstanceState == null) {
           setCountryFragment()
       }
   }

   private fun setCountryFragment() {
       supportFragmentManager.commit {
           setReorderingAllowed(true)
           add<CountryListFragment>(R.id.fragment_container_view)

       }
   }

   private fun changeFragment(arg: String) {
       lateinit var nextFragment: Fragment
       val currentFragment: Fragment? =
           supportFragmentManager.findFragmentById(R.id.fragment_container_view)
       if (currentFragment != null && currentFragment is CountryListFragment) {
           nextFragment = CountryStatisticFragment.newInstance(arg)

       } else {
           nextFragment = CountryListFragment.newInstance()


       }
       supportFragmentManager.commit {
           setReorderingAllowed(true)
           replace(R.id.fragment_container_view,nextFragment)
           addToBackStack(null)
       }
   }
   override fun onItemClicked(arg: String) {
       changeFragment(arg)
   }
}

CountryListFragment 和 CountryListFragment 里面都有 recyclerviews。这只是我做的一个业余爱好项目,其他一切正常!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。