Android第二十一天Menu

Menu :

概念:

1、Android应用中的菜单默认是隐藏的,只有当用户点击手机上的MENU键,系统才会显示菜单。这种菜单叫做选项菜单(Option Menu)。

2、从3.0开始,Android不要求手机设备上必须提供MENU按键。因此Android推荐使用ActionBar来代替Menu。


分类:

1.OptionsMenu 按手机Menu弹出的菜单,选项菜单

2.ContextMenu 长按绑定UI控件弹出的菜单

3.PopupMenu 指在UI控件的上方或者下方弹出的菜单,与UI控件绑定

OptionsMenu:

    一、重写

        在Activity中重写方法:创建一个上下文菜单

    

public boolean onCreateOptionsMenu(Menu menu) {

        在Activity中重写方法:上下文菜单项监听

     

public boolean onOptionsItemSelected(MenuItem item) {

    二、添加菜单项:

        1.代码添加:

    

/**
 * Activity中重写该方法 :创建选项菜单
 *
 * @param menu
 * @return
 */
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    /**
     * Menu  菜单:
     * add方法 参数1GroupId 分组Id
     *         参数2: 当前条目的id
     *         参数3: 顺序
     *         参数4: 显示的文本
     */
    MenuItem item0 = menu.add(1, 0, 0, "改变字体大小");
    item0.setIcon(R.mipmap.ic_launcher);//该效果可能显示不出来
    item0.setTitle("呵呵");//替代add方法中的第四个参数

    MenuItem item1 = menu.add(1, 1, 0, "改变字体颜色");
    MenuItem item2 = menu.add(1, 2, 0, "改变文本");
    MenuItem item3 = menu.add(1, 3, 0, "改变背景色");
  
    return super.onCreateOptionsMenu(menu);
}


        2.布局添加:

 在res/menu/文件夹下创建xml资源文件: 右键res创建directory命名为menu:



            定义菜单资源:

            根标签必须是menu  

<menu


            选择项:

<?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">

    <!--title 是必须必备的属性-->
    <item
        android:id="@+id/item1"
        android:title="如果有空间"
        android:icon="@mipmap/ic_launcher"
        android:orderInCategory="2"
        app:showAsAction="ifRoom"></item>
    <item
        android:id="@+id/item2"
        android:title="0"
        app:showAsAction="always"></item>
    <item
        android:id="@+id/item21"
        android:title="1"
        app:showAsAction="always"></item>
    <item
        android:id="@+id/item22"
        android:title="3"
        app:showAsAction="always"></item>
    <item
        android:id="@+id/item23"
        android:title="2"
        app:showAsAction="always"></item>
    <item
        android:id="@+id/item3"
        android:title="不再"
        app:showAsAction="never"></item>


</menu>

            showAsAction说明:


        在布局中调用

    

/**
 * Activity中重写该方法 :创建选项菜单
 *
 * @param menu
 * @return
 */
@Override
public boolean onCreateOptionsMenu(Menu menu) {
   
    getMenuInflater().inflate(R.menu.menu1,menu);
    return super.onCreateOptionsMenu(menu);
}


       3. 监听器:在重写方法中进行

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case 0:
            //改变字体大小
            showTv.setTextSize(50);
            break;
        case 1:
            //改变字体颜色
            showTv.setTextColor(Color.BLUE);
            break;
        case 2:
            //改变文本
            showTv.setText("王智勇,你将不是我的大宝贝了!");
            break;
        case 3:
            //改变背景
            showTv.setBackgroundColor(Color.MAGENTA);
            break;
        case R.id.item21:
            Toast.makeText(this, "你在吗1", Toast.LENGTH_SHORT).show();
            break;
        case R.id.item22:
            Toast.makeText(this, "你在吗2", Toast.LENGTH_SHORT).show();
            break;
        case R.id.item23:
            Toast.makeText(this, "你在吗3", Toast.LENGTH_SHORT).show();
            break;
        case R.id.item1:
            Toast.makeText(this, "你在吗4", Toast.LENGTH_SHORT).show();
            break;
    }
    return super.onOptionsItemSelected(item);
}



ContextMenu:上下文菜单

    概念:当长按某个UI视图的时候弹出显示的菜单!使用的时候需要首先调用方法:    

