• Android 菜单


    菜单的创建并不复杂,关键是要能从整体把握菜单的机制。“坚实的框架”宏观介绍,“详细说明”对一些关键进行说明,“代码示例”帮助理解。

    一,坚实的框架

    res/menu/**.xml , 资源文件,是创建菜单的一种方式,另一种是直接用代码动态添加。

    Activity.onCreateOptionsMenu() ,Activity.onCreateContextMenu(),创建选项菜单和上下文菜单的函数,程序启动时才执行这个函数,所以只能执行一次,如果想更改菜单,要用下一个函数。

    Activity.onPrepareOptionsMenu() ,显式菜单前执行这个函数。(貌似木有onPrepareContextMenu()函数 !!)。

    Activity.onMenuItemSelected(),网上到处都在说执行下面两个函数前先执行这个函数,我试了下,貌似不是这样的。。。难道我错了?

    Activity.onOptionsMenuSelected(),选项菜单的处理。

    Activity.onContextMenuSelected(),上下文菜单的处理。

    Activity.onOptionsMenuClosed,在选项菜单关闭时被调用。

    Activity.onContextMenuClosed,在上下文菜单关闭时调用。

    二,详细说明

    1,getMenuInflater().inflate(args);从资源文件创建菜单。

    2,menu.add(args);动态创建菜单。

    3,item一些重要属性:

    (1).资源文件实现子菜单

    子菜单通过在item元素中嵌套menu来实现。

    复制代码
    <item android:title="系统设置">
    <menu>
    <item android:id="@+id/mi_display_setting"
    android:title
    ="显示设置"/>
    <item android:id="@+id/mi_network_setting"
    android:title
    ="网络设置"/>
    <!-- 别的菜单项 -->
    </menu>
    </item>
    复制代码

    (2).为菜单项添加图标

    <item android:id="@+id/mi_exit"
    android:title
    ="退出"
    android:icon
    ="@drawable/exit"/>

    (3).设置菜单项的可选出现

    使用android:checkableBehavior设置一组菜单项的可选策略,可选值为:none, all, single

    <group android:id="..."
    android:checkableBehavior
    ="all">
    <!-- 菜单项 -->
    </group>

    使用android:checked设置特定菜单项

    <item android:id="..."
    android:title
    ="sometitle"
    android:checked
    ="true"/>

    (4).设置菜单项可用/不可用

    <item android:id="..."
    android:title
    ="sometitle"
    android:enabled
    ="false"/>

    (5).设置菜单项可见/不可见

    <item android:id="..."
    android:title
    ="sometitle"
    android:visible
    ="false"/>

    三,代码示例

    定义菜单的main.xml资源文件

    <menu xmlns:android="http://schemas.android.com/apk/res/android" >
    
        <group 
            android:id="@+id/group1">
            <item
                android:id="@+id/item11"
                android:title="item11"></item>
            <item 
                android:id="@+id/item12"
                android:title="item12"></item>
        </group>
        <group 
            android:id="@+id/group2"
            android:checkableBehavior="all" >  <!-- 改组的所有项都可选 -->
            <item
                android:id="@+id/item_21"
                android:title="item21"
                android:visible="false"></item>  <!-- 该项不可见 -->
            <item 
                android:id="@+id/item22"
                android:title="item22"
                android:enabled="false"></item> <!-- 该项不可用 -->
            <item 
                android:id="@+id/item23"
                android:title="item23"
                android:checked="true"></item>  <!-- 该项已被选中 -->
        </group>
    
    </menu>

    MainActivity.java文件

    package com.example.androidtest;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.util.Log;
    import android.view.ContextMenu;
    import android.view.ContextMenu.ContextMenuInfo;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.View.OnCreateContextMenuListener;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            Button btn = (Button) findViewById(R.id.btn_1);
            btn.setOnCreateContextMenuListener(new OnCreateContextMenuListener(){
                public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
                {
                    //super.onCreateContextMenu(menu, v, menuInfo);
                    CreateMenu(menu);
                }
                
            });
            
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);  // 从xml资源文件创建
            CreateMenu(menu);  // 用代码动态创建
            return true;
        }
        
        @Override
        public boolean onOptionsItemSelected(MenuItem item)
        {
            Log.w("Trace", "onOptionsItemSelected");
            return MenuChoice(item);  
        }
        
        private void CreateMenu(Menu menu)
        {
            MenuItem item1 = menu.add(0, 0, 0, "menu_item_1"); // 用add添加item,返回item
            MenuItem item2 = menu.add(0, 1, 1, "menu_item_2");
            MenuItem item3 = menu.add(0, 2, 2, "menu_item_3");
            MenuItem item4 = menu.add(0, 3, 3, "menu_item_4");
            {
                Intent intent = new Intent(this, MenuActivity.class);
                item4.setIntent(intent);
            }  // 从网上看到说如果不在onOptionsItemSelected()等里面处理事件,就默认用绑定的事件作响应。但是,这里没看到效果
            
        }
        
        private boolean MenuChoice(MenuItem item)
        {
            
            switch( item.getItemId() )
            {
            case 0:
                Toast.makeText(this, "click on menu_item_1", Toast.LENGTH_SHORT).show();
                return true;
            case 1:
                Toast.makeText(this, "click on menu_item_2", Toast.LENGTH_SHORT).show();
                return true;
            case 2:
                Toast.makeText(this, "click on menu_item_3", Toast.LENGTH_SHORT).show();
                return true;
            // 将3的处理使用绑定的活动,但是没效果,不知为什么??
    //        case 3:
    //            Toast.makeText(this, "click on menu_item_4", Toast.LENGTH_SHORT).show();
    //            return true;
            // 对资源文件中的item的处理方法很多,这里使用id,值得注意的是这里的id和用add方法添加的item的id本质相同。
            case R.id.item11:
                Toast.makeText(this, "click on item11 from xml", Toast.LENGTH_SHORT).show(); 
                return true;
            }
            
            return false;
        }
        
    //    @Override
    //    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
    //    {
    //        super.onCreateContextMenu(menu, v, menuInfo);
    //        CreateMenu(menu);
    //    }
        
        @Override
        public boolean onContextItemSelected(MenuItem item)
        {
            Log.w("Trace", "onContextItemSelected");
            switch(item.getItemId() )
            {
            case 0:
                Toast.makeText(this, "menu_item_1 in context menu", Toast.LENGTH_SHORT).show();
                return true;
            case 1:
                Toast.makeText(this, "menu_item_2  in context menu", Toast.LENGTH_SHORT).show();
                return true;
            case 2:
                Toast.makeText(this, "menu_item_3  in context menu", Toast.LENGTH_SHORT).show();
                return true;
            case 3:
                Toast.makeText(this, "menu_item_4  in context menu", Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
    
    
    }
  • 相关阅读:
    javaWeb快速入门+——初体验-HelloWorld
    简单理解Linux系统的挂载是什么鬼
    STM32MP157 Cortex®-M4高性能系列MCU
    常见六种锂电池特性及参数对比
    IIC通信详解
    stm32微秒延时问题
    STM32 HAL库实现微秒级别延时
    开关电源波纹的产生、测量及抑制
    图解DIY 1pA超微电流测试器
    stm32
  • 原文地址:https://www.cnblogs.com/wolf-bing/p/3149492.html
Copyright © 2020-2023  润新知