如何从Android导航组件中自定义工具栏的后退按钮内部处理后退按钮事件?

问题描述 投票:1回答:1

我正在遵循单一活动方法。我已经在项目内部实现了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>

android kotlin android-toolbar android-navigation android-navigation-graph
1个回答
0
投票

这是我的方法,不知道它是否正确,但是对我有用

在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()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.