【问题标题】:Not able to setup optionMenu using NavigationUI无法使用 NavigationUI 设置 optionMenu
【发布时间】:2020-08-25 06:11:49
【问题描述】:

我有 Fragment,我想添加选项菜单。我尝试了很多,但没有找到任何解决方案。

这是我的代码。

package com.code2hack.milkledger.fragment

import android.app.AlertDialog
import android.os.Bundle
import android.view.*
import androidx.appcompat.view.ActionMode
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import androidx.navigation.findNavController
import androidx.navigation.fragment.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.NavigationUI
import androidx.navigation.ui.setupWithNavController
import androidx.recyclerview.widget.LinearLayoutManager
import com.code2hack.milkledger.BaseActivity
import com.code2hack.milkledger.MainActivityViewModel
import com.code2hack.milkledger.R
import com.code2hack.milkledger.actionmode.ActionModeCallback
import com.code2hack.milkledger.adapter.CustomerAdapter
import com.code2hack.milkledger.dialog.AddUserDialog
import com.code2hack.milkledger.handler.ItemClickListener
import com.code2hack.milkledger.model.Customer
import com.code2hack.milkledger.util.Event
import com.google.android.material.card.MaterialCardView
import com.google.android.material.snackbar.Snackbar
import kotlinx.android.synthetic.main.fragment_customer_list.*