//一定要注册  为这个视图注册  注册时候 长按这个视图的时候就会打开上下文菜单
registerForContextMenu(showTv);


    一、重写方法:需要注意:OptionsMenu重写的是onCreateOptionsMenu 与这个不同!

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
public boolean onContextItemSelected(MenuItem item) {

    二、添加菜单项:

    1.代码添加:

/**
 * 创建 上下文菜单
 *
 * @param menu
 * @param v
 * @param menuInfo
 */
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
   

    /**
     * 在代码中动态添加菜单选项
     * 参数1  GroupId
     * 参数2  当前的 选项的id
     * 参数3  顺序 可以使用0 也可以用 Menu.NONE
     * 参数4  显示的标题
     */
    menu.add(1, 1, Menu.NONE, "改变背景");
    menu.add(1, 2, 0, "切换页面");

    //动态的添加子菜单
    SubMenu subMenu = menu.addSubMenu("我有子菜单");
    //向子菜单中添加选择项
    subMenu.add(2, 3, 0, "王智勇");
    subMenu.add(2, 4, 0, "放学别走");
    subMenu.add(2, 5, 0, "操场等我!");
}


    2.资源文件添加:在res/menu文件夹下创建资源menu1.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/item_size"
        android:title="改变字体大小"></item>
    <item
        android:id="@+id/item_color"
        android:title="改变字体颜色"></item>
    <!--子菜单-->
    <item
        android:id="@+id/item_child"
        android:title="打开子菜单">
        <menu>
            <item
                android:id="@+id/item_child1"
                android:title="子菜单1"></item>
            <item
                android:id="@+id/item_child2"
                android:title="子菜单2"></item>
        </menu>
    </item>
</menu>


    在代码中需要调用:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    //Menu的文件加载到上下文菜单对象
    getMenuInflater().inflate(R.menu.menu1, menu);
}

    3.监听器    :

/**
 * 监听上下文菜单的点击事件
 *
 * @param item
 * @return
 */
@Override
public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.item_size:
            showTv.setTextSize(30);
            break;
        case R.id.item_color:
            showTv.setTextColor(Color.CYAN);
            break;
        case R.id.item_child1:
            Toast.makeText(this, "这是子菜单1", Toast.LENGTH_SHORT).show();
            break;
        case R.id.item_child2:
            Toast.makeText(this, "这是子菜单2", Toast.LENGTH_SHORT).show();
            break;
        case 1:
            //改变背景
            showTv.setBackgroundColor(Color.MAGENTA);
            break;
        case 2:
            //切换页面
            Toast.makeText(this, "切换页面", Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(this, SecondActivity.class);
            startActivity(intent);
            break;
        case 3:
            Toast.makeText(this, "王智勇", Toast.LENGTH_SHORT).show();
            break;
        case 4:
            Toast.makeText(this, "放学你别走", Toast.LENGTH_SHORT).show();
            break;
        case 5:
            Toast.makeText(this, "操场等我", Toast.LENGTH_SHORT).show();
            break;
    }
    return super.onContextItemSelected(item);
}


    ListView结合ContextMenu使用:

    

private ListView listView;
private List<String> list = new ArrayList<>();
private ArrayAdapter<String> adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);
    //初始化数据
    initData();
    //初始化视图
    listView = (ListView) findViewById(R.id.listView);
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, list);
    listView.setAdapter(adapter);
    //注册 listView
    registerForContextMenu(listView);
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.add(1, 0, 0, "添加一条数据");
    menu.add(1, 1, 0, "删除一条数据");
    menu.add(1, 2, 0, "修改一条数据");
    menu.add(1, 3, 0, "查询一条数据");
}

@Override
public boolean onContextItemSelected(MenuItem item) {

    // 根据MenuItem获取MenuInfo对象并强制类型转换成为AdapterContextMenuInfo
    AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
    //根据AdapterContextMenuInfoposition属性来获取当前长按第几个条目弹出的菜单
    int position = menuInfo.position;
    switch (item.getItemId()) {
        case 0:
            //增加一条数据
            list.add(position, "我是一条增加的数据");
            adapter.notifyDataSetChanged();
            break;
        case 1:
            //删除一条数据
            list.remove(position);
            adapter.notifyDataSetChanged();
            break;
        case 2:
            //修改一条数据
            list.set(position, "我是一条修改后的数据");
            adapter.notifyDataSetChanged();
            break;
        case 3:
            //查询一条数据
            Toast.makeText(this, list.get(position), Toast.LENGTH_SHORT).show();
            break;
    }


    return super.onContextItemSelected(item);

}

//初始化数据
private void initData() {
    for (int i = 0; i < 100; i++) {
        list.add("这是第: " + i + " 条数据");
    }
}

PopupMenu:

指在UI控件的上方或者下方弹出的菜单,与UI控件绑定

 //实例化弹出菜单对象   参数2表示的是与那个视图的位置进行绑定
        PopupMenu popupMenu = new PopupMenu(this, showBt);
        //获取弹出菜单对象
        Menu menu = popupMenu.getMenu();
        menu.add(1, 0, 0, "添加");
        menu.add(1, 1, 0, "删除");
        //设置菜单监听器
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()) {
                    case 0:
                        Toast.makeText(MainActivity.this, "添加", Toast.LENGTH_SHORT).show();
                        break;
                    case 1:
                        Toast.makeText(MainActivity.this, "删除", Toast.LENGTH_SHORT).show();
                        break;
                }
                return false;
            }
        });
        //将菜单对象展示出来
        popupMenu.show();
        //将菜单对象消失
//        popupMenu.dismiss();






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值