onOptionsItemSelected не работает во фрагменте - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь поместить меню в один из моих фрагментов ViewPager. При нажатии на один из параметров действия не выполняются, закрывается только меню. Я искал другие вопросы здесь, на StackOverFlow, но они мне мало помогли. Как я могу исправить эту ошибку?

class CFragment : Fragment() {

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

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {

        // Inflate the layout for this fragment
        val view = inflater.inflate(R.layout.fragment_c, container, false)
        val toolbar = view.findViewById(R.id.toolbarCFragement) as Toolbar
        toolbar.inflateMenu(R.menu.menu_c)


        //...

return view
    }

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


    override fun onOptionsItemSelected(item: MenuItem): Boolean {

        if (item.itemId == R.id.optionOne) {
            Toast.makeText(requireActivity(), "One", Toast.LENGTH_SHORT).show()
            return true
        } else if (item.itemId == R.id.optionTwo) {
            startActivity(Intent(requireActivity(), Members::class.java))
            return true
        } else if (item.itemId == R.id.optionThree) {
            Toast.makeText(requireActivity(), "Three", Toast.LENGTH_SHORT).show()
            return true
        }else{
            return super.onOptionsItemSelected(item)
        }
    }
}

Меню:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/optionOne"
        app:showAsAction="never"
        android:title="@string/optionOne">
    </item>
    <item android:id="@+id/optionTwo"
        android:title="@string/optionTwo">
    </item>
    <item android:id="@+id/optionThree"
        android:title="@string/optionThree">
    </item>
</menu>

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Когда вы пытаетесь надуть пункты меню в макете панели инструментов, сделайте это.

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {

        // Inflate the layout for this fragment
        val view = inflater.inflate(R.layout.fragment_c, container, false)
        val toolbar = view.findViewById(R.id.toolbarCFragement) as Toolbar
        toolbar.inflateMenu(R.menu.menu_c)
        toolbar.setOnMenuItemClickListener { item ->
            when (item.itemId) {
                R.id.optionOne -> {
                                       Toast.makeText(requireActivity(), "One", 
                                       Toast.LENGTH_SHORT).show()
                                       }
                R.id.optionTwo -> {
                                       startActivity(Intent(requireActivity(), 
                                       Members::class.java))
                                       }
              // your reset case
            }
            true
        }
      return view
    }

Нет необходимости переопределять

onCreateOptionsMenu
1 голос
/ 11 октября 2019

Я не знаю вашу тему приложения или файлы макета, но проблема может заключаться в том, что вы надуваете свою панель инструментов:

val toolbar = view.findViewById(R.id.toolbarCFragement) as Toolbar
toolbar.inflateMenu(R.menu.menu_c)

Далее, в коде, который вы делаете:

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

Это также раздувает ваше меню. При переопределении удовольствия onOptionsItemSelected (item: MenuItem): Boolean работает только для второго меню, которое может находиться под вашей надутой панелью инструментов. Вы не устанавливаете onMenuItemClickListener на своей панели инструментов.

Поэтому, если вы хотите использовать панель инструментов, которую вы надуваете в onCreateView, вы должны реализовать:

toolbar.setOnMenuItemClickListener { /*TODO*/ }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...