Android-0. Android studio-Menu基础示例

目录

如何创建menu布局文件

选项菜单(Options Menu)

弹出菜单(Popup Menu)

上下文菜单(Context Menu)

针对ListView的每一项绑定上下文菜单


如何创建menu布局文件

在android studio项目中想要添加menu布局文件,无法直接创建,必须先创建一个menu文件夹,先在res文件夹右键,然后如图所示:

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

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

 

选项菜单(Options Menu)

当用户触发menu项时弹出的菜单

 menu->main.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/font_group"
        android:orderInCategory="3"
        android:title="设置字体大小">
        <!--设置子菜单-->
        <menu>
            <item
                android:id="@+id/action_add"
                android:title="增大字体">
            </item>
            <item
                android:id="@+id/action_sub"
                android:title="减小字体">
            </item>
        </menu>
    </item>
    <item
        android:id="@+id/action_color"
        android:orderInCategory="2"
        android:title="设置字体颜色">
    </item>

    <item
        android:id="@+id/action_style"
        android:orderInCategory="1"
        android:title="设置字体样式">
    </item>
</menu>

使用ctrl+F12可以查看menu的简单效果

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="16dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="16dp"
    tools:context="com.studio.optionsmenudemo.MainActivity">
    <TextView
        android:id = "@+id/tv_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="操作字体"
        android:textSize="20sp"
        />
</android.support.constraint.ConstraintLayout>

MainActivity.java:
 

public class MainActivity extends AppCompatActivity {

    private TextView tvShow;
    private float fontSize = 20.0f;
    private static final int ITEMID = 4;// 菜单项id
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvShow = (TextView) findViewById(R.id.tv_show);
        tvShow.setTextSize(fontSize);//设置初始字体大小
    }

    /**
     * 表示当activity创建选项菜单时回调的方法
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //MenuInflater inflater = getMenuInflater();
        //inflater.inflate(R.menu.main,menu);
        //创建菜单的第一种方式 xml文件
        getMenuInflater().inflate(R.menu.main, menu);

        //创建菜单的代码添加方式
        // add(groupId 菜单项分组,ItemId 菜单项唯一标示id,order 表示菜单项的排序,菜单项展示的文本)
        menu.add(Menu.NONE, ITEMID, Menu.NONE, "设置字体");
        MenuItem item = menu.findItem(R.id.action_style);
        //2.快速绑定菜单某一项的方式
        item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
                return false;
            }
        });
        return true;
    }

    /**
     * 绑定Options Menu的事件
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int itemid = item.getItemId();// 获取当前点击菜单的资源ID
        switch (itemid){
            case R.id.font_group:
                fontSize += 5;
                tvShow.setTextSize(fontSize);//设置字体大小
                break;
            case R.id.action_color:
                //随机生成颜色
                int red = (int)(Math.random()*256);
                int green = (int)(Math.random()*256);
                int blue = (int)(Math.random()*256);
                tvShow.setTextColor(Color.rgb(red,green,blue));
                break;
        }
        return  super.onOptionsItemSelected(item);
    }
}

效果,点击竖着的小三点,弹出菜单:

 

弹出菜单(Popup Menu)

当用户点击某个view视图时弹出的菜单

menu->main.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@+id/action_font"
        android:title="操作字体大小">
        <menu>
            <item android:id="@+id/action_add" android:title="增大字体"></item>
            <item android:id="@+id/action_sub" android:title="减小字体"></item>
        </menu>
    </item>
    <item android:id="@+id/action_backgroud"
        android:title="操作背景">
    </item>
</menu>

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.studio.popupmenudemo.MainActivity">
    <Button
        android:id="@+id/btn_top"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="点我"
        android:textColor="#fff"
        android:background="#83b74c"
        android:onClick="showMenu"/>
    <TextView
        android:id="@+id/tvInfo"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:background="#e9e8e9"
        android:layout_marginTop="15dp"
        android:text="Hello World!"
        android:layout_below="@id/btn_top"/>
</RelativeLayout>

MainActivity.java:

public class MainActivity extends AppCompatActivity {
    private TextView tviInfo;
    private float fontSize = 15.0f;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tviInfo = (TextView) findViewById(R.id.tvInfo);
        tviInfo.setTextSize(fontSize);
    }
    /*
    点击按钮弹出菜单
     */
    public void showMenu(View view) {
        //创建PopupMenu对象
        PopupMenu popupMenu = new PopupMenu(this, view);
        //加载popupMenu xml文件
        getMenuInflater().inflate(R.menu.main, popupMenu.getMenu());
        //表示菜单选项被点击时触发的事件
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.action_add:
                        fontSize += 5;
                        tviInfo.setTextSize(fontSize);
                        break;
                    case R.id.action_sub:
                        fontSize -= 5;
                        tviInfo.setTextSize(fontSize);
                        break;
                    case R.id.action_backgroud:
                        int red = (int) (Math.random() * 256);
                        int green = (int) (Math.random() * 256);
                        int blue = (int) (Math.random() * 256);
                        tviInfo.setBackgroundColor(Color.rgb(red, green, blue));
                        break;
                }
                return false;
            }
        });
        //显示popupMenu
        popupMenu.show();
    }
}

