11 OptionsMenu 菜单

时间:2023-03-09 00:54:01
11 OptionsMenu 菜单

OptionsMenu 选项菜单(系统菜单 )

  • OptionsMenu:系统级别菜单

    菜单的使用步骤:

    1. res里的menu里添加布局 在布局里写菜单项

    2. 在逻辑代码中使用OnCreateOptionMenu()方法 将布局展示到菜单

    3. 监听菜单项 onOptionsItemSelected() 方法进行监听
  • 注意若设置图片不显示那么打破封装性修改源码
    • 案例
      • 代码
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item
android:icon="@drawable/ic_launcher"
android:orderInCategory="1"
android:showAsAction="never"
android:title="我设置图片,但没有显示">
<menu>
<item
android:icon="@drawable/ic_launcher"
android:orderInCategory="1"
android:showAsAction="never"
android:title="设置图片的子菜单1"/>
<item
android:orderInCategory="2"
android:showAsAction="never"
android:title="沒有设置图片的子菜单2"/>
</menu>
</item> </menu>

效果图

11 OptionsMenu 菜单

11 OptionsMenu 菜单

解决办法如下

package com.fmy.menu1;

import java.lang.reflect.Method;

import com.fmy.menu1.R;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.TextView; public class MainActivity extends Activity { private TextView tv; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView)findViewById(R.id.tv); } @Override
public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.layout, menu); //设置开启图片有效
setIconEnable(menu,true); return super.onCreateOptionsMenu(menu);
} //enable为true时,菜单添加图标有效,enable为false时无效。4.0+系统默认无效
private void setIconEnable(Menu menu, boolean enable)
{
try
{
Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");
Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);
m.setAccessible(true); //MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征)
m.invoke(menu, enable); } catch (Exception e)
{
e.printStackTrace();
}
} }

  • XML中的一些属性
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.fmy.menu.MainActivity" > <!--
android:orderInCategory 排序 数值越大排到越后面 不设置按添加顺序
android:icon设置图标
android:title设置标题
android:showAsAction设置展示方法
值:
always永远展示在顶部 超出部分不显示
"ifRoom"如果有顶部有空间 那么展示 不然缩略在...
never永远不展示 缩略在控件中
注意:在顶部显示的item 在按菜单键menu键时不显示
-->
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="never"
android:icon="@drawable/ic_launcher"
android:title="a"/> </menu>

  • 案例1:

    如果showAsAction设置为always 超出部分会怎么样

    • 代码:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item
android:orderInCategory="2"
android:showAsAction="always" android:title="2"/>
<item
android:orderInCategory="1"
android:showAsAction="always" android:title="1"/>
<item
android:orderInCategory="3"
android:showAsAction="always" android:title="3"/>
<item
android:orderInCategory="4"
android:showAsAction="always" android:title="4"/>
<item
android:orderInCategory="5"
android:showAsAction="always" android:title="5"/>
<item
android:orderInCategory="6"
android:showAsAction="always" android:title="6"/>
<item
android:orderInCategory="7"
android:showAsAction="always" android:title="7"/> </menu>

11 OptionsMenu 菜单


  • 案例2

    用代码注册按钮 和在xml中设置子菜单按钮

  • 在xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item
android:orderInCategory="2"
android:showAsAction="always"
android:title="2">
<menu>
<!--方式一:在item中嵌套一个menu 后直接再写一个item -->
<item
android:orderInCategory="2"
android:showAsAction="always"
android:title="我是item-menu-item"/> <!--方式二:在item中嵌套一个menu在放置group 后直接再写一个item -->
<group>
<item
android:orderInCategory="2"
android:showAsAction="always"
android:title="我是item-menu-group-item"/>
</group>
</menu>
</item> </menu>

11 OptionsMenu 菜单

  • java代码:
package com.fmy.menu1;

import java.lang.reflect.Method;

import com.fmy.menu1.R;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.TextView; public class MainActivity extends Activity { private TextView tv; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView)findViewById(R.id.tv); } @Override
public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.layout, menu);
/**
* groupId --->> group的id值 即:放入哪个分组中
* itemId --->> 为这个item设置一个id 以后在监听中可用到
* order --->> 顺序
* title --->> 标题
*/
SubMenu sub = menu.addSubMenu(menu.NONE, 1, menu.NONE, "2");
sub.setIcon(R.drawable.ic_launcher);
sub.addSubMenu(1, 2, menu.NONE, "呵呵");
sub.addSubMenu(1, 2, menu.NONE, "哈哈");
SubMenu addSubMenu = menu.addSubMenu("嘿嘿");
addSubMenu.addSubMenu("嘿嘿下的子菜单");
sub.addSubMenu(menu.NONE, 2, menu.NONE, "你好朋友"); return super.onCreateOptionsMenu(menu);
} }

11 OptionsMenu 菜单

11 OptionsMenu 菜单


  • 案例3

监听事件

  • xml 代码:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item
android:icon="@drawable/ic_launcher"
android:orderInCategory="1"
android:id="@+id/root"
android:showAsAction="never"
android:title="我设置图片,但没有显示">
<menu>
<item
android:icon="@drawable/ic_launcher"
android:orderInCategory="1"
android:showAsAction="never"
android:id="@+id/boy1"
android:title="设置图片的子菜单1"/>
<item
android:id="@+id/boy2"
android:orderInCategory="2"
android:showAsAction="never"
android:title="沒有设置图片的子菜单2"/>
</menu>
</item> </menu>
  • java代码:
package com.fmy.menu1;

import java.lang.reflect.Method;

import com.fmy.menu1.R;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast; public class MainActivity extends Activity { private TextView tv; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView)findViewById(R.id.tv); } @Override
public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.layout, menu); //设置开启图片有效
setIconEnable(menu,true); return super.onCreateOptionsMenu(menu);
} //enable为true时,菜单添加图标有效,enable为false时无效。4.0+系统默认无效
private void setIconEnable(Menu menu, boolean enable)
{
try
{
Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");
Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);
m.setAccessible(true); //MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征)
m.invoke(menu, enable); } catch (Exception e)
{
e.printStackTrace();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.root:
Toast.makeText(this, "root", 0).show();
break;
case R.id.boy1:
Toast.makeText(this, "boy1", 0).show();
break;
case R.id.boy2:
Toast.makeText(this, "boy2", 0).show();
break; default:
break;
}
return super.onOptionsItemSelected(item);
} }