【android编程】 第六讲-Android菜单布局及使用

第六讲Android菜单

实验题Code链接:https://blog.csdn.net/xbean1028/article/details/104800456

1.定义菜单资源文件

res/menu目录建立xml文件包含一下几个元素:

<menu>:定义一个Menu,是一个菜单资源文件的根节点,里面可以包含一个或者多个<item>和<group>元素。

<item>:创建一个MenuItem,代表了菜单中一个选项。

<group>:对菜单项进行分组,可以以组的形式操作菜单项。

元素除了常规的id、icon、title属性的支持,还有一个重要的属性:android:showAsAction,这个属性是起兼容性的,描述了在Android的高版本中,菜单项何时以何种方式加入到ActionBar中。

是对菜单进行分组,分组后的菜单显示效果并没有区别,唯一的区别在于可以针对菜单组进行操作,这样对于分类的菜单项,操作起来更方便,提供如下的操作:

  • Menu.setGroupCheckable():菜单组内的菜单是否都可选。
  • Menu.setGroupVisible():是否隐藏菜单组的所有菜单。
  • Menu.setGroupEnabled():菜单组的菜单是否有用。

如果菜单项需要单选或者多选,可以使用android:checkableBehavior属性设置,它可以对单个或者设置一个组,这个属性接受三个参数:single,单选;all,多选,none,没有Checked的选项,默认。

当创建好一个XML菜单资源文件之后,可以使用MenuInflater.inflate()方法填充菜单资源,使XML资源变成一个可编程的对象。

属性

android:id
定义资源ID,它是个唯一值,使用“@+id/name”格式可以给这个菜单项创建一个新的资源ID,“+”号指示要创建一个新的ID。

android:title
字符串资源,它用字符串资源或原始的字符串来定义菜单的标题。

android:titleCondensed
字符串资源。它用字符串资源或原始的字符串来定义一个简要的标题,以便在普通的标题太长时来使用。

android:icon
可绘制资源,它定义了一个菜单项所要使用的图标。

android:onClick
方法名。在这个菜单项被点击时,会调用这个方法。在Activity中,这个方法必须用public关键字来声明,并且只接受一个MenuItem对象,这个对象指明了被点击的菜单项。这个方法会优先标准的回调方法:onOptionsItemSelected()。

android:showAsAction
关键词。它定义这个项目作为操作栏中的操作项的显示时机和方式。只用Activity包含了一个ActionBar对象时,菜单项才能够作为操作项来显示。这个属性在API级别11中被引入,有效值如下:

说明
ifRoom 如果有针对这个项目的空间,则只会把它放到操作栏中
withText 操作项也要包含文本(通过android:title属性来定义的)。可以把这个值与其他的Flag设置放到一起,通过管道符“|”来分离它们。
never 这个项目不会放到操作栏中
always 始终包这个项目放到操作栏中。要避免使用这个设置,除非在操作栏中始终显示这个项目是非常关键的。设置多个项目作为始终显示的操作项会导 致操作栏中其他的UI溢出。
icollapseActiionView 它定义了跟这个操作项关联的可折叠的操作View对象(用android:actionViewLayout来声明)。

android:actionViewLayout
它引用一个布局资源,这个布局要用于操作窗口。更多的信息请参照“操作栏”开发指南。这个属性在API级别11中被引入。

android:actionViewClass
类名。它定义了操作窗口要使用的View对象的完整的类名。例如,“android.widget.SearchView”说明操作窗口要使用的SearchView类。

android:actionProviderClass
类名,它是操作项目所使用的ActionProvider类的完整的类名。例如,“android.widget.ShareActionProvider”说明要使用 ShareActionProvider类。

android:alphabeticShortcut
字符,定义一个字符快捷键

android:numericShortcut
数字值,定义一个数字快捷键

android:checkable
布尔值,如果菜单项是可以复选的,那么就设置为true。

android:checked
布尔值,如果复选菜单项默认是被选择的,那么就设置为true。

android:visible
布尔值,如果菜单项默认是可见的,那么就设置为true。

android:enabled
布尔值,如果菜单项目默认是可用的,那么就设置为true。

android:menuCategory
关键词。它的值对应了定义菜单项优先级的CATEGORE_*常量,有效值如下:

说明
container 菜单项是容器的一部分
system 菜单项是由系统提供的。
secondary 提供给用户的辅助选择的菜单项(很少使用)
alternative 基于当前显示的数据来选择操作的菜单项。

android:orderInCategory
整数值,它定义菜单项在菜单组中的重要性的顺序。

