精华内容
下载资源
问答
  • Android中关于menu(菜单)的创建与使用
    一、menu中item的三个常用属性:
    1.设置属性showAsAction主要是针对菜单的显示起作用的,它有三个可选项
    always:总是显示在界面上
    never:不显示在界面上,只让出现在右边的三个点中
    ifRoom:如果有位置才显示,不然就出现在右边的三个点中
    2.属性orderInCategory设置优先级,值越大优先级越低
    3.属性title是设置标题显示的内容


    二、menu的创建步骤:
    1.在res文件的根目录下新建一个menu文件夹
    2.在menu文件夹下新建一个.xml
    3.在.xml中定义添加自己想要的item及其属性
    4.activity中设置menu的使用。


    三、代码及示例:

    MainActivity.java

    package com.zhiyuan3g.myrecycleview;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.RecyclerView;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.Toast;
    
    import com.zhiyuan3g.myrecycleview.bean.DataBean;
    
    import java.util.ArrayList;
    
    public class MainActivity extends AppCompatActivity {
    
        private RecyclerView recyclerview;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
        }
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            //加载布局,使用菜单特有方法getMenInfater,或Inflate对象
            //参数:1.菜单显示的布局  2.固定menu
            getMenuInflater().inflate(R.menu.menu_main,menu);
            return true;
        }
    
        //在每个if条件下填充相应的操作代码
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int itemId = item.getItemId();
            if (itemId == R.id.action_list_normal) {
                //标准显示
                 Toast.makeText(getApplicationContext(), "标准显示", Toast.LENGTH_SHORT).show();
    
                return true;
            } else if (itemId == R.id.action_list_vertical_reverse) {
    
                //垂直反向显示
            } else if (itemId == R.id.action_list_horizontal) {
    
                //水平显示
            } else if (itemId == R.id.action_list_horizontal_reverse) {
                //水平反向显示
    
            }
            return super.onOptionsItemSelected(item);
        }
    
    }

    menu_mian.xml

    <?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"
        >
    
        <item
            android:id="@+id/action_list"
            android:orderInCategory="100"
            android:title="list显示"
            app:showAsAction="never">
            <menu>
                <item
                    android:id="@+id/action_list_normal"
                    android:orderInCategory="100"
                    android:title="标准"
                    app:showAsAction="never"/>
                <item
                    android:id="@+id/action_list_vertical_reverse"
                    android:orderInCategory="100"
                    android:title="垂直反向"
                    app:showAsAction="never"/>
                <item
                    android:id="@+id/action_list_horizontal"
                    android:orderInCategory="100"
                    android:title="水平"
                    app:showAsAction="never"/>
                <item
                    android:id="@+id/action_list_horizontal_reverse"
                    android:orderInCategory="100"
                    android:title="水平反向"
                    app:showAsAction="never"/>
    
            </menu>
        </item>
    </menu>


    效果图:










    展开全文
  • Android中Menu 菜单的使用

    万次阅读 多人点赞 2016-10-31 14:08:11
    1.1 Menu 菜单 【 Menu 菜单 1. OptionsMenu 选项菜单 ...特点: 当通过点击menu键或者3.0以上的手机上,点击右上方的三个点...特点:当长按指定控件后,屏幕中心弹出列表对话框 3. PopupMenu 浮动菜单 特点:

    1.1    Menu 菜单

    Menu 菜单

    1.      OptionsMenu 选项菜单

    特点:  当通过点击menu键或者3.0以上的手机上,点击右上方的三个点,出现的列表,都是有OptionMenu对象进行控制

    2.      ContextMenu上下文菜单

    特点:当长按指定控件后,在屏幕中心弹出列表对话框

    3.      PopupMenu  浮动菜单

    特点:通过指定控件指定监听,触发显示,可以让菜单列表显示在指定控件的下方

     

    1.1.1  概述

    菜单是一种非常常见的与用户交互的一种用户界面组件

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

    1.1.2  菜单的创建

    1、通过代码创建

    2、使用xml资源文件创建菜单(res/menu目录下)(建议使用,重点掌握)

     

    1.1.3  菜单的分类

    Options Menu         选项菜单

    Context Menu         上下文菜单

    Popup Menu  浮动菜单

     

    1.1.4  在XML中定义Menu文件

    位置:res/menu目录下

    <menu>:代表菜单资源

    <item>:菜单项

             android:id  // 菜单项的id

             android:icon  // 菜单项的图标

             android:title  // 菜单项的标题

             android:orderInCategory // 排序

             android:showAsAction // 在ActionBar上的显示参数(API 11)

                       never:不将MenuItem显示在ActionBar上(是默认值)

                       always:总是将该MenuItem显示在ActionBar上

                       ifRoom:当AcitonBar上有空间时将该MenuItem显示在ActionBar上,没有空间就放入溢出菜单中

                       withText:将该MenuItem显示在ActionBar上,并显示该菜单项的文本

                       显示自定义ActionBar的View,需要和actionViewClass这组参数结合使用(API14)

    <group>:菜单组

    二级菜单(子菜单的创建)

             概念:在menu Item中嵌套menu元素,可以实现多级菜单,嵌套的菜单叫做子菜单,一般只会使用二级菜单,如果菜单层次太深,会严重影响用户体验。

             二级可选菜单

                       android:checkableBehavior

                       有三个属性值可选

                                all(多选)

                                single(单选)

                                none(不可选)

    1.1.5  选项菜单

    使用步骤

             初始化选项菜单:onCreateOptionsMenu(Menu menu)

             为菜单项设置监听器:onOptionsItemSelected(MenuItem item)

    OptionsMenu的使用方式:

    方式一:纯代码处理(官方并不是特别推荐)

     

    方式二:xml文件+代码(官方推荐方式)

     

     通过xml文件+代码实现Options Menu的显示

    Xml文件:负责设置菜单列表中总共要显示哪些数据选项,以及这些选项的显示特点

     

    代码: 负责处理加载xml文件,并处理点击事件

     

    关于xml文件的处理:

    1.      在res文件夹内容准备一个menu文件夹,所有控制菜单显示的xml文件均被存于此处

    2.      在menu文件夹中创建一个xml文件,让该文件以menu标签作为根标签

    3.      在menu标签之间添加item标签,每一个item标签代表一个菜单选项

    4.      处理item标签中的属性

     

     

    代码实现:

    <?xml version="1.0"encoding="utf-8"?>

    <menu xmlns:android="http://schemas.android.com/apk/res/android">

     

        <!--

        android:id 用于设置itemid,即唯一标识,用于稍后的点击判断

        android:title 用于设置标题

        android:orderInCategory 用于设置item选项在菜单列表中的排列顺序

        属性值越小,排列顺序越靠前,

        如果属性值相同,哪个item的代码在前面,哪个item就排名靠前

       

        android:icon 用于设置图标。注意:如果item是显示在菜单列表中,那么

        图标永远不显示

       

        android:showAsAction android3.0 以后才出的属性

        用于设置item在标题栏上的显示特点

        可选属性值:

        never  该选项永远显示在菜单列表中

        ifRoom 如果标题栏上有剩余空间,就显示在标题栏上,如果没有,就显示在菜单列表中

        always 该选项永远直接显示在标题栏上

        withText  让图标和文字同时显示

        -->

             <item

                 android:id="@+id/item1"

                 android:title="菜单项一"

                android:orderInCategory="3000"

                android:showAsAction="always|withText"

                 android:icon="@drawable/ic_launcher"/>

             <item

                 android:id="@+id/item2"

                 android:title="菜单项二"

                android:orderInCategory="10"

                android:showAsAction="ifRoom"

                 android:icon="@drawable/ic_launcher"/>

             <item

                 android:id="@+id/item3"

                android:orderInCategory="20"

                 android:title="菜单项三"

                 android:icon="@drawable/ic_launcher"/>

    </menu>

    public class MainActivity extends Activity {

     

             @Override

             protected void onCreate(Bundle savedInstanceState) {

                       super.onCreate(savedInstanceState);

                       setContentView(R.layout.activity_main);

             }

             /*

              * 重写onCreateOptionsMenu方法,在此方法中加载xml文件参数:代表要显示的菜单对象

              *

              * 返回值:true 显示菜单, false 不显示菜单

              */

             @Override

             public boolean onCreateOptionsMenu(Menu menu){

                       // TODOAuto-generated method stub

                       /*

                        * my.xml文件中的所有item菜单选项添加到参数二指定的menu对象中显示

                        */

                       getMenuInflater().inflate(R.menu.my_menu, menu);

                       //通过代码添加菜单选项

                       /*

                        * 1. 该菜单选项所在组的groupId

                        * 2. 该菜单的唯一标识,id属性的值

                        * 3. 控制排列顺序,作用等同于orderInCategory属性

                        * 4:选项上要显示的文字标题

                        * */

                       menu.add(0, 1, 20, "代码添加menu");

                       return true;

             }

             //重写此方法,获取菜单项的点击事件,参数代表被点击的菜单选项

             @Override

             public boolean onOptionsItemSelected(MenuItemitem) {

                       // TODOAuto-generated method stub

                       Toast.makeText(this,item.getTitle()+String.valueOf(item.getItemId()), Toast.LENGTH_SHORT).show();

                       //区分被点击的item

                       switch (item.getItemId()){

                       caseR.id.item1:

                               

                                break;

                       caseR.id.item2:

                                break;

                       caseR.id.item3:

                                break;

                       }

                       return super.onOptionsItemSelected(item);

             }

    }

     

    1.1.5.1 示例代码

    <?xml version="1.0"encoding="utf-8"?>

    <menu xmlns:android="http://schemas.android.com/apk/res/android">

     

        <item

            android:id="@+id/menu1"

            android:orderInCategory="100"

            android:showAsAction="never"

            android:title="选项菜单1"/>

        <item

            android:id="@+id/menu2"

            android:orderInCategory="100"

            android:showAsAction="never"

            android:title="选项菜单2"/>

        <item

            android:id="@+id/menu3"

            android:orderInCategory="100"

            android:showAsAction="never"

            android:title="选项菜单3"/>

        <!--选项菜单可分组 -->

        <group android:id="@+id/menu_group1">

            <item

                android:id="@+id/menu4"

                android:orderInCategory="100"

                android:showAsAction="never"

                android:title="1选项菜单1"/>

            <item

                android:id="@+id/menu5"

                android:orderInCategory="100"

                android:showAsAction="never"

                android:title="1选项菜单2"/>

        </group>

        <!--XML添加具有子选项的菜单 -->

        <item

            android:id="@+id/con_son_menu"

            android:title="点击出子菜单">

            <menu>

                <!-- 样式出现选择样式 -->

                <group android:checkableBehavior="all" >

                    <item

                                                   android:checked="true"

                        android:id="@+id/con_son_menu_1"

                        android:title="子菜单1"/>

                    <item

                        android:id="@+id/con_son_menu_2"

                        android:title="子菜单2"/>

                </group>

            </menu>

        </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) {

                       // TODOAuto-generated method stub

                       //布局xml配置加载

                       getMenuInflater().inflate(R.menu.my_menu, menu);

                       //代码添加菜单项

                       menu.add(2, 2, 150, "2代码项1");

                       menu.add(2, 3, 150, "2代码项2");

                       /**

                        * 可以根据组ID决定组中的菜单项是否可见或可操作

                        */

                       menu.setGroupEnabled(2,false);

                       /**

                        * 通过代码添加有子菜单项的菜单

                        */

                       SubMenu sub = menu.addSubMenu(3, 33, 333, "代码子菜单");

                       sub.add(3, 34, 333, "1");

                       sub.add(3, 35, 333, "2").setOnMenuItemClickListener(new OnMenuItemClickListener() {

                               

                                @Override//boolean监听:代表处理完监听,是否还要进行额外操作

                                publicboolean onMenuItemClick(MenuItemitem) {

                                         // TODOAuto-generated method stub

                                         Toast.makeText(MainActivity.this, "=====+"+item.getTitle()+"设置单个子菜单事件", Toast.LENGTH_SHORT).show();

                                         returnfalse;

                                }

                       });

                       return true;

             }

            

             //菜单列表item的点击事件,参数代表被点击的item菜单选项

             @Override

             public boolean onOptionsItemSelected(MenuItem item) {

                       // TODOAuto-generated method stub

                       switch(item.getItemId()) {

                       case 34:

                                Toast.makeText(MainActivity.this, "点击了子菜单中的子选项1", Toast.LENGTH_SHORT).show();

                                break;

                       case 35:

                                Toast.makeText(MainActivity.this, "点击了子菜单中的子选项2", Toast.LENGTH_SHORT).show();

                                break;

                       }

                       return super.onOptionsItemSelected(item);

             }

    }

    1.1.6  上下文菜单

    使用步骤

             初始化上下文菜单:onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo)

             为指定控件注册上下文菜单:registerForContextMenu(Viewview)

             为菜单项设置监听器:onContextItemSelected(MenuItemitem)

    特点:当长按指定控件的时候显示的菜单列表

    位置固定显示与屏幕中心

    使用步骤:

    大体步骤与OptionsMenu 基本一致

    1.      通过menu文件夹中的xml文件定义菜单列表中要显示的内容

    2.      重写onCreateContextMenu方法,在该方法中通过

    3.      重写onContextItemSelected方法获取菜单选项被点击的监听事件

    4.      在页面的onCreate方法中通过registerForContextMenu方法的参数指定长按哪个控件对象显示菜单

     

     

    registerForContextMenu方法中传递的是一个listview对象时,ContextMenu是针对列表中每个item进行设置

    在onContextItemSelected方法中可以通过以下方式获取别长按的item在listview中对应的position位置

    //获取被点击的菜单选项对应的菜单信息封装对象

               AdapterContextMenuInfo aci = (AdapterContextMenuInfo) item.getMenuInfo();

               //通过菜单信息封装对象获取被点击的item的位置

               int position = aci.position;

    1.1.6.1 示例代码

    <?xml version="1.0"encoding="utf-8"?>

    <menu xmlns:android="http://schemas.android.com/apk/res/android">

       

        <item

           android:id="@+id/list_item1"

           android:title="复制"/>

         <item

           android:id="@+id/list_item2"

           android:title="删除"/>

          <item

           android:id="@+id/list_item3"

           android:title="重命名"/>

     

    </menu>

    public class MainActivity extends Activity {

     

             private TextView tv;

             @Override

             protected voidonCreate(Bundle savedInstanceState) {

                       super.onCreate(savedInstanceState);

                       setContentView(R.layout.activity_main);

                       tv=(TextView) this.findViewById(R.id.tv);

                       registerForContextMenu(tv);

             }

     

             @Override

             public voidonCreateContextMenu(ContextMenu menu, View v,

                                ContextMenuInfomenuInfo) {

                       // TODO Auto-generated method stub

                       super.onCreateContextMenu(menu, v, menuInfo);

                       getMenuInflater().inflate(R.menu.main, menu);

             }

    }

    public class TwoActivity extends Activity {

             private ListView lv;

             ArrayList<String>list = newArrayList<String>();

             ArrayAdapter<String>adapter;

             @Override

             protected voidonCreate(Bundle savedInstanceState) {

                       // TODO Auto-generated method stub

                       super.onCreate(savedInstanceState);

                       setContentView(R.layout.activity_two);

                      

                       lv=(ListView) this.findViewById(R.id.listview1);

                       for(inti=0;i<10;i++){

                                list.add("item"+i);

                       }

                       adapter = newArrayAdapter<>(this,android.R.layout.simple_list_item_1, list);

                       lv.setAdapter(adapter);

                      

                       registerForContextMenu(lv);

             }

            

             @Override

             public voidonCreateContextMenu(ContextMenu menu, View v,  //v是传递过来的对象

                                ContextMenuInfomenuInfo) {

                       // TODO Auto-generated method stub

                       super.onCreateContextMenu(menu, v, menuInfo);

                       getMenuInflater().inflate(R.menu.list_menu, menu);

                      

                       v.setBackgroundColor(Color.RED);

             }

             @Override

             public booleanonContextItemSelected(MenuItem item) {

                       // TODO Auto-generated method stub

                       AdapterContextMenuInfoaci=(AdapterContextMenuInfo)item.getMenuInfo();

                       final intposition = aci.position;

                       switch (item.getItemId()) {

                       case R.id.list_item1//复制

                                list.add(list.get(position));

                                adapter.notifyDataSetChanged();

                                break;

                       case R.id.list_item2//删除

                                list.remove(position);

                                adapter.notifyDataSetChanged();

                                break;

                       case R.id.list_item3//重命名

                                Viewv = View.inflate(this,R.layout.custom, null);

                                final AlertDialog dialog = new AlertDialog.Builder(this)

                                .setView(v)

                                .show();

                                final EditText ed_name =(EditText)v.findViewById(R.id.ed_name);

                                Buttonbtn_ok = (Button) v.findViewById(R.id.btn_ok);

                                btn_ok.setOnClickListener(new OnClickListener() {

                                        

                                         @Override

                                         public voidonClick(View v) {

                                                   // TODO Auto-generated method stub

                                                   list.set(position, ed_name.getText().toString());

                                                   adapter.notifyDataSetChanged();

                                                   dialog.dismiss();

                                         }

                                });    

                                break;

                       }

                       return super.onContextItemSelected(item);

             }

             @Override

             public voidonContextMenuClosed(Menu menu) {

                       // TODO Auto-generated method stub

                       super.onContextMenuClosed(menu);

                       lv.setBackgroundColor(Color.WHITE);

             }

    }

    1.1.7  浮动菜单

    使用步骤

             创建浮动菜单对象:PopupMenu popupMenu = newPopupMenu(this, btn_show_popupmenu);

                       参数1:上下文环境

                       参数2:需要绑定浮动菜单的控件id

             将菜单文件加载到内存中:getMenuInflater().inflate(R.menu.popup_menu,popupMenu.getMenu());

             为菜单项设置监听器:popupMenu.setOnMenuItemClickListener(OnMenuItemClickListener)

             显示菜单:popupMenu.show();

     

    PopupMenu浮动菜单

    特点:

    1.      可以指定任意控件通过任意方式触发浮动菜单的显示

    2.      可以显示在指定控件的下方

     

    使用方式:

    1.      获取控件对象,设置任意的监听,如设置tv的点击事件

    代表是要在tv被点击时显示Popup Menu

    //1.初始化popupmenu对象

                          /*

                           *  参数2:默认情况下是让pm稍后再显示的时候,可以显示在该控件的下方

                           *  但是当该控件下方没有足够的控件的时候,就让pm显示在该控件的上方

                           * */

                          PopupMenu pm = newPopupMenu(PopupMenuActivity.this,tv);

                          /*

                           * 3参的构造方法的参数3:用于指定pm与控件的对齐方式

                           * 此方法必须确保在 19版本,即4.4.2版本以上才能生效

                           * */

    //                     PopupMenupm = new PopupMenu(PopupMenuActivity.this, tv, Gravity.RIGHT);

    2.      向popupmenu对象中添加要显示的菜单选项

    //添加方式一:

    //                    getMenuInflater().inflate(R.menu.popup_menu,pm.getMenu());

                          //添加方式二

                          pm.inflate(R.menu.popup_menu);

    3.      通过show方法显示popupmenu对象

    pm.show();

    设置popupmenu中菜单选项的点击事件:

    //获取pm菜单选项的点击事件

                          pm.setOnMenuItemClickListener(new OnMenuItemClickListener() {

                               

                                @Override

                                public boolean onMenuItemClick(MenuItem item) {

                                      // TODO Auto-generated method stub

                                      Toast.makeText(PopupMenuActivity.this, item.getTitle(), Toast.LENGTH_SHORT).show();

                                      return false;

                                }

                          });

     

     

    PopupWindow的使用:

    浮动窗口, 特点:效果上是一个可以自定义显示及显示位置的对话框

     

    使用方式:

    //1.初始化对象

                          /*

                           * 1. 用于指定pw中要显示View对象

                           * 23. 用于指定pw显示时的宽高

                           * */

                          View vv= View.inflate(PopupWindowActivity.this, R.layout.custom, null);

                          PopupWindow pw = new PopupWindow(vv, 400, 400);

                         

                          //设置pw中的控件能够获取焦点

                          pw.setFocusable(true);

                         

                          //设置可以通过点击pw外部关闭pw,但是生效的前提

                          //是必须给pw设置了背景才行

                          //设置pw的默认背景,即如果custom布局中没有指定背景的话,就显示此背景

                          pw.setBackgroundDrawable(getResources().getDrawable(R.drawable.ic_launcher));

                          pw.setOutsideTouchable(true);

                         

                          //3.通过show**方法显示

    //                    pw.showAsDropDown(tv,50, 50);

                          /*

                           * 1. 通过参数一指定的控件寻找该控件的父控件

                           * 以父控件的范围为基准

                           * 2. gravity 居中,右下等位置

                            * 34. 水平和垂直方向的偏移量

                           *

                           * */

                          pw.showAtLocation(tv, Gravity.CENTER, 0, 0);

     

     

    1.1.8  扩展:PopupWindow(浮动窗口)

    基本使用步骤

             构造方法:PopupWindow(View contentView, intwidth, int height)

                       参数1:contentView,浮动窗口中显示的内容

                       参数2:width,浮动窗口的宽度

                       参数3:height,浮动窗口的高度

             显示浮动窗口:showAsDropDown(Viewanchor, int xoff, int yoff)

                       参数1:anchor,浮动窗口出现在指定控件的下方

                       参数2:xoff,在X轴上的偏移量

                       参数3:yoff,在Y轴上的偏移量

             隐藏浮动窗口:dismiss()

    显示带列表的浮动窗口

             创建ListView对象

                       setAdapter(ListAdapter):设置列表适配器,用于填充列表数据

                       setOnItemClickListener(OnItemClickListener):设置列表项的监听事件

             setFocusable(true):使浮动窗口可以获取焦点

             setBackgroundDrawable(newColorDrawable()):为解决焦点问题,这行代码必须执行

     

    PopupWindow 补充:

    当初始化PopupWindow对象时,需要通过构造方法传递PopupWindow要显示的宽高,除了直接指定宽高对应的数字之外,能不能设置成wrap_content或者match_parent??

    解决方式:在需要指定宽高的位置,通过ViewGroup包内的LayoutParams的类中的静态常量即可调用FILL_PARENT,MATCH_PARENT和WRAP_CONTENT  属性设置了

     

     

    1.1.8.1 示例代码

    <menu xmlns:android="http://schemas.android.com/apk/res/android"

        xmlns:tools="http://schemas.android.com/tools"

        tools:context="com.example.day13popupmenu.popupwindow.MainActivity">

     

        <item

           android:id="@+id/pu_menu1"

           android:title="pm菜单1"/>

        <item

           android:id="@+id/pu_menu2"

           android:title="pm菜单2"/>

        <item

           android:id="@+id/pu_menu3"

           android:title="pm菜单3"/>

        <item

           android:id="@+id/pu_menu4"

           android:title="pm菜单4"/>

     

    </menu>

    public class MainActivity extends Activity {

            

             private TextView tv;

             @Override

             protected voidonCreate(Bundle savedInstanceState) {

                       super.onCreate(savedInstanceState);

                       setContentView(R.layout.activity_main);

                       tv =(TextView) this.findViewById(R.id.tv);

                      

                       tv.setOnClickListener(newOnClickListener() {

                               

                                @Override

                                public voidonClick(View v) {

                                         // TODO Auto-generated method stub

                                         PopupMenu pm = new PopupMenu(MainActivity.this, tv);

                                         getMenuInflater().inflate(R.menu.main,pm.getMenu());

                                         //pm.inflate(R.menu.main);

                                         pm.show();

                                         pm.setOnMenuItemClickListener(new OnMenuItemClickListener() {

                                                  

                                                   @Override

                                                   public booleanonMenuItemClick(MenuItem item) {

                                                            // TODO Auto-generated method stub

                                                            Toast.makeText(MainActivity.this, item.getTitle(), Toast.LENGTH_SHORT).show();

                                                            return false;

                                                   }

                                         });

                                         pm.setOnDismissListener(new OnDismissListener() {

                                                  

                                                  @Override

                                                   public voidonDismiss(PopupMenu menu) {

                                                            // TODO Auto-generated method stub

                                                            Toast.makeText(MainActivity.this, "close",Toast.LENGTH_SHORT).show();

                                                   }

                                         });

                                }

                       });

             }

     

    }

     

    public class TwoActivity extends Activity {

     

             private TextView tv;

     

             @Override

             protected voidonCreate(Bundle savedInstanceState) {

                       // TODO Auto-generated method stub

                       super.onCreate(savedInstanceState);

                       setContentView(R.layout.activity_main);

     

                       tv = (TextView) this.findViewById(R.id.tv);

                       tv.setOnClickListener(newOnClickListener() {

     

                                @Override

                                public voidonClick(View v) {

                                         View vv = View.inflate(TwoActivity.this, R.layout.custom,null);

                                         final PopupWindow pw = newPopupWindow(vv, 300, 300);

                                         // pw.showAsDropDown(vv,50,50);

                                          // 设置pw能够获得焦点

                                         pw.setFocusable(true);

                                         // 设置浮动窗体,点击旁白能够自动消失,但是必须要设置setBackgroundDrawable才能生效

                                         pw.setBackgroundDrawable(getResources().getDrawable(

                                                            R.drawable.ic_launcher));

                                         pw.setOutsideTouchable(true);

                                         pw.showAtLocation(vv,Gravity.CENTER, 0, 0);

     

                                         Buttonbtn_ok = (Button) vv.findViewById(R.id.btn_ok);

                                         final EditText ed_edit = (EditText) vv

                                                            .findViewById(R.id.ed_name);

                                         btn_ok.setOnClickListener(new OnClickListener() {

     

                                                   @Override

                                                   public voidonClick(View v) {

                                                            // TODO Auto-generated method stub

                                                            Toast.makeText(TwoActivity.this,

                                                                               ed_edit.getText().toString(),

                                                                               Toast.LENGTH_SHORT).show();

                                                            pw.dismiss();

                                                   }

                                         });

     

                                }

                       });

             }

    }

     

    展开全文
  • 初学者使用Android studio进行Android开发时,可能会碰到找不到menu文件的情况,那么这里 我就对menu布局文件进行解释,以及如何进行添加......

    在初学者使用Android studio进行Android开发时,可能会碰到找不到menu文件的情况,那么在这里

    我就对menu布局文件进行解释,以及如何进行添加。


    截图基于Android studio 3.0

    menu布局文件的添加:

    在你的工程res文件上点击鼠标右键,如图:



    然后会出现下面的页面,在Resource type下拉栏选择menu,如下图所示:



    接着在menu文件夹下右键,选择如下图所示:



    最后按照正常的文件创建方式输入文件名即可。


    Menu文件的说明:存放定义了应用程序菜单资源的XML文件。菜单资源文件必须放在res/menu

    目录中。菜单资源文件必须使用<menu>标签作为根节点。出来<menu>标签外,还有另外两个

    标签用于设置菜单项和分组,这两个标签是<item>和<group>。



    展开全文
  • Android Menu 使用

    千次阅读 2012-05-14 18:42:43
    Android Menu 1人收藏此文章, 我要收藏发表于9个月前 , 已有733次阅读 共0个评论   Menu由两种形式,Option menu和Context menu。前者是按下设备的Menu硬按钮弹出,后者是长按widget弹出。 Option...
     
    

    Android Menu

    1人收藏此文章, 我要收藏发表于9个月前 , 已有 733次阅读 共 0个评论
     

    Menu由两种形式,Option menu和Context menu。前者是按下设备的Menu硬按钮弹出,后者是长按widget弹出。

    Option Menu

    当我们按下Menu的硬件按钮时,Option Menu将被触发显示,最多可以显示6个选项的icon菜单,如果选项多于6个,第6个选项显示为“More“,点击可以进入扩展菜单。我们将在Android学习笔记(十一):Activity-ListView 的例子一的基础上来学习Option Menu,也就是一个基于activity的菜单。

    在这个例子中,我们给出一个有7个选项(多余最多显示6个item)的例子,可以设置List中item之间分割线的粗细。

    步骤1:创建Menu

    1.1 设置Menu各个item的ID

        private static final int EIGHT_ID = Menu.FIRST +1;
        private static final int SIXTEEN_ID = Menu.FIRST+2;
        private static final int TWENTY_FOUR_ID = Menu.FIRST+3;
        private static final int TWO_ID = Menu.FIRST+4;
        private static final int THIRTY_TWO_ID = Menu.FIRST+5;
        private static final int FORTY_ID = Menu.FIRST+6;
        private static final int ONE_ID = Menu.FIRST+7;

    其中Menu.FIRST在reference中描述为:First value for group and item identifier integers.我们可以理解为ID设置的最小数值。

    1.2 创建Menu

    在用户第一次按下Menu键的使用,将触发onCreateOptionsMenu(),我们将在此创建我们的菜单

        public boolean onCreateOptionsMenu (Menu menu) {
            /*第一个参数是groupId,如果不需要可以设置为Menu.NONE。将若干个menu item都设置在同一个Group中,可以使用setGroupVisible(),setGroupEnabled(),setGroupCheckable()这样的方法,而不需要对每个item都进行setVisible(), setEnable(), setCheckable()这样的处理,这样对我们进行统一的管理比较方便 
           * 第二个参数就是item的ID,我们可以通过menu.findItem(id)来获取具体的item 
           * 第三个参数是item的顺序,一般可采用Menu.NONE,具体看本文最后MenuInflater 的部分 
           * 第四个参数是显示的内容,可以是String,或者是引用Strings.xml的ID */ 
            menu.add(Menu.NONE ,ONE_ID ,Menu.NONE ," 1 Pixel "); 
            menu.add(Menu.NONE, TWO_ID, Menu.NONE, "2 Pixels");
            menu.add(Menu.NONE, EIGHT_ID, Menu.NONE, "8 Pixels");
            menu.add(Menu.NONE, SIXTEEN_ID, Menu.NONE, "16 Pixels");
            menu.add(Menu.NONE, TWENTY_FOUR_ID, Menu.NONE, "24 Pixels");
            menu.add(Menu.NONE, THIRTY_TWO_ID, Menu.NONE, "32 Pixels");
            menu.add(Menu.NONE, FORTY_ID, Menu.NONE, "40 Pixels");
     
            return super.onCreateOptionsMenu(menu); 
        }

    如果我们需要增加图标,也很简单,如下。

            MenuItem item1 = menu.add(Menu.NONE,ONE_ID,Menu.NONE,"1 Pixel");
            item1.setIcon(R.drawable.android_normal);

    运行,按Menu键,可以获得我们的Menu,如下图,第一个图是显示效果,第二个图是按了菜单中的More后显示的效果,第三个图我们在上面的基础上,再增加三个item,按More后的显示效果。

     

    步骤2:Menu触发

    Menu触发比较简单,Activity在Memu后会触发onOptionsItemSelected()进行处理。如下:

        public boolean onOptionsItemSelected (MenuItem item) {
            ... ... 加入我们的处理 ... ... 
            return super.onOptionsItemSelected(item);
        }

    在这个例子我们加入的处理如下。右图为选择24pix的显示结果

                switch (item.getItemId ()) { //获取Id 
                  case ONE_ID:
                    getListView().setDividerHeight(1);
                    break; 
                  case EIGHT_ID:
                    getListView().setDividerHeight(8);
                    break; 

                  ... 类同,设置分割线的粗细,略去...  
                  default:
                    break; 
                }

    步骤3:增加某些变化

    在上面的步骤中,已经学习了Option Menu的基本处理,但是我们需要增加一些变化

    3.1 每次显示menu时根据实际的情况进行适配 

    onCreateOptionsMenu()只在第一次按Menu按键时触发,有些时候,我们希望每次显示的菜单有一些变化,例如这个例子中,我们希望菜单不显示当前的分割线高度,只出现需要改变的高度,如图所示,当分割线为16pix时,菜单将不出现16pix的item。这样可以使用onPrepareOptionsMenu()。当用户第一次按Menu键时,先执行onCreateOptionsMenu( ),然后执行 onPrepareOptionsMenu();当用户第二次,第三次,第N次按Menu建时,执行onPrepareOptionsMenu(),因此我们可以在 onPrepareOptionsMenu()中处理每次的变化。本例如下

        public boolean onPrepareOptionsMenu (Menu menu) {
            /* 将所有的item设置有可视,好烦,想起了设置GourpID的好处,可以使用menu.setGroupVisible(Menu.NONE, true)代替。但是合理的,我们应当设置自己的GroupID,因此我们仍然每个item进行设置*/ 
            menu.findItem(ONE_ID).setVisible(true);
            menu.findItem(EIGHT_ID).setVisible(true);
            
     
    ... 类同,设置menu item可视,略去...  
            switch(getListView().getDividerHeight() ){ //如果需要设置的高度和当前的高度一致,不显示。 
            case 1:
                menu.findItem(ONE_ID).setVisible(false);  
                break;
            case 8:
                menu.findItem(EIGHT_ID).setChecked(true);
                break;
     
            ... 类同,略去... 
            default:
                break;
            }      
            return super.onPrepareOptionsMenu(menu); 
        }

    3.2 快捷键

    现在的智能手机一般都是直板不带键盘的,但是传统手机可能代T9键盘,也可能是全键盘。Android支持快捷键,虽然可能不常用到,对于全键盘,我们可以在onCreateOptionsMenu()中加入下面代码,这样,在CTRL-A和Alt-A中都能触发。

    menu.findItem(ONE_ID).setAlphabeticShortcut('A');

    对于T9键盘,由于模拟器不是T9键盘,也没有T9的手机,最后的效果没有实验过,如下处理:

    menu.setQwertyMode(true);
    menu.findItem(TWO_ID).setNumericShortcut('2');

    3.3 设置Item显示CheckBox的格式

    我们选取了其中两item进行设置,如下:

    1)在onCreateOptionsMenu()中设置这两个item是可以显示的是否checked的状态:

            menu.findItem(EIGHT _ID).setCheckable(true);
            menu.findItem(FORTY_ID).setCheckable (true);

    2)在onPrepareOptionsMenu()中,将如何和当前状态一致这设置checked的状态,例如:

    case 8:
        menu.findItem(EIGHT_ID).setChecked (true);
        break;
    case 40:
        menu.findItem(FORTY_ID).setChecked(true);
        break;

    3)什么时候可以显示

    让我们看看这两个的显示结果,我们发现“8 pix"的情况下Menu没有发生变化,而选择40的时候,出现了变化。为什么会这样?显示的前提是有足够位置显示。在“8 pix“由于是Menu的第一页的6个item,没有足够位置,而40px是More后的采用list的形式显示,有足够的位置,因此可以显示。

    同样的,对于加 Icom的例子,我们可以在第一页中看到Icon,如果通过More的方式显示后面的Icon,这个图片是看不到的,Android会给据UI情况进行适配。

    4)我们可以通过Group来处理:

    menu.setGroupCheckable(Group_id , true, false); //在这个例子中可以使用Menu.NONE作为Group_Id来实验

    第二个参数是是否允许checkable,而第三个参数很有意思,true表示可以可以单选,采用radio button的方式,如下左图,false表示可以多选,如下右图。

       

    步骤4:子菜单

    Android支持二级菜单,但是不支持三级等多级菜单。子菜单设置如下,在onCreateOptionsMenu(),如下:

    //通过addSubMenu设置子菜单,作为item加入Menu。参数和addMenu一致,为了简单,我们这里的ID直接采用数字表示
    SubMenu submenu = menu.addSubMenu (Menu.NONE, 100, Menu.NONE, "子菜单测试");
    //在SubMenu中增加子菜单的item 
    submenu.add (Menu.NONE,101,Menu.NONE,"sub One");
    submenu.add(Menu.NONE,102,Menu.NONE,"sub Two");
    submenu.add(Menu.NONE,103,Menu.NONE,"sub Three");
    submenu.add(Menu.NONE,104,Menu.NONE,"sub Four");

    显示如下,我们是加在原有菜单之后,因此需要按More查看:

       

    Context Menu

    Context Menu是用户手指长按某个View触发的菜单。处理如下:

    步骤1:为某个view注册ContextMenu

    例如在我们的例子中,在onCreate()中对整个ListView进行处理:

    registerForContextMenu (getListView() );

    步骤2:创建ContextMenu

    通过Override onCreateContextMenu()来创建Context Menu。如果我们为多个View都注册了ContextView,那么我们可以通过第二个参数View v来判断需要创建怎样的菜单。第三个参数ContextMenuInfo和具体的View的特性有关,如果是list,它是List这中的item,这样我们可以根据这个item的当前状态,例如是否checked来处理menu。

        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
            ... 设置Menu的处理,和Option Menu一样 ....,同样的支持子菜单 
            super.onCreateContextMenu(menu, v, menuInfo);
        }

    我们每一次常按widget,都会触发onCreateContextMenu()的处理,这和Option Menu不一样。每次处理完,ContextMenu都会discard,因此我们不要保留里面的menu以及menu item对象用于其他的处理。

    步骤3:点击菜单触发函数

    触发onContextItemSelected()。这里么只有一个MenuItem,因此在程序中,每个MenuItem的ID应该是唯一的,如果我们需要获取MenuInfo,可以用item.getMenuInfo()来获得。

        public boolean onContextItemSelected(MenuItem item) {
            ...  我们的处理内容... 
            return super.onContextItemSelected(item);
        }

    通过XML来定义Menu

    Android学习笔记(十七):再谈ListView 中,利用LayoutInflater infalter = getLayoutInflater ();从XML文件中获取Layout的样式。在Menu中也可以采用类似的方式。我们在onCreateOptionsMenu()中如下处理:

        public boolean onCreateOptionsMenu(Menu menu) {
            MenuInflater menuInflater = new MenuInflater(getApplication());
            menuInflater.inflate(R.menu.chapter11_menu, menu);
            return super.onCreateOptionsMenu(menu);
        }

    其中我们在res/menu目录下面创建Menu的xml文件 chapter11_menu.xml。我们通过下面的例子看看Menu XML文件如何编写:

    <?xml version="1.0" encoding="utf-8"?>
    <!-- Menu对应一个Menu的格式 --> 
    <menu   xmlns:android="http://schemas.android.com/apk/res/android" >
         <!-- 我们分三种情况进行设置 --> 
         
    <!-- Part 1 :普通情况,我们增加三个MenuItem,item对应MenuItem 的格式。item中的android:id直接就是item的ID,即我们menu.add()中的第二个参数。 --> 
        
    <item android:id="@+id/c11_close" 
         <!-- title为显示的文字,即 menu.add() 中的第三个参数的第四个参数 ,可采用@string/xxx --> 
          android:title ="Close"
         <!-- orderInCategory 表明摆放的顺序,不一定从0还是计算,但必须大于等于0,数值小的位于前,如果数值一样,在我们这个例子中3又两个值,则安顺序摆放,此相当于menu.add() 中的第三个参数order。当然我们建议从0,1,2,3....这样依次给出,并且与XML行文的顺序一致。 --> 
          android:orderInCategory = "3"
         <!-- icon设置图标,不言自喻 --> 
          android:icon ="@drawable/android_focused" />
         <item android:id="@+id/c11_no_icon"
           android:orderInCategory = "2"
           android:title = "Sans Icon" />
     
         <item android:id="@+id/c11_disabled"
           android:orderInCategory="4"
           android:enabled="false"
     
           android:title="Disabled" />
         
    <!-- Part 2 :Group的情况,我们在Group中放入2个item  ,如果我们要显示3.4的方式,可以增加group的参数android:checkableBehavior来设置 ,single表示radio box,all表示checkbox,none表示checkable=flase。group中的android:id就是Gourp_ID,即menu.add()中的第一个参数。在这个例子中,我们设置这个group不可视,如果需要显示,代码为:menu.setGroupVisible(R.id.c11_other_stuff , true);--> 
          <group android:id="@+id/c11_other_stuff" 
           <!-- Item由android:orderInCategory来设置item的顺序,在Group中我们可以通过menuCategory来设置另一个category,里面的顺序和default Category是不方在一起比较,例如这里么我们给出0和5,如图所示,在显示完default Category,再显示这个sendonary的内容。 --> 
            android:menuCategory="secondary"
            android:checkableBehavior="single"
            android:visible="false" >
               <item android:id="@+id/c11_later"
                 android:orderInCategory="0"
                 android:title="2nd-To-Last" />
               <item android:id="@+id/last"
                  android:orderInCategory="5"
                 android:title="Last" />
     
         </group>
         <!-- Part 3 :子menu的设置,将在menuItem内部嵌套一个<Menu>,在这个例子中的子菜单,试验了快捷键的方式 --> 
         <item android:id="@+id/c11_submenu"
           android:orderInCategory="3"
           android:title="A submenu"
     >
               <menu>
                   <item android:id="@+id/c11_non_ghost"
                     android:title="Non-Ghost"
                     android:visible="true"
                     android:alphabeticShortcut ="n" /> 
                   <item android:id="@+id/c11_ghost"
                     android:title="Ghost"
                     android:visible="true"
                     android:alphabeticShortcut="g" />
     
               </menu>
          </item> <!-- end of Part 3 --> 
    </menu>

    展开全文
  • Android中自定义Menu

    千次阅读 2011-04-29 16:10:00
     在Android中,默认的Menu菜单一行最多只能显示3个菜单选项,如果我们想在Menu菜单一行想显示多于3个菜单选项时,我们可以考虑采用PopWindow结合自定义Layout布局文件来创建自定义菜单。  首先,先...
  • Android菜单详解——理解android中Menu 前言 今天看了pro android 3中menu这一章,对Android的整个menu体系有了进一步的了解,故整理下笔记与大家分享。 PS:强烈推荐《Pro Android 3》,是我至今为止看到...
  • Android中Menu

    千次阅读 2010-04-11 21:23:00
    onCreateOptionMenu(Menu menu)--当菜单第一次被打开时调用 onPrepareOptionsMenu(Menu menu)--菜单每次打开都会触发该方法 两种方法都是传入Menu对象,我们可以通过配置该对象来构建合适的OptionMenu ...
  • Android中在toolbar添加Menu菜单

    千次阅读 2018-05-29 22:14:27
    步骤:1、在menu文件夹的main.xml文件添加要添加的项目。&lt;menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" ...
  • Android菜单的使用Menu

    千次阅读 2013-09-05 10:23:12
    Android使用菜单使用 ...提供Android菜单支持的一个重要的类是Android.view.MenuAndroid中每一个活动都与一个此类型的菜单对象相关联,包括众多的菜单项和子菜单。菜单项使用android.view.MenuItem表示,子菜单
  • androidfragment中使用option menu

    千次阅读 2014-07-01 16:24:36
    activity中使用是这样的
  • android使用popupwindow自定义menu菜单

    热门讨论 2012-01-04 00:09:18
    android通过使用popupwindow控件实现自定义menu菜单
  • Android studio 使用Menu(菜单)

    万次阅读 2015-07-02 10:11:02
    1,打开res目录下的mune...2,在menu_main.xml添加如下代码: menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://
  • Android Menu

    万次阅读 2018-12-27 18:42:33
    自序 为什么,突然会写这么简单的一个控件的使用。而且我平常很少用到的技术(我的工作基本就是维护),但是我看了玉刚师哥的博客,我瞬间...我们都知道手机界面中能和用户交互的信息是有限的,菜单Menu就使得我...
  • Android中Menu菜单小解

    千次阅读 2011-12-13 22:37:46
    1. 选项菜单:最常规的菜单,android中把它叫做option menu 2. 子菜单:android中点击子菜单将弹出悬浮窗口显示子菜单项。子菜单不支持嵌套,即子菜单不能再包括其他子菜单。 3. 上下文菜单:android中长按...
  • Android FragmentMenu的操作

    千次阅读 2016-10-17 20:10:51
    最近,项目有用到Fragment对Menu的操作使用,发现并不能像Activity那样直接使用。需要oncreat方法添加一行代码,才会被调用出来。 为此从网上查了一下资料,整理了一下,以便下次的使用和记忆。Android4.0...
  • android studioMenu

    千次阅读 2016-09-23 15:44:58
    打开android studio会发现如图所示,没有Menu文件: 这时我们需要Menu文件,怎么办呢? 做法如下: 点击进去后会出现如下界面: ...4.2以前是这样做的 ...代码中: ...下面阐述一些Menu中Item的其他
  • 活动中使用 Menu

    千次阅读 2016-02-26 14:32:30
    android studio《第一行代码》 活动中使用 Menu
  • Android Floating Context Menu使用方法

    千次阅读 2014-09-07 18:50:58
    1. 概述 Android Context Menu有li
  • android--menu showAsAction的使用

    千次阅读 2017-03-20 17:21:16
    app有一个菜单(menu)按钮,其属性:showAsAction主要是针对这个菜单的显示起作用的,它有三个可选项 always: never: ifRoom:如果界面有位置才显示,不然就出现菜单按钮的三个点中 例子:首先...
  • Android中的菜单是用户界面最常见的元素,使用也很频繁,在Android中,菜单被分为3种,分别为选项菜单(OptionsMenu)、上下文菜单(ContextMenu)、子菜单(SubMenu)。本文先讲选项菜单(OptionsMenu)的使用。 Android
  • (转)Android 自定义 Menu 资源

    千次阅读 2010-09-14 14:08:00
    今晚做应用程序时,需要用到 Menu。... Android 任何视图组件的创建方式都有两种:1、XML文件创建;2、代码创建。Menu 也不例外,我们既可以资源文件声明,也可以代码创建。
  • Android中menu的创建

    千次阅读 2018-08-29 12:02:26
    网上有很多这种例程,书上也有,但是。。。我没看懂,搞了半天终于出来了。。 废话不说了开始: 右键res文件夹new选择Directory取名为...然后MainActivity.java重写方法,如图: 选择这个 弹出一个框框...
  • Android中设置Menu菜单的文字颜色为白色,一般情况下,Android中Menu菜单的title文字颜色为黑色, 如果开发应用的过程,自定义了ActionBar的颜色,比如一些比较鲜艳,清新的颜色,如青色,浅蓝色等 此时如果...
  • Android中获取Menu的item实例

    千次阅读 2017-08-05 18:39:32
    Toolbar和ActionBar中有时会用到Menu,那么怎样获取Menu中item的实例呢 首先要获取Menu实例,然后使用其findItem(int sourceId)方法来获取MenuItem实例。 @Override public boolean onCreateOptionsMenu...
  • android中 menu的属性详细解释

    千次阅读 2015-12-16 11:36:27
    android中 menu的属性详细解释    android:title="string"  android:titleCondensed="string"  android:icon="@[package:]drawable/drawable_resource_name"  android:on
  • android ActionBar与Menu - 2 - emailActionBar分析 这里以Email为例,简单分析一下ActionBar实际的应用 上面是模拟器上登录原生Email的截图 这里说一下所谓的原生: 原生...
  • Android中menu、home、back键的监听

    万次阅读 2013-03-03 17:00:14
    Android中menu、home、back键的监听,通过KeyEvent的常量值来判断用户点击了哪个按钮。 其中对home键的监听需先manifest文件添加   这一权限,并且程序复写onAttachedToWindow()方法,以便...
  • Android中如何添加Menu菜单(记录)

    千次阅读 2019-02-27 20:29:57
    1、res下创建menu文件夹,然后创建一个main.xml菜单menu文件,代码如下: &lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;menu xmlns:android="...
  • style当中设定的主题颜色是white因为我想导航栏的标题颜色是白色,但是这个white同时也设定了导航栏中menu的menuItem的字体颜色,有没有办法可以不改变主题颜色,仅仅是修改menuItem的字体颜色?style再声明...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 115,079
精华内容 46,031
关键字:

在android中使用menu