class CustomerListFragment : BaseFragment() {
    private val baseActivity: BaseActivity by lazy { activity as BaseActivity };
    private var selectMode = false
    val selectedCustomers = mutableSetOf<Customer>()
    val selectedViews = mutableSetOf<View>()
    private lateinit var actionMode: ActionMode
    private val list = mutableListOf<Customer>()
    private val model: MainActivityViewModel by activityViewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setHasOptionsMenu(true)
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_customer_list, container, false)
    }

    private val customerAdapter: CustomerAdapter by lazy { CustomerAdapter(list,ClickHandler()) }

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

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return NavigationUI.onNavDestinationSelected(item,
            findNavController())
                || super.onOptionsItemSelected(item)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val navController = findNavController()
        val appBarConfiguration = AppBarConfiguration(navController.graph)
        view.findViewById<Toolbar>(R.id.toolbar)
            .setupWithNavController(navController, appBarConfiguration)
        //baseActivity.setSupportActionBar(toolbar)
        fab.setOnClickListener {
            baseActivity.showDialog(AddUserDialog(null))
        }

        customer_view.apply {
            layoutManager = LinearLayoutManager(activity)
            adapter = customerAdapter
        }

        model.loadCustomers(userInfo().user_name,token())
        observe();
    }

    private fun observe() {
        with(model){
            customers.observe(viewLifecycleOwner, Observer { items ->
                if(items.isEmpty()){
                    baseActivity.showDialog(AddUserDialog(null))
                }
                list.clear();
                list.addAll(items);
                customerAdapter.notifyDataSetChanged();
            })
            customerSaved.observe(viewLifecycleOwner, Observer {
                if(!it.handled){
                    Snackbar.make(requireView(),getString(R.string.message_customer_create),Snackbar.LENGTH_LONG).show()
                    list.add(it.getContentIfNotHandled()!!)
                    customerAdapter.notifyDataSetChanged()
                }
            })
            customerDeleted.observe(viewLifecycleOwner, Observer {
                if(!it.handled){
                    handleDeleteEvent(it, requireView(), customerAdapter)
                }
            })
        }
    }

    private fun handleDeleteEvent(
        it: Event<Boolean>,
        view: View,
        customerAdapter: CustomerAdapter
    ) {
        it.getContentIfNotHandled()
        Snackbar.make(view, getString(R.string.message_customer_delete), Snackbar.LENGTH_LONG).show()
        model.loadCustomers(userInfo().user_name, token())
        selectMode = false
        selectedCustomers.clear()
        selectedViews.clear()
        actionMode.finish()
        list.clear()
        customerAdapter.notifyDataSetChanged()
    }
    private fun deleteCustomers(){
        val dialog = AlertDialog.Builder(requireActivity())
            .setMessage(R.string.delete_confirm_message)
            .setPositiveButton(R.string.delete){ dialogInterface, _ ->
                model.deleteCustomer(selectedCustomers, token(), userInfo().user_name)
                clearSelectMode()
                dialogInterface.cancel()
            }.setNegativeButton(R.string.cancel){ dialogInterface, _ ->
                clearSelectMode()
                dialogInterface.cancel()
            }
            .create()
        dialog.setOnShowListener {
            dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(ContextCompat.getColor(requireContext(),R.color.colorAccent))
            dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(ContextCompat.getColor(requireContext(),R.color.cancel_text_red))
        }
        dialog.show();
    }
    val actionModeCallback = ActionModeCallback({
        when(it) {
            R.id.action_logout -> {
                (baseActivity).logout();
                true
            }
            R.id.delete -> {
                deleteCustomers()
                true
            }
            R.id.edit -> {
                baseActivity.showDialog(AddUserDialog(selectedCustomers.first()))
                true
            }
            else -> false
        }
    },{
        selectMode = false
        selectedCustomers.clear()
        selectedViews.forEach{
            (it as MaterialCardView).setCardBackgroundColor(ContextCompat.getColor(requireActivity(),android.R.color.white))
        }
        selectedViews.clear()
    },{
        it.findItem(R.id.delete).isVisible = selectedCustomers.size > 0
        it.findItem(R.id.edit).isVisible = selectedCustomers.size == 1
    })
    inner class ClickHandler : ItemClickListener<Customer>() {
        val TAG = "ClickHandler"

        override fun onItemClick(item: Customer, view:View?) {
            if(selectMode){
                processSelection(item,view)
            } else {
                val action = CustomerListFragmentDirections.recordFragment(item.id)
                action.setCowMilkRate(item.cowMilkRate)
                action.setBuffaloMilkRate(item.buffaloMilkRate)
                view!!.findNavController().navigate(action)
            }
        }
        override fun onLongClick(item: Customer, view: View?){
            selectMode = true
            actionMode = baseActivity.startSupportActionMode(actionModeCallback)!!
            processSelection(item,view)

        }
        private fun processSelection(customer: Customer, view: View?){
            if(selectedCustomers.indexOf(customer) < 0) {
                selectedCustomers.add(customer)
                selectedViews.add(view!!)
                (view as MaterialCardView).setCardBackgroundColor(ContextCompat.getColor(requireActivity(),R.color.background_light_green))
            }
            else {
                selectedCustomers.remove(customer)
                selectedViews.remove(view!!)
                (view as MaterialCardView).setCardBackgroundColor(ContextCompat.getColor(requireActivity(),android.R.color.white))
            }
            if(selectedCustomers.size == 0){
                clearSelectMode();
            } else {
                actionMode.invalidate()
            }


        }
    }
    private fun clearSelectMode() {
        actionMode.finish()
        selectMode = false
        selectedCustomers.clear()
        selectedViews.clear()
    }
}

方法onCreateOptionsMenu 没有被执行。 我想念什么我不知道。我的活动中没有操作栏。我已将操作栏放在 fragment_customer_list 中。操作栏正确显示。但无法将菜单添加到工具栏

【问题讨论】:

  • 在您的活动中,您使用的是setSupportActionBar(toolbar) 吗?
  • 不,因为我没有在活动中使用工具栏。它存在于我的片段中。

标签: android fragment android-architecture-navigation android-jetpack-navigation


【解决方案1】:

由于您没有调用setSupportActionBar,您应该直接使用Toolbar API。 比如:

    toolbar.inflateMenu(R.menu.menu_main)
    toolbar.setOnMenuItemClickListener {
        it.onNavDestinationSelected(navController)
    }
    NavigationUI.setupWithNavController(
        toolbar, navController, appBarConfiguration)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    • 2018-11-27
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 2019-04-06
    相关资源
    最近更新 更多