从零开始水安卓——高级UI组件5(Menus)

 

Options menu

选项菜单

实现步骤

简单过一遍

1、重写onCreateOptionsMenu(Menu menu),菜单第一打开时调用

2、调用Menu的add()方法添加菜单项(MenuItem),同时可以调用MenuItem的setlcon()方法来为菜单项设置图标

3、当菜单项(MenuItem)被选择时,覆盖Activity的onOptionsitemSelected(Menultem item)来响应事件

具体实现

重写onCreateOptionsMenu(Menu menu)添加菜单项

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //添加菜单项 (组,选项id,排序,标题)
        menu.add(0,100,1,"第一个菜单");
        menu.add(0,200,2,"第二个菜单");
        menu.add(0,300,3,"第三个菜单");
        return true;
    }

然后...其实就可以运行了...乍一看没变化...其实菜单在右上角 三个点 那里(不同版本可能会有所差异)

然后来试着完成单击事件,需要重写onOptionsItemSelected(MenuItem item)

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        switch (id){
            case 100:
                Toast.makeText(this,"选中了第一个菜单",Toast.LENGTH_LONG).show();
                break;
            case 200:
                Toast.makeText(this,"选中了第二个菜单",Toast.LENGTH_LONG).show();
                break;
            case 300:
                Toast.makeText(this,"选中了第三个菜单",Toast.LENGTH_LONG).show();
                break;
        }
        return super.onOptionsItemSelected(item);
    }

 

OK来看下效果

然后是关于菜单填充器,可能会没有默认创建的menu文件夹...所以咱自己建一个

记得类型要选menu!!!

然后开始创建xml文件....(类型会帮你填充好的?所以上面很重要)

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item 
        android:id="@+id/t1" 
        android:title="第一个菜单"
        android:orderInCategory="100">
    </item>
    <item
        android:id="@+id/t2"
        android:title="第二个菜单"
        android:orderInCategory="200">
    </item>
    <item
        android:id="@+id/t3"
        android:title="第三个菜单"
        android:orderInCategory="300">
    </item>
</menu>

然后通过getMenuInflater().inflate(R.menu.mymenu,menu)来引用

记得注释掉!!!

可以看到效果完全一样(不过id改过了,所以点击事件可能没了)

当然代码还可以进一步修改

Context menu

效果的话类似于windows右键弹出的菜单...在手机上操作的话,就是长按...会出现一个菜单

具体实现

做在开头,这次我们简单的设置一下布局

<?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"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="长按设置背景颜色!"
        android:gravity="center"
        android:id="@+id/textview"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>
1、重写onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)

菜单项的添加和上一部分相同....可以直接add也可以通过xml

下面提供菜单项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/red"
        android:title="红"
        android:orderInCategory="100"
        >
    </item>
    <item
        android:id="@+id/blue"
        android:title="蓝"
        android:orderInCategory="200"
        >
    </item>
    <item
        android:id="@+id/green"
        android:title="绿"
        android:orderInCategory="300"
        >
    </item>

</menu>

 

2、重写onContextItemSelected(MenuItem item)

单击事件,为了实现变色,我们还得在MainActivity的开头注册组件,并且将上下文菜单注册到textview中去。

完整代码如下:

package com.example.a3_20_menus2;

import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;

//上下文菜单
public class MainActivity extends AppCompatActivity {

    private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = findViewById(R.id.textview);
        //注册上下文菜单到textview组件
        registerForContextMenu(tv);
    }

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

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.red:
                tv.setBackgroundColor(Color.RED);
                break;
            case R.id.blue:
                tv.setBackgroundColor(Color.BLUE);
                break;
            case R.id.green:
                tv.setBackgroundColor(Color.GREEN);
                break;
        }
        return super.onContextItemSelected(item);
    }
}

效果:

Popup menu

弹出式菜单,在API11及以上才可以使用。

具体实现

首先还是给个

<?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"
    tools:context=".MainActivity">

    <Button
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:id="@+id/button"
        android:text="请选择"
        android:onClick="test">
    </Button>

</android.support.constraint.ConstraintLayout>

1、既然在布局中定义了button,第一步自然是注册button。

2、准备菜单项

<?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/t1"
        android:title="第一个菜单"
        android:orderInCategory="100"
        >
    </item>
    <item
        android:id="@+id/t2"
        android:title="第二个菜单"
        android:orderInCategory="200"
        >
    </item>
    <item
        android:id="@+id/t3"
        android:title="第三个菜单"
        android:orderInCategory="300"
        >
    </item>
    
</menu>

3、为按钮书写单击事件,在单击事件中弹出菜单。

在方法中new一个PopupMenu,并获取菜单填充器

值得注意的是ifalate的第二个参数,如下,应该通过popupMenu的getMenu方法...(毕竟不是自带参数的重写方法

menuInflater.inflate(R.menu.mymenu,popupMenu.getMenu());

最后需要show一下...完整代码如下:

package com.example.a3_20_menus3;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuInflater;
import android.view.View;
import android.widget.Button;
import android.widget.PopupMenu;

public class MainActivity extends AppCompatActivity {
    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = findViewById(R.id.button);
    }
    public void test(View view){
        PopupMenu popupMenu =new PopupMenu(this,view);
        //获取菜单填充器
        MenuInflater menuInflater = popupMenu.getMenuInflater();
        menuInflater.inflate(R.menu.mymenu,popupMenu.getMenu());
        popupMenu.show();
    }
}

初步效果

进一步完善

当然,上面只是简单的菜单,没有具体的事件功能。下面为菜单项补充单击事件

首先补一句

popupMenu.setOnMenuItemClickListener(this);

然后,虽然设置了,但是如何实现呢?

所以关键——我们干脆在类里实现监听事件

小心别选错了

然后就可以重写onMenuItemClick方法了

最终代码:

package com.example.a3_20_menus3;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.PopupMenu;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements PopupMenu.OnMenuItemClickListener {
    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = findViewById(R.id.button);
    }
    public void test(View view){
        PopupMenu popupMenu =new PopupMenu(this,view);
        //获取菜单填充器
        MenuInflater menuInflater = popupMenu.getMenuInflater();
        menuInflater.inflate(R.menu.mymenu,popupMenu.getMenu());

        popupMenu.setOnMenuItemClickListener(this);
        popupMenu.show();
    }

    @Override
    public boolean onMenuItemClick(MenuItem item) {
        switch (item.getItemId()){
            case R.id.t1:
                Toast.makeText(this,"选择了第1个",Toast.LENGTH_LONG).show();
                break;
            case R.id.t2:
                Toast.makeText(this,"选择了第2个",Toast.LENGTH_LONG).show();
                break;
            case R.id.t3:
                Toast.makeText(this,"选择了第3个",Toast.LENGTH_LONG).show();
                break;
        }
        
        
        return true;
    }
}

最终效果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云无心鸟知还

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值