菜单资源文件通常放置在res\menu目录下,在创建项目时,默认不自动创建menu目录,所以需手动创建。
Android Resource Directory→ value menu
或在创建根元素为标记的xml文件对自动气建眼
res→Android Resounce File →Resource type→menu
子元素为
andraid:id 设置ID,也就是唯一标识。
android:title 设置标题。
android:alphabeticShortcut 指定字符快捷键。
android:numericShortcut 指定数字快捷键。
android:enabled 是否可用。
android:checkable 是否可选。
android:visible 是否可见。
android:checked 是否已选用。
android:icon 指定图标,需重写onMenuOpened方法并在其中调用设置显示图标才会在列表项中显示图标(重写方法)。
app: showAsAction 该属性用于溢出菜单,控制菜单项在导航栏上展示位置。值可为:
always 总是在导航栏上显示菜单图标。
ifRoom 如果导航栏右侧有空间,该项就直接显示在导航栏上,不再放入溢出菜单。
never 从不在导航栏上显示,一直放在溢出菜单列表中。
withText 如果能在导航栏上显示,除了显示图标还要显示该项的文字说明。
collapseActionView 操作视图要折叠为一个按钮,点击该按钮再展示操作视图主要用于Searchview。
android:id 为菜单组设置ID。
android:checkableBehavior 指定菜单组选择行为,值可为none(不可选)、all(多选)、single(单选)。
android:menuCategory 对某单组进行分类,指定优先级,值可为container、system、secondary和alternative
android:enable 指定该菜单组中全部 单项是否可用
android:visible 指定该菜单组中全部某单项是否可见
长按注册的控件显示菜单。
public class MainActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { ... ... TextView textView=findViewById(R.id.textView); registerForContextMenu(textView); } public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { //用于创建菜单(上下文菜单) MenuInflater menuInflater=new MenuInflater(this); menuInflater.inflate(R.menu.test,menu); } public boolean onContextItemSelected(MenuItem item) { //用于选择菜单项(上下文菜单) int id=item.getItemId(); if(id==R.id.~){ ~ } return true; } } 2. 选项菜单点击标题栏或工具栏最右侧三个点显示菜单
如果隐藏标题栏ActionBar且没有使用工具栏ToolBar(app:menu)将无法使用。
使用ToolBar时要使用 setSupportActionBar( toolBar) 将工具栏设为操作栏,且为ToolBar的app:menu属性赋值。
public class MainActivity extends AppCompatActivity { public boolean onCreateOptionsMenu(Menu menu) { //用于创建菜单(选项菜单/溢出菜单) MenuInflater menuInflater=new MenuInflater(this); menuInflater.inflate(R.menu.test,menu); return true; } public boolean onOptionsItemSelected(MenuItem item) { //用于选择菜单项(选项菜单/溢出菜单) int id=item.getGroupId(); if(id==R.id.~){ ~ } return true; } } 3. 溢出菜单溢出菜单和选项菜单并无较大差别,均是点击标题栏ActionBar或工具栏ToolBar最右侧三个点显示菜单。
如果隐藏标题栏ActionBar且没有使用工具栏ToolBar(app:menu)将无法使用。
使用ToolBar时要使用 setSupportActionBar( toolBar) 将工具栏设为操作栏,且为ToolBar的app:menu属性赋值。
菜单栏默认不在某单列表中显示图标;可制作自定义方法来使其显示图标。
//用于使菜单项在列表中显示图片的自定义方法 class MyMenuUtil{ public static void setOverflowIconVisible(int featureId,Menu menu){ //ActionBar的featureId是8,ToolBar的featureId是108 if(featureId%100== Window.FEATURE_ACTION_BAR&&menu!=null){ if(menu.getClass().getSimpleName().equals("MenuBuilder")){ try { //setOptionalIconsVisible是隐藏方法,需要反射机制调用。 Method m=menu.getClass().getDeclaredMethod("setOptionalIconsVisible",Boolean.TYPE); m.setAccessible(true); m.invoke(menu,true); } catch (Exception e){ e.printStackTrace(); } } } } } public class MainActivity extends AppCompatActivity { public boolean onMenuOpened(int featureId, Menu menu) { //打开菜单时调用 //设置在菜单栏中显示图标 MyMenuUtil.setOverflowIconVisible(featureId,menu); return super.onMenuOpened(featureId, menu); } public boolean onCreateOptionsMenu(Menu menu) { //用于创建菜单(溢出菜单/选项菜单) MenuInflater menuInflater=new MenuInflater(this); menuInflater.inflate(R.menu.test,menu); return true; } public boolean onOptionsItemSelected(MenuItem item) { //用于选择菜单项(溢出菜单/选项菜单) int itemId=item.getItemId(); int groupId=item.getGroupId(); if(itemId==R.id.~){ ~ } return true; } }