它定义了一个菜单组(它是一个具有共同特征的菜单项的组合,如菜单项的可见性、可用性或可复选性)。它要包含多个元素,而且必须是 元素的子元素。

android:checkableBeharior
关键词。针对菜单组的可复选行为的类型。有效值如下:

说明
none 没有可复选性
all 组内的所有的项目都被复选(使用复选框)
single 仅有一个项目能够被复选(使用单选按钮)

android:visible
布尔值,如果菜单组是可见的,就设置为true。

android:enabled
布尔值,如果菜单组是可用的,就设置为true。

android:menuCategory
关键词。它的值对应了Menu类的CATEGORY_*常量,定义了菜单组的优先级。有效值如下:

说明
container 菜单组是容器的一部分
system 菜单组是由系统提供的。
secondary 提供给用户的辅助选择的菜单组(很少使用)
alternative 基于当前显示的数据来选择操作的菜单组。

android:orderInCategory
整数值,它定义了分类中菜单项目的默认顺序。

2.选项菜单

一个完整示例:https://blog.csdn.net/xbean1028/article/details/104800456

  1. 第一步创建选项菜单的选项卡xml

  2. 在Java文件中重写onCreateOptionsMenu方法,导入menu布局文件

    @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main_menu,menu);
            return true;
        }
    
    
  3. 在Java文件中重写onOptionsItemSelected方法,为每个选项添加监听事件

    @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()){
                case R.id.menu_login:
                    Toast.makeText(this,"登陆", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.menu_setting:
                    Toast.makeText(this,"设置", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.menu_exit:
                    Toast.makeText(this,"退出", Toast.LENGTH_SHORT).show();
                    break;
                default:
                    break;
            }
            return super.onOptionsItemSelected(item);
        }
    
    
    1. 上述方法适用于需要用到选项菜单的活动很多的情况,如果只有少数几个活动需要用到选项菜单,则可在Java文件中重写onCreateOptionsMenu时使用menu的add (int groupId, int itemId, int order, int titleRes)方法,直接添加所需要的选项。
      参数描述:
      groudId:int型,是指组ID,用以批量地对菜单子项进行处理和排序
      itemId:int型,是子项ID,是每一个菜单子项的唯一标识
      order:int型,是指定菜单子项在选项菜单中的排列顺序
      titlerRes:String型,是指选项的文本显示内容
    @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            menu.add(0,1,0,"add登陆");
            menu.add(0,2,1,"add设置");
            menu.add(0,3,3,"add退出");
            return true;
        }
    

    参考链接:

    https://blog.csdn.net/qq_43359613/article/details/82970209
    https://blog.csdn.net/wanghao200906/article/details/41309285

3. 上下文菜单(长按)

一个完整示例:https://blog.csdn.net/xbean1028/article/details/104800456

1.首先给View注册上下文菜单registerForContextMenu();

ListView listview = (ListView) findViewById(R.id.listview);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,getData());
        listview.setAdapter(adapter);
        this.registerForContextMenu(listview);
//为按钮注册contextMenu,当你长按按钮的时候就会调用onCreateContextMenu方法
        registerForContextMenu(button);

2.添加上下文菜单内容onCreateContextMenu():

—可以通过代码动态添加;

public void onCreateContextMenu(ContextMenu menu,View v,ContextMenuInfo menuInfo){
        super.onCreateContextMenu(menu,v,menuInfo);
        //设置Menu显示内容
        menu.setHeaderTitle("文件操作");
        menu.setHeaderIcon(R.drawable.ic_launcher);
        menu.add(1,1,1,"复制");
        menu.add(1,2,1,"粘贴");
        menu.add(1,3,1,"剪切");
        menu.add(1,4,1,"重命名");
    }

menu.add(1,1,1,“复制”);参数解读: https://blog.csdn.net/xbean1028/article/details/104799163

—可以加载xml文件中的菜单项;

@Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
      
        getMenuInflater().inflate(R.menu.basic_main, menu);
        //设置标题栏的图标
        menu.setHeaderIcon(R.drawable.ic_launcher);
        //设置标题栏的文字
        menu.setHeaderTitle("请选择操作");
    }

3.设置菜单点击后响应事件onContextItemSelected();

@Override
    public boolean onContextItemSelected(MenuItem item){
        switch(item.getItemId()){
        case 1:
            Toast.makeText(MainActivity.this,"点击复制",Toast.LENGTH_SHORT).show();
            break;
        case 2:
            Toast.makeText(MainActivity.this,"点击粘贴",Toast.LENGTH_SHORT).show();    
            break;
        case 3:
            Toast.makeText(MainActivity.this,"点击剪切",Toast.LENGTH_SHORT).show();    
            break;
        case 4:
            Toast.makeText(MainActivity.this,"点击重命名",Toast.LENGTH_SHORT).show();    
            break;
        }
    return super.onContextItemSelected(item);
    }
@Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.add:
                Toast.makeText(this, "你点击了添加!", 1).show();
                break;
            case R.id.delete:
                Toast.makeText(this, "你点击了删除!", 1).show();
                break;
            case R.id.update:
                Toast.makeText(this, "你点击了修改!", 1).show();
                break;
            case R.id.query:
                Toast.makeText(this, "你点击了查询!", 1).show();
                break;
        }
        return true;
    }

参考链接:

https://www.cnblogs.com/guojinyu/p/6664746.html

https://www.cnblogs.com/wuyou/p/3704924.html

4.带子菜单的选项菜单

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/item1"
        android:alphabeticShortcut="g"
        android:title="更换背景"></item>
    <item
        android:id="@+id/item2"
        android:alphabeticShortcut="e"
        android:title="参数设置">
        <menu>
            <group android:id="@+id/setting" android:checkableBehavior="all">
                <item android:id="@+id/sound" android:title="使用背景"></item>
                <item android:id="@+id/video" android:title="背景音乐"></item>
            </group>
        </menu>
    </item>
<item android:id="@+id/item3" android:title="恢复默认" android:alphabeticShortcut="r"></item>
</menu>
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = new MenuInflater(this);
        inflater.inflate(R.menu.optionmenu, menu);
        return super.onCreateOptionsMenu(menu);
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getGroupId() == R.id.setting) {
            if (item.isChecked()) {
                item.setChecked(false);
            } else {
                item.setChecked(true);
            }
        }

        if (item.getItemId() != R.id.item2) {
            Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show();
        }
        return super.onOptionsItemSelected(item);
    }
}

5. 题目记录

  1. 对于菜单下列说法不正确的是 C

    得分/总分

    • A.菜单资源文件通常放在res/menu目录下
    • B.Android的菜单可以用两种方法创建
    • C.Android默认自动创建菜单1.00/1.00
    • D.菜单资源使用 标记
  2. 菜单的的标题属性是 A

    得分/总分

    • A.android:title1.00/1.00
    • B.android:Label
    • C.android:caption
    • D.android:text
  3. 为菜单项指定快捷键的属性是 D

    得分/总分

    • A.android:ShortKey
    • B.Shortcut
    • C.android:accelerator_key
    • D.android:alphabeticShortcut
  4. 菜单的图标属性是 C

    得分/总分

    • A.android:image
    • B.android:drawable
    • C.android:icon1.00/1.00
    • D.android:picture
  5. 对于group标记下列说法正确的是 C

    得分/总分

    • A.将菜单组成一个选项 000
    • B.成组的菜单项会堆叠 000
    • C.成组的菜单会有某些共同的属性
    • D.创建子菜单 000
  6. 选项菜单是指 B

    得分/总分

    • A.菜单项可以被选择
    • B.用户单击菜单按键时弹出1.00/1.00
    • C.每一个菜单项都有单选框
    • D.每一个菜单项都有复选框
  7. 上下文菜单是指 A

    得分/总分

    • A.当用户按住某个组件不放弹出的菜单
    • B.由一串有相互联系的菜单项构成
    • C.菜单会根据上下文的含义设置菜单项0.00
    • D.菜单是上下文关联的
  8. 对于选项菜单 D

    得分/总分

    • A.要重写onCreateContextMenu()方法
    • B.要注册菜单
    • C.要重写onContextItemSelected()方法
    • D.要重写onCreateOptionMenu()方法

9… 对于上下文菜单 B

​ 得分/总分

  • A.要重写onCreateOptionMenu()方
  • B.要注册菜单1.00/1.00
  • C.单击菜单按键时弹出菜单
  • D.要重写onOptionItemSelected()方法
  1. 在使用菜单资源时 C

    得分/总分

    • A.使用代理组件获取菜单资源
    • B.使用findViewById()获取菜单资源
    • C.要使用MenuInfater类的对象获取菜单资源1.00/1.00
    • D.用new关键字创建Menu对象
  2. 下列说法正确的是 A

    得分/总分

    • A.定义菜单首先要创建菜单文件夹1.00/1.00
    • B.可以将直接设置成单选形式
    • C.菜单资源文件中第一个标记是
    • D.菜单资源文件中第一个标记是
发布了83 篇原创文章 · 获赞 37 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/xbean1028/article/details/104797732
今日推荐