11 OptionsMenu 菜单

来源:互联网 发布:js 除去空格 换行符 编辑:程序博客网 时间:2024/05/20 04:30

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>

效果图
设置图片但没有显示的根图
设置了效果图的子按钮

解决办法如下

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>

案例一


  • 案例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>

案例二xml中的效果图

  • 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);    }}

java代码生成的效果图1
java代码生成的效果图1



  • 案例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);    }}
2 0
原创粉丝点击