Получите определенный элемент меню внутри onOptionsItemSelected и установите его как SHOW_AS_ACTION_NEVER

У меня есть меню с 4 пунктами меню, и при нажатии одного из них я хочу переместить его наверх (MenuItem.SHOW_AS_ACTION_ALWAYS), а предыдущий выбранный должен опускаться вниз (MenuItem.SHOW_AS_ACTION_NEVER). Мне удалось добавить выбранный элемент наверх, но я не не знаю, как переместить предыдущий выбранный вниз.

Моя идея состояла в том, чтобы получить все остальные и установить их как MenuItem.SHOW_AS_ACTION_NEVER. Я попытался выбрать один такой

  val javaItem = findViewById<MenuItem>(R.id.javaMenuItem)

но он говорит, что ожидает просмотра

Это мое меню

<?xml version = "1.0" encoding = "utf-8"?>
<menu xmlns:app = "http://schemas.android.com/apk/res-auto"
    xmlns:android = "http://schemas.android.com/apk/res/android">

    <item
        android:id = "@+id/javaMenuItem"
        android:title = "@string/javaItem" />
    <item
        android:id = "@+id/pythonMenuItem"
        android:title = "@string/pythonItem" />

    <item
        android:id = "@+id/rubyMenuItem"
        android:title = "@string/rubyItem" />
    <item
        android:id = "@+id/javaScriptItem"
        android:title = "@string/javaScriptItem" />
</menu>

Это то, что я сделал

override fun onOptionsItemSelected(item: MenuItem): Boolean {
        val notSelectedTextView = findViewById<TextView>(R.id.middleTextMessageTextView);
        notSelectedTextView.visibility = View.GONE

        item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
    
            when (item.itemId) {
                R.id.javaMenuItem -> {
                    getDataFromApi("Java")
                    setListView();
                }
                R.id.pythonMenuItem -> {
                    getDataFromApi("Python")
                    setListView();
                }
                R.id.rubyMenuItem -> {
                    getDataFromApi("Ruby")
                    setListView();
                }
                R.id.javaScriptItem -> {
                    getDataFromApi("JavaScript")
                    setListView();
                }
            }
    
            return super.onOptionsItemSelected(item)
        }
1
0
365
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сохранить меню в локальном поле, и для каждого вызова onOptionsItemSelected() вы можете перебирать все пункты меню и устанавливать для них MenuItem.SHOW_AS_ACTION_NEVER

Предполагая, что меню называется R.menu.my_menu, сохраните меню в локальной переменной:

var mMenu: Menu? = null
override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.my_menu, menu)
    mMenu = menu
    return true
}

Затем выполните итерацию по элементам меню, чтобы установить их действие на SHOW_AS_ACTION_NEVER, прежде чем устанавливать щелкнутый элемент на SHOW_AS_ACTION_ALWAYS

override fun onOptionsItemSelected(item: MenuItem): Boolean {
        val notSelectedTextView = findViewById<TextView>(R.id.middleTextMessageTextView);
        notSelectedTextView.visibility = View.GONE

        // iterate over menu items
        for (i in 0 until mMenu?.size()!!) {
            val menuItem: MenuItem = mMenu!!.getItem(i)
            menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER)
        }

        item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
    
            when (item.itemId) {
                R.id.javaMenuItem -> {
                    getDataFromApi("Java")
                    setListView();
                }
                R.id.pythonMenuItem -> {
                    getDataFromApi("Python")
                    setListView();
                }
                R.id.rubyMenuItem -> {
                    getDataFromApi("Ruby")
                    setListView();
                }
                R.id.javaScriptItem -> {
                    getDataFromApi("JavaScript")
                    setListView();
                }
            }
    
            return super.onOptionsItemSelected(item)
        } 

Другие вопросы по теме