Reputation: 972
I have Fragment and i want to add option menu. I have tried a lot but not found any solution.
Here is my code.
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()
}
}
The method onCreateOptionsMenu
is not getting executed.
What i am missing i have no idea. There is no actionbar in my activity. I have put action bar in the fragment_customer_list. Action bar is displayed properly. But not able to add menu to the toolbar
Upvotes: 2
Views: 586
Reputation: 363825
Since you are not calling the setSupportActionBar
you should use the Toolbar
APIs directly.
Something like:
toolbar.inflateMenu(R.menu.menu_main)
toolbar.setOnMenuItemClickListener {
it.onNavDestinationSelected(navController)
}
NavigationUI.setupWithNavController(
toolbar, navController, appBarConfiguration)
Upvotes: 5