主要活動
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
var APP_START_TIME: Long = 0
private lateinit var appBarConfiguration: AppBarConfiguration
private var _binding: ActivityMainBinding? = null
private val binding get() = _binding!!
private lateinit var navController: NavController
private lateinit var postViewModel: PostViewModel
private var _navGraph: NavGraph? = null
private val navGraph get() = _navGraph!!
lateinit var adView: AdView
private var adRequest: AdRequest? = null
private val applicationScope = CoroutineScope(Dispatchers.Unconfined)
override fun onDestroy() {
super.onDestroy()
adView.destroy()
adRequest = null
_binding = null
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
APP_START_TIME = System.currentTimeMillis()
_binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
adView = AdView(this)
delayedInit()
postViewModel = ViewModelProvider(this)[PostViewModel::
class.java]
setSupportActionBar(binding.toolbar)
val drawerLayout: DrawerLayout = binding.drawerLayout
val navHostFragment =
supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment?
if (navHostFragment != null) {
navController = navHostFragment.navController
}
appBarConfiguration = AppBarConfiguration(
setOf(
R.id.nav_home, R.id.nav_accessory,
R.id.nav_arcade, R.id.nav_fashion,
R.id.nav_food, R.id.nav_heath,
R.id.nav_lifestyle, R.id.nav_sports, R.id.nav_favorites, R.id.settingsFragment
), drawerLayout
)
setupActionBarWithNavController(this, navController, appBarConfiguration)
setupWithNavController(binding.navView, navController)
_navGraph = navController.navInflater.inflate(R.navigation.mobile_navigation)
onBackPressedDispatcher.addCallback(this /* lifecycle owner */,
object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
// Back is pressed... Finishing the activity
finish()
}
})
}
// override fun onStart() {
// super.onStart()
// }
override fun onPause() {
super.onPause()
adView.pause()
}
override fun onResume() {
super.onResume()
adView.resume()
postViewModel.currentDestination.observe(this) { currentDestination ->
Log.w(TAG, "currentDestination: at first run is $currentDestination")
navGraph.setStartDestination(currentDestination)
navController.graph = navGraph
}
navController.addOnDestinationChangedListener { _, destination, _ ->
Log.d(TAG, "addOnDestinationChangedListener: " destination.id)
if (destination.id != R.id.settingsFragment
&& destination.id != R.id.aboutFragment
&& destination.id != R.id.privacyPolicyFragment
) {
postViewModel.saveCurrentDestination(destination.id)
}
}
}
private fun requestHomeBanner() {
adRequest = Constants.callAndBuildAdRequest()
adView.adListener = object : AdListener() {
override fun onAdFailedToLoad(adError: LoadAdError) {
Log.e(TAG, "onAdFailedToLoad: ${adError.cause.toString()}")
Log.e(TAG, "onAdFailedToLoad: ${adError.responseInfo.toString()}")
}
}
adRequest?.let { adView.loadAd(it) }
}
private fun delayedInit() = applicationScope.launch {
binding.adViewContainer.addView(adView)
adView.adUnitId = "ca-app-pub-3940256099942544/6300978111"
adView.setAdSize(Constants.GET_AD_SIZE(this@MainActivity))
val testDeviceIds = listOf("048DC5C3C06FBD17D9AD205151167F48")
val configuration = RequestConfiguration.Builder().setTestDeviceIds(testDeviceIds).build()
MobileAds.setRequestConfiguration(configuration)
if (Utils.hasInternetConnection(this@MainActivity)) {
requestTheLatestConsentInformation(this@MainActivity)
MobileAds.initialize(this@MainActivity) {
Log.d(TAG, "onInitCompleted")
}
requestHomeBanner()
}
}
override fun onSupportNavigateUp(): Boolean {
return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
}
}
我的嘗試解決
- 我試圖在里面添加以下代碼
OnBackPressedCallback
navGraph.clear()
binding.drawerLayout.removeAllViews()
binding.navView.removeAllViews()
- 我也嘗試在
onBackPressedDispatcher里面添加回呼addOnDestinationChangedListener
onBackPressedDispatcher.addCallback(this /* lifecycle owner */,
object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
// Back is pressed... Finishing the activity
navController.clearBackStack(destination.id)
finish()
}
})
- 我試圖從片段本身而不是像下面這樣的活動處理背壓
requireActivity()
.onBackPressedDispatcher
.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
Log.d(TAG, "Fragment back pressed invoked")
// hideShimmerEffect()
// Do custom work here
requireActivity().finish()
// if you want onBackPressed() to be called as normal afterwards
if (isEnabled) {
isEnabled = false
requireActivity().onBackPressed()
}
}
})
- 我試圖通過在上面的代碼中添加以下兩行來彈出回傳堆疊或清除它
findNavController().popBackStack()
findNavController().clearBackStack(R.id.nav_home)
- 最后我嘗試編輯
onSupportNavigateUp如下
override fun onSupportNavigateUp(): Boolean {
return if(supportFragmentManager.backStackEntryCount > 0){
navController.navigateUp(appBarConfiguration)
}else {
finish()
super.onSupportNavigateUp()
}
}
這是我最后一次編輯的代碼,所有這些嘗試都沒有解決問題
uj5u.com熱心網友回復:
如果您想回傳初始活動或在單個活動應用程式的情況下退出應用程式添加
android:noHistory="true"
在活動標簽內的清單檔案中
uj5u.com熱心網友回復:
我不確定,但我認為這是因為您在 onResume() 中第二次設定 startDestination。第一個默認設定在 onCreate() 中。這就是為什么它會堆疊并且您碰巧按了兩次后退按鈕。
將以下代碼移至 onCreate() 可能會有所幫助:
postViewModel.currentDestination.observe(this) { currentDestination ->
Log.w(TAG, "currentDestination: at first run is $currentDestination")
navGraph.setStartDestination(currentDestination)
navController.graph = navGraph
}
navController.addOnDestinationChangedListener { _, destination, _ ->
Log.d(TAG, "addOnDestinationChangedListener: " destination.id)
if (destination.id != R.id.settingsFragment
&& destination.id != R.id.aboutFragment
&& destination.id != R.id.privacyPolicyFragment
) {
postViewModel.saveCurrentDestination(destination.id)
}
}
uj5u.com熱心網友回復:
嘗試使用這個函式來啟動你的片段:
private fun loadFragment(fragment: Fragment?) {
if (fragment != null) {
val fragmentManager = supportFragmentManager
fragmentManager
.beginTransaction()
.replace(R.id.nav_host_fragment, fragment)
.commit()
}
}
uj5u.com熱心網友回復:
在java中我使用了這種型別的方法。不知道天氣會不會對你有用。
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() == 1) {
finish();
} else {
super.onBackPressed();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/525493.html
上一篇:ViewPager2不切換片段
