我正在遵循单一活动方法。我已经在项目内部实现了Navigation Architecture Component。每当我转到其他Fragments时,每个Fragment都有自己的Custom ToolBar设计。其中一个自定义工具栏具有一个后退按钮,该按钮具有自己的设计,此时,我需要实现一个后退按钮事件,但是找不到实现此目的的任何路径。
所有自定义工具栏都有名为ToolbarNavigationHandler的NavigationHandler。
您可以在下面找到我的代码。
请给我您的建议
MainActivity.xml
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<androidx.drawerlayout.widget.DrawerLayout
android:id="@+id/activity_main_drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="xxxx.xxxx.xxxx.MainActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/activity_main_bk_toolbar"
layout="@layout/bk_main_toolbar"/>
<fragment
android:id="@+id/activity_main_nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="0dp"
android:layout_height="0dp"
app:defaultNavHost="true"
app:layout_constraintBottom_toTopOf="@id/navigation"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/activity_main_bk_toolbar"
app:navGraph="@navigation/navigation"/>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/navigation"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:menu="@menu/bottom_navigation_view">
</com.google.android.material.bottomnavigation.BottomNavigationView>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.drawerlayout.widget.DrawerLayout>
</layout>
MainActivity.kt
package xxx.xxxxxx
//<editor-fold desc="Import Packages">
import android.graphics.Color
import android.os.Build
import android.os.Bundle
import android.view.View
import android.view.WindowManager
import androidx.core.content.ContextCompat
import androidx.databinding.DataBindingUtil
import androidx.navigation.NavController
import androidx.navigation.NavDestination
import androidx.navigation.Navigation
import androidx.navigation.ui.setupWithNavController
import com.google.android.material.bottomnavigation.BottomNavigationView
import xxx.xxxxxx.controller.R
import xxx.xxxxxx.controller.databinding.ActivityMainBinding
import xxx.xxxxxx.controller.databinding.BkMainToolbarBinding
import xxx.xxxxxx.core.base.view.BaseActivity
import xxx.xxxxxx.navigation.KeepStateNavigator
import xxx.xxxxxx.util.hide
import xxx.xxxxxx.util.show
import xxx.xxxxxx.widget.IconView
//</editor-fold>
//<editor-fold desc="class MainActivity : AppCompatActivity()">
class MainActivity : BaseActivity(), NavController.OnDestinationChangedListener {
//<editor-fold desc="Public Properties">
//<editor-fold desc="val navController: NavController">
val navController: NavController
get() = this.mNavController
//</editor-fold>
//<editor-fold desc="val activityMainBinding: ActivityMainBinding">
val activityMainBinding: ActivityMainBinding
get() = this.mActivityMainBinding
//</editor-fold>
//<editor-fold desc="val bkToolbarBinding: BkToolbarBinding">
val bkToolbarBinding: BkMainToolbarBinding
get() = this.mBkToolbarBinding
//</editor-fold>
//</editor-fold>
//<editor-fold desc="Private Fields">
private lateinit var mActivityMainBinding: ActivityMainBinding
private lateinit var mBkToolbarBinding: BkMainToolbarBinding
private lateinit var mBottomNavigationView: BottomNavigationView
private lateinit var mToolBar: View
private lateinit var mNavController: NavController
//</editor-fold>
//<editor-fold desc="Functions Overrides">
//<editor-fold desc="override fun onCreate(savedInstanceState: Bundle?)">
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
this.mActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
initialize()
}
//</editor-fold>
//<editor-fold desc="override fun initialize()">
override fun initialize() {
this.initializeView()
this.setUpNavigation()
}
//</editor-fold>
//<editor-fold desc="override val isActive: Boolean">
override val isActive: Boolean
get() = false
//</editor-fold>
//<editor-fold desc="override fun onDestinationChanged(controller: NavController, destination: NavDestination, arguments: Bundle?)">
override fun onDestinationChanged(controller: NavController, destination: NavDestination, arguments: Bundle?) {
when (destination.id) {
R.id.bkSignInController -> {
this.hideBottomNavigationView()
this.hideToolBar()
}
R.id.bkSignUpNameLastNameController -> {
this.hideBottomNavigationView()
this.hideToolBar()
}
R.id.bkSignUpCallNameController -> {
this.hideBottomNavigationView()
this.hideToolBar()
}
R.id.bkSignUpEmailAddressController -> {
this.hideBottomNavigationView()
this.hideToolBar()
}
R.id.bkSignUpEmailAddressValidationController-> {
this.hideBottomNavigationView()
this.hideToolBar()
}
R.id.bkSignUpPasswordController -> {
this.hideBottomNavigationView()
this.hideToolBar()
}
R.id.bkSignUpPhoneNumberController -> {
this.hideBottomNavigationView()
this.hideToolBar()
}
R.id.bkSignUpPhoneNumberValidationController -> {
this.hideBottomNavigationView()
this.hideToolBar()
}
R.id.bkPasswordController -> {
this.hideBottomNavigationView()
this.hideToolBar()
}
R.id.bkResultController -> {
this.hideBottomNavigationView()
this.hideToolBar()
}
R.id.bkSupportController -> {
this.hideBottomNavigationView()
this.hideToolBar()
}
R.id.bkLanguageController -> {
this.hideBottomNavigationView()
this.hideToolBar()
}
else -> {
this.showBottomNavigationView()
this.showToolBar()
}
}
}
//</editor-fold>
//</editor-fold>
//<editor-fold desc="Public Functions">
//<editor-fold desc="fun changeLogoColor(isDark: Boolean)">
fun changeLogoColor(isDark: Boolean) {
val color = ContextCompat.getColor(this, if (isDark) R.color.light_backgorund else R.color.dark_background)
this.mToolBar.findViewById<IconView>(R.id.bk_toolbar_iv_bkIcon).setTextColor(color)
if (!isDark) {
setupStatusBar()
return
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val decorView = this.window.decorView
var systemUiVisibilityFlags = decorView.systemUiVisibility
systemUiVisibilityFlags = systemUiVisibilityFlags and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv()
decorView.systemUiVisibility = systemUiVisibilityFlags
}
}
//</editor-fold>
//<editor-fold desc="fun showBottomNavigationView()">
fun showBottomNavigationView() {
this.mBottomNavigationView.show()
}
//</editor-fold>
//<editor-fold desc="fun hideBottomNavigationView()">
fun hideBottomNavigationView() {
this.mBottomNavigationView.hide()
}
//</editor-fold>
//<editor-fold desc="fun setTopBarColor(color: Int)">
fun setTopBarColor(color: Int) {
this.mToolBar.setBackgroundColor(color)
}
//</editor-fold>
//</editor-fold>
//<editor-fold desc="Private Functions">
//<editor-fold desc="private fun showToolBar()">
private fun showToolBar() {
this.mToolBar.show()
}
//</editor-fold>
//<editor-fold desc="private fun hideToolBar()">
private fun hideToolBar() {
this.mToolBar.hide()
}
//</editor-fold>
//<editor-fold desc="private fun initializeView()">
private fun initializeView() {
this.mBottomNavigationView = mActivityMainBinding.navigation
this.mBkToolbarBinding = mActivityMainBinding.activityMainBkToolbar
this.mToolBar = mBkToolbarBinding.root
}
//</editor-fold>
//<editor-fold desc="private fun setUpNavigation()">
private fun setUpNavigation() {
this.mNavController = Navigation.findNavController(this, R.id.activity_main_nav_host_fragment)
val navHostFragment = supportFragmentManager.findFragmentById(R.id.activity_main_nav_host_fragment)!!
val navigator = KeepStateNavigator(this, navHostFragment.childFragmentManager, R.id.activity_main_nav_host_fragment)
this.mNavController.navigatorProvider.addNavigator(navigator)
this.mNavController.setGraph(R.navigation.navigation)
this.mBottomNavigationView.setupWithNavController(this.mNavController)
this.mBottomNavigationView.setBackgroundResource(R.drawable.bottom_bar_shape)
this.mNavController.addOnDestinationChangedListener(this)
}
//</editor-fold>
//<editor-fold desc="private fun setupStatusBar()">
private fun setupStatusBar() {
val window = this.window
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
//window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
window.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
//window.setStatusBarColor(ContextCompat.getColor(this, R.color.light_backgorund))
//window.statusBarColor = Color.TRANSPARENT
//window.statusBarColor = ContextCompat.getColor(this, R.color.colorPrimary)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
} else {
TODO() //change status text color
//window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
//statusBar.setBackgroundColor(color)
}
window.navigationBarColor = Color.BLACK
}
//</editor-fold>
//</editor-fold>
}
//</editor-fold>
MainToolBar.xml(没有后退按钮)
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="handlers"
type="xxxx.xxxxx.navigation.handler.toolbar.ToolbarNavigationHandler" />
</data>
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:elevation="0dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/bk_main_toolbar_gdl_topEdge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.02" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/bk_main_toolbar_gdl_bottomEdge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.98" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/bk_main_toolbar_gdl_horizontal_middleEdge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.5" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/bk_main_toolbar_gdl_vertical_middleEdge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/bk_main_toolbar_gdl_startEdge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.05" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/bk_main_toolbar_gdl_endEdge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.95" />
<xxxxx.xxxxxx.widget.CircleImageView
android:id="@+id/bk_main_toolbar_civ_menu"
android:layout_width="36dp"
android:layout_height="36dp"
app:view_state="IMAGE"
android:src="@drawable/ic_menu_black"
app:layout_constraintStart_toEndOf="@id/bk_main_toolbar_gdl_startEdge"
app:layout_constraintTop_toBottomOf="@id/bk_main_toolbar_gdl_topEdge"
app:layout_constraintBottom_toTopOf="@id/bk_main_toolbar_gdl_bottomEdge"/>
<xxxxx.xxxxxx.widget.IconView
android:id="@+id/bk_main_toolbar_iv_fupsIcon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:textSize="50sp"
android:text="@string/icon_logo"
app:iconFontPath="fonts/xxxx.ttf"
app:layout_constraintStart_toEndOf="@id/bk_main_toolbar_civ_menu"
app:layout_constraintTop_toBottomOf="@id/bk_main_toolbar_gdl_topEdge"
app:layout_constraintBottom_toTopOf="@id/bk_main_toolbar_gdl_bottomEdge"
app:layout_constraintEnd_toStartOf="@id/bk_main_toolbar_civ_profile"
/>
<xxx.xxxxxx.widget.CircleImageView
android:id="@+id/bk_main_toolbar_civ_profile"
android:layout_width="36dp"
android:layout_height="36dp"
android:onClick="@{handlers::profilePressed}"
app:layout_constraintEnd_toStartOf="@id/bk_main_toolbar_gdl_endEdge"
app:layout_constraintTop_toBottomOf="@id/bk_main_toolbar_gdl_topEdge"
app:layout_constraintBottom_toTopOf="@id/bk_main_toolbar_gdl_bottomEdge"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.appbar.AppBarLayout >
</layout>
ToolBarBack.xml
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="handlers"
type="xxxxx.xxxxx.navigation.handler.toolbar.ToolbarNavigationHandler" />
</data>
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:elevation="0dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/bk_toolbar_gdl_topEdge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.02" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/bk_toolbar_gdl_bottomEdge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.98" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/bk_toolbar_gdl_horizontal_middleEdge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.5" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/bk_toolbar_gdl_vertical_middleEdge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/bk_toolbar_gdl_startEdge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/bk_toolbar_gdl_endEdge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="1" />
<xxxx.xxxxx.widget.IconView
android:id="@+id/bk_toolbar_iv_fupsIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"
android:text="@string/icon_back"
app:iconFontPath="fonts/icomoon.ttf"
app:layout_constraintStart_toEndOf="@id/bk_toolbar_gdl_startEdge"
app:layout_constraintTop_toBottomOf="@id/bk_toolbar_gdl_horizontal_middleEdge"
app:layout_constraintBottom_toTopOf="@id/bk_toolbar_gdl_horizontal_middleEdge"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.appbar.AppBarLayout >
</layout>
ToolbarNavigationHandler.kt
package xxx.xxxxxxxx.navigation.handler.toolbar
//<editor-fold desc="Import Packages">
import android.view.View
import androidx.navigation.NavController
import androidx.navigation.Navigation
import androidx.navigation.findNavController
import xxx.xxxxxxxx.MainActivity
import xxx.xxxxxxxx.controller.R
import xxx.xxxxxxxx.controller.databinding.BkLogoHeaderWithLanguageBinding
import xxx.xxxxxxxx.controller.databinding.BkMainToolbarBinding
import xxx.xxxxxxxx.controller.databinding.BkToolbarBackBinding
import xxx.xxxxxxxx.controller.BkControllerDirections
import xxx.xxxxxxxx.model.dto.BKItemResponse
//</editor-fold>
//<editor-fold desc="class ToolbarNavigationHandler">
class ToolbarNavigationHandler {
//<editor-fold desc="Private Fields">
private lateinit var mBkLogoHeaderWithLanguageBinding: BkLogoHeaderWithLanguageBinding
private lateinit var mBkMainToolbarBinding: BkMainToolbarBinding
private lateinit var mBkToolbarBackBinding: BkToolbarBackBinding
private lateinit var mNavController: NavController
//</editor-fold>
constructor(bkLogoHeaderWithLanguageBinding: BkLogoHeaderWithLanguageBinding) {
this.mBkLogoHeaderWithLanguageBinding = bkLogoHeaderWithLanguageBinding
}
constructor(bkMainToolbarBinding: BkMainToolbarBinding, navController: NavController) {
this.mBkMainToolbarBinding = bkMainToolbarBinding
this.mNavController = navController
}
constructor(bkToolbarBackBinding: BkToolbarBackBinding) {
this.mBkToolbarBackBinding = bkToolbarBackBinding
}
//<editor-fold desc="Public Functions">
//<editor-fold desc="fun languagePressed(view: View)">
fun languagePressed(view: View) {
Navigation.findNavController(view).navigate(R.id.action_start_bkLanguageController)
}
//</editor-fold>
//<editor-fold desc="fun profilePressed(view: View)">
fun profilePressed(view: View) {
val userInfo = BKItemResponse()
userInfo.merchantName = "Kulaksiz"
userInfo.amount = 100.0
userInfo.category = 1
//Use Safe Args to pass data with type safety
val action = BkControllerDirections.actionStartBkUserProfileController("Berk", userInfo)
mNavController.navigate(action)
}
//</editor-fold>
//</editor-fold>
//</editor-fold>
}
//</editor-fold>
这是我的方法,不知道它是否正确,但是对我有用
在Fragment中,编写一种方法,如果back press被fragment占用,则该方法返回true
。就我而言,我必须关闭一个popupWindow In片段,如果它是打开的,请按回去。您可能有其他目的,但概念相同
fun fragmentBackPressed(): Boolean {
popupWindow?.let {
if (it.isShowing) {
it.dismiss()
return true
}
}
return false
}
在活动中覆盖onBackPressed()
并获取当前的显示片段
override fun onBackPressed() {
val navHostFragment = homeHostFragment as NavHostFragment
val fragment = navHostFragment.childFragmentManager.fragments[0]
if (fragment is MyFragment) {
if (!fragment.fragmentBackPressed()) {
super.onBackPressed()
}
} else {
super.onBackPressed()
}
}