Контекстная панель действий с навигационным компонентом androidx - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь понять, как реализовать контекстную панель действий с помощью компонента навигации 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)
    }

1 Ответ

0 голосов
/ 15 июля 2020

В итоге я использовал обычный 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()
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...