android-fragments 添加选项菜单时,操作栏后退按钮不起作用

bz4sfanl  于 2022-11-13  发布在  Android
关注(0)|答案(1)|浏览(128)

我正在膨胀一个选项菜单到一个片段,在那之后,操作栏的后退按钮不工作,而系统的后退按钮也工作。请检查我的代码如下。
下面是我的代码:
NewsFragment.kt

package com.example.googlelike.news

import android.os.Bundle
import android.view.*
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProviders
import com.example.googlelike.R
import com.example.googlelike.databinding.FragmentNewsBinding
import com.example.googlelike.network.MarsApiFilter

class NewsFragment : Fragment(){
    private val newsViewModel: NewsViewModel by lazy {
        ViewModelProviders.of(this).get(NewsViewModel::class.java)
    }
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val binding = FragmentNewsBinding.inflate(inflater)

        binding.lifecycleOwner = this
        binding.recyclerView.adapter = NewsAdapter()
        binding.viewModel = newsViewModel

        setHasOptionsMenu(true)

        return binding.root
    }

    override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
        super.onCreateOptionsMenu(menu, inflater)
        inflater?.inflate(R.menu.option_menu,menu)
    }

    override fun onOptionsItemSelected(item: MenuItem?): Boolean {
        newsViewModel.updateFilterProperty(when(item?.itemId){
            R.id.rent_menu -> MarsApiFilter.RENT
            R.id.buy_menu -> MarsApiFilter.BUY
            else -> MarsApiFilter.SHOW_ALL
        })
        return true
    }

}

(在将选项菜单膨胀到NewsFragment.kt后,我无法通过操作栏后退按钮从NewsFragment返回到HomeFragment)

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import com.example.googlelike.databinding.FragmentHomeBinding

class HomeFragment : Fragment(){
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val binding = FragmentHomeBinding.inflate(inflater)
        binding.lifecycleOwner = this
        binding.button3.setOnClickListener {
            this.findNavController().navigate(HomeFragmentDirections.actionHomeFragmentToNewsFragment())
        }
        return binding.root
    }
}

MainActivity.kt

class MainActivity : AppCompatActivity() {
lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = DataBindingUtil.setContentView(this,R.layout.activity_main)
    val navController = this.findNavController(R.id.nav_host_fragment)
    NavigationUI.setupActionBarWithNavController(this,navController)

}

override fun onSupportNavigateUp(): Boolean {
    val navController = this.findNavController(R.id.nav_host_fragment)
    return navController.navigateUp()
}
}

编辑

我的导航图

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/nav_graph"
    app:startDestination="@id/homeFragment">

    <fragment
        android:id="@+id/homeFragment"
        android:name="com.example.googlelike.home.HomeFragment"
        android:label="HomeFragment" >
        <action
            android:id="@+id/action_homeFragment_to_newsFragment"
            app:destination="@id/newsFragment" />
    </fragment>
    <fragment
        android:id="@+id/newsFragment"
        android:name="com.example.googlelike.news.NewsFragment"
        android:label="NewsFragment" >
        <action
            android:id="@+id/action_newsFragment_to_detailFragment"
            app:destination="@id/detailFragment" />
    </fragment>
    <fragment
        android:id="@+id/detailFragment"
        android:name="com.example.googlelike.detail.DetailFragment"
        android:label="DetailFragment" />
</navigation>
p1iqtdky

p1iqtdky1#

//Implement like this in your fragment

     class BackButtonWithMenu : Fragment() {
            private val menuProvider = object : MenuProvider {
                    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
                        menuInflater.inflate(R.menu.BackButton_frag_menu, menu)
                    }
            
                    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
                        return when (menuItem.itemId) {
                            R.id.termsBtn -> {
                                navigateToIntroductionPage()
                                false //check this
                            }
                            else -> false //check this
                        }
                    }
                }
            
            //set ActionBar to .show
            override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
                    super.onViewCreated(view, savedInstanceState)
                    (requireActivity() as AppCompatActivity).supportActionBar?.show()

val menuHost: MenuHost = requireActivity()
            menuHost.addMenuProvider(menuProvider, viewLifecycleOwner, Lifecycle.State.RESUMED)
            
            }
        
        //Add these fun in your activity
        override fun onNavigateUp(): Boolean {
                return navController.navigateUp(appBarConfiguration)
            }
        
            override fun onSupportNavigateUp(): Boolean {
                onBackPressed()
                return true
            }
//This is 100% working

相关问题