【问题标题】:Contextual action bar with androidx navigation component带有 androidx 导航组件的上下文操作栏
【发布时间】:2020-07-13 20:22:03
【问题描述】:

我正在尝试弄清楚如何使用 androidx 导航组件实现上下文操作栏

在其中,我有一个RecyclerView和选择项目时,我需要向所选项目显示动作栏,类似于下面的图像。

我已经为 RecyclerView 项目实现了选定状态,但我需要更改工具栏并响应操作点击。

我正在使用带有多个片段的单个活动应用程序

在 MainActivity 中,我按如下方式初始化工具栏。

当然,我需要从片段切换工具栏。

class MainActivity : AppCompatActivity() {

    private lateinit var appBarConfiguration : AppBarConfiguration
    private lateinit var navController: NavController

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

        val binding : MainActivityBinding = DataBindingUtil.setContentView(this,R.layout.main_activity)

        setSupportActionBar(binding.toolbar)

        val host: NavHostFragment = supportFragmentManager
            .findFragmentById(R.id.nav_host_fragment) as NavHostFragment? ?: return

        navController = host.navController

        appBarConfiguration = AppBarConfiguration(
            setOf(R.id.main_dest),
            binding.drawerLayout
        )

        setupActionBar(appBarConfiguration)

    }

    private fun setupNavigationMenu(navView : NavigationView) {
        navView.setupWithNavController(navController)
    }

    private fun setupActionBar(appBarConfig: AppBarConfiguration) {
        setupActionBarWithNavController(navController,appBarConfig)
    }


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

【问题讨论】:

    标签: android kotlin android-toolbar android-architecture-components android-architecture-navigation


    【解决方案1】:

    我最终使用了常规的 actionMode。看起来很简单,并且不会导致与喷气背包组件并行工作的任何问题

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                                  savedInstanceState: Bundle?): View {
            
            //..
    
            viewModel.getSelected().observe(viewLifecycleOwner, Observer {
                adapter.setSelected(it.keys.toList(),viewModel.lastSelectedId)
                actionBarSelection(it.size)
            })
    }
    
    private fun actionBarSelection(selectedItems: Int) {
            if (selectedItems == 0) {
                actionMode?.finish()
            } else {
                if (actionMode == null) {
                    actionMode = requireActivity().startActionMode(actionModeCallback)
                }
            }
        }
    
    private val actionModeCallback: ActionMode.Callback =
            object : ActionMode.Callback {
                override fun onCreateActionMode(
                    mode: ActionMode,
                    menu: Menu
                ): Boolean {
                    val inflater = mode.menuInflater
                    inflater.inflate(R.menu.menu_delete, menu)
                    return true
                }
    
                override fun onPrepareActionMode(
                    mode: ActionMode,
                    menu: Menu
                ): Boolean {
                    return false
                }
    
                override fun onActionItemClicked(
                    mode: ActionMode,
                    item: MenuItem
                ): Boolean {
                    //TODO: respond to action click
                    return false
                }
    
                override fun onDestroyActionMode(mode: ActionMode) {
                    actionMode = null
                    viewModel.clearSelected()
                }
            }
    

    【讨论】:

      猜你喜欢
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多