Android学习之路---Menu综合

一:选项菜单

1.选项菜单的实现步骤:

1)覆盖Activity的onCreateOptionsMenu(Menu menu)方法,当菜单第一次被打开时调用;
(2)调用Menu的add()方法添加菜单项(MenuItem),同时可以调用MenuItem的setIcon()方法来为菜单设置图片;
(3)当菜单项(MenuItem)被选择时,覆盖Activity的;onOptionsItemSelected(MenuItem item)来响应事件。

2.选项菜单的实现方法:

(1)使用代码方式:

主要在onCreateOptionsMenu(Menu menu)使用menu.add()方法来添加菜单项;
重写onOptionsItemSelected(MenuItem item)方法来实现单击菜单选项事件;

public class MenuTest extends AppCompatActivity {

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

    /**
     * 菜单选项的单击事件处理
     * @param item
     * @return
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id=item.getItemId();
        switch (id){
            case 100:
                Toast.makeText(this,"游戏开始!...",Toast.LENGTH_SHORT).show();
                break;
            case 200:
                Toast.makeText(this,"设置游戏...",Toast.LENGTH_SHORT).show();
                break;
            case 300:
                Toast.makeText(this,"游戏结束!...",Toast.LENGTH_SHORT).show();
                break;
            default:break;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * 用于创建选项菜单的事件方法,在打开界面时,会被自动调用
     * @param menu
     * @return
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //(组ID,选项ID,排序顺序,菜单项名称)
        menu.add(0,100,1,"开始游戏");
        menu.add(0,200,2,"游戏设置");
        menu.add(0,300,3,"游戏结束");
        return super.onCreateOptionsMenu(menu);
    }
}

效果图:

(2)使用XML文件方式:(更推荐)

需要在res目录下创建menu文件夹,创建xml文件作为菜单项;
在代码中通过getMenuInflater().inflate(R.menu.menu_main,menu);得到选项菜单;
重写onOptionsItemSelected(MenuItem item)方法来实现单击菜单选项事件;

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">
    <!--
    android:orderInCategory用来设置排列顺序,数字越小优先级越高
    android:title用来设置菜单选项名称
    app:showAsAction用来设置显示方式
    android:icon用来设置选项图片
    -->
    <item
        android:id="@+id/game_settings"
        android:orderInCategory="100"
        android:title="游戏设置"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/game_start"
        android:orderInCategory="200"
        android:title="游戏开始"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/game_end"
        android:orderInCategory="300"
        android:title="游戏结束"
        app:showAsAction="ifRoom" />
</menu>

主类代码:

public class MenuTest extends AppCompatActivity {

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

    /**
     * 菜单选项的单击事件处理
     * @param item
     * @return
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id=item.getItemId();
        switch (id){
            case R.id.game_start:
                Toast.makeText(this,"游戏开始!...",Toast.LENGTH_SHORT).show();
                break;
            case R.id.game_settings:
                Toast.makeText(this,"设置游戏...",Toast.LENGTH_SHORT).show();
                break;
            case R.id.game_end:
                Toast.makeText(this,"游戏结束!...",Toast.LENGTH_SHORT).show();
                break;
            default:break;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * 用于创建选项菜单的事件方法,在打开界面时,会被自动调用
     * @param menu
     * @return
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main,menu);
        return super.onCreateOptionsMenu(menu);
    }
}

效果图:

  • xml文件中 app:showAsAction=”never”和”(1)使用代码方式一样”

  • xml文件中为app:showAsAction=”ifRoom”

  • xml文件中为app:showAsAction=”always”

二:上下文菜单

 1.上下文菜单与上下文环境有关,类似于Windows中的右键单击弹出的快捷菜单,操作时需要长时间按住某个东西不放,之后会弹出菜单。
 2.创建上下文菜单的步骤:

(1)覆盖Activity的onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)方法,调用Menu的add()方法添加菜单项(MenuItem); 
(2)覆盖Activity的onContextItemSelected(MenuItem item)来响应事件;
(3)调用registerForContextMenu()方法来为视图注册上下文菜单。

 3.代码简介:

menu xml文件:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/red"
        android:orderInCategory="100"
        android:title="红色"/>
    <item
        android:id="@+id/blue"
        android:orderInCategory="200"
        android:title="蓝色"/>
    <item
        android:id="@+id/green"
        android:orderInCategory="300"
        android:title="绿色"/>
</menu>

主类代码:

public class ContextMenuTest extends AppCompatActivity {

    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_context_menu_test);
        textView= (TextView) findViewById(R.id.textView_changeColor);
        //注册上下文 菜单
        registerForContextMenu(textView);
    }

    /**
     * 创建上下文菜单的事件方法
     * @param menu
     * @param v
     * @param menuInfo
     */
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        //也可使用menu.add()方法添加菜单项
        getMenuInflater().inflate(R.menu.change_color,menu);
    }

    /**
     * 上下文菜单的单击事件
     * @param item
     * @return
     */
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        int id=item.getItemId();
        switch (id){
            case R.id.red:
                textView.setTextColor(Color.RED);
                break;
            case R.id.blue:
                textView.setTextColor(Color.BLUE);
                break;
            case R.id.green:
                textView.setTextColor(Color.GREEN);
                break;
            default:
                break;
        }
        return super.onContextItemSelected(item);
    }
}

效果图:

三:弹出式菜单

  1.弹出菜单是停靠在一个View上的模式菜单。如果View对象下方有空间,那么弹出菜单将显示在停靠对象的下方,否则会显示在上方。
  
  2.实现方法:

menu xml文件:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/small"
        android:orderInCategory="100"
        android:title="小号" />
    <item
        android:id="@+id/medium"
        android:orderInCategory="200"
        android:title="中号" />
    <item
        android:id="@+id/large"
        android:orderInCategory="300"
        android:title="大号" />
</menu>

主类代码:

public class PopupMenuTest extends AppCompatActivity {

    private Button buttonSelected;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_popup_menu_test);
        buttonSelected = (Button) findViewById(R.id.button);

    }

    /**
     * 按钮的单击事件
     *
     * @param view
     */
    public void typeSizeClick(View view) {
        PopupMenu popupMenu=new PopupMenu(this,view);//直接创建PopupMenu弹出式菜单
        MenuInflater inflater=popupMenu.getMenuInflater();//获取填充器
        inflater.inflate(R.menu.popup_menu,popupMenu.getMenu());//填充菜单

        //设置菜单选项的单击事件
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                int id=item.getItemId();
                switch (id){
                    case R.id.small:
                        Toast.makeText(PopupMenuTest.this,"你选择了小号",Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.large:
                        Toast.makeText(PopupMenuTest.this,"你选择了大号",Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.medium:
                        Toast.makeText(PopupMenuTest.this,"你选择了中号",Toast.LENGTH_SHORT).show();
                        break;
                    default:break;
                }
                return true;
            }
        });

        popupMenu.show();//切记show()
    }
}

效果图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值