注意不要漏掉最后的popupMenu.show()

效果,点击点我view,弹出菜单:

 

上下文菜单(Context Menu)

用户长按控件时弹出的类似对话框,和上面的Pop Menu是不同的,它需要长按,另外,它出现的位置和点击位置相关

 menu->main.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/action_width"
           android:orderInCategory="100"
         android:title="获取TextView的宽度">
    </item>

    <item android:id="@+id/action_height"
         android:orderInCategory="101"
        android:title="获取Textview的高度">
    </item>
</menu>

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="16dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="16dp"
    tools:context="com.studio.contextmenudemo.MainActivity">

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="点击我"
        android:layout_centerInParent="true"
        android:textColor="#fff"
        android:background="#f2c317"
        android:textSize="25sp"
        android:gravity="center"/>
</RelativeLayout>

MainActivity.java:

public class MainActivity extends AppCompatActivity {
    private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tv);
        //注册绑定上下文菜单
        registerForContextMenu(tv);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        getMenuInflater().inflate(R.menu.main,menu);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.action_width:
                setTitle("TextView的宽度是:"+tv.getWidth());//设置标题栏的内容
                break;
            case R.id.action_height:
                setTitle("TextView的高度是:"+tv.getHeight());
                break;
        }
        return super.onContextItemSelected(item);
    }
}

效果,长按点击我,弹出菜单,位置和点击位置相关:

针对ListView的每一项绑定上下文菜单

 menu->main.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/action_add"
          android:title="Add"
         android:orderInCategory="4">
    </item>

    <item android:id="@+id/action_update"
         android:title="Update"
        android:orderInCategory="2">
    </item>

    <item android:id="@+id/action_del"
          android:title="Delete"
        android:orderInCategory="3">
    </item>
</menu>

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="16dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="16dp"
    tools:context="com.studio.contextmenulist.MainActivity">

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</RelativeLayout>

MainActivity.java:

public class MainActivity extends AppCompatActivity {
    private ListView lv;
    private List<String> list;
    private ArrayAdapter<String> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv = (ListView) findViewById(R.id.lv);

        list = new ArrayList<String>();
        for (int i = 0; i < 20; i++) {
            list.add("hgy item" + i);
        }
        adapter=new ArrayAdapter<String>(MainActivity.this,
                android.R.layout.simple_list_item_1,list);
        lv.setAdapter(adapter);
        //需要绑定listview的上下文菜单
        registerForContextMenu(lv);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        getMenuInflater().inflate(R.menu.main,menu);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_del://需要将当前的item在listview中移除
                AdapterView.AdapterContextMenuInfo menuInfo =
                        (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
                //获取当前操作的item的下标
                int position = menuInfo.position;
                list.remove(position);
                adapter.notifyDataSetChanged();
                break;
        }
        return super.onContextItemSelected(item);
    }
}

效果,长按某一项,会弹出上下文菜单,如下图:

可能有人发现了,Add明明写在最前面,但却显示在最后面,这是因为它们设置了 android:orderInCategory,值越小,越靠前

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值