今天在使用 Toolbar 时,需要在 Toolbar 上显示 Menu,但是遇到一些问题,记录一下。
究竟是用哪个方法来 inflate Menu 呢?
- 在 onCreate 中调用 Toolbar 的 inflateMenu() 方法?
- Toolbar.inflateMenu(int menuResId);
- 在 onCreateOptionsMenu 中调用 Activity 的 getMenuInflater().inflate() 方法?
- Activity.onCreateOptionsMenu(Menu menu)
答案在 stackoverflow 这里。
当你将 Toolbar 作为普通的布局控件(View)来使用时,使用第一种:Toolbar.inflateMenu(int menuResId)。
这时候 Toolbar 仅仅是 Activity 中一个普通的独立 View,就像 Button、RelativeLayout 一样的 View 而已,并不是一个 Actionbar。这就跟 Activity 本身不存在任何联系,所以不能通过 Activity 中的方法进行 inflate menu,只能使用 Toolbar 自身的 inflateMenu() 方法。
当你将 Toolbar 作为 ActionBar (调用了 setActionBar() 或 setSupportActionBar())时,使用 Toolbar 的 inflateMenu() 方法是无效的,只能使用第二种方法,而这也是推荐使用的方法。
注意事项
在使用 Toolbar 时,有很多方法在调用时,都需要注意上面所说的两种情况。比如:
Toolbar 上的点击事件,Toolbar 提供是 (setNavigationOnClickListener)[] 和 (setOnMenuItemClickListener)[] 来分别监听导航按钮和菜单项的点击事件,而 Activity 也给 ActionBar 提供了 (onOptionsItemSelected)[] 回调方法。
但是 Toolbar 提供的两个方法和 Activity 的方法是不能公用的,只能选择其一,要么使用 Toolbar 的两个方法,要么使用 onOptionsItemSelected()。
另外,ActionBar 不是继承自 View 的,它是直接继承自 Object 的一个抽象类。