安卓:三种菜单的使用方式(附带整体代码,学习留存)(java)

目录

0.准备:创建item_menu, 之后的菜单都是以这个item_menu为基础的

1. 选项菜单

整体代码如下:

2.上下文菜单

整体代码如下:

activity_menu XML文件

3.弹出式菜单

整体代码如下:

activity_menu XML文件

三合一整体代码如下:

activity_menu XML文件

item_menu XML文件

接下来运行一下MenuActivity就可以了(*^_^*)。tips:学习留存使用,欢迎积极的交流和批评指正。(ง •_•)ง


0.准备:创建item_menu, 之后的菜单都是以这个item_menu为基础的

  1. 创建menu源文件new resource directory 选择menu

  2. 在menu 下创建 menu resource file

  3. menu是整个菜单,item是菜单中的项,item套menu就是菜单中套子菜单,相当于点击菜单后显示第一级的item(文件,编辑,视图),点击第一级的item中的子菜单menu后(点击文件)显示子菜单的item(复制,粘贴),android:title就是菜单中的一个个item选项的名称

  4. 以文件复制粘贴功能为例

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:id="@+id/file" android:title="文件">
            <menu>
                <item android:id="@+id/file_copy" android:title="复制"/>
                <item android:id="@+id/file_paste" android:title="粘贴"/>
            </menu>
        </item>
        <item android:id="@+id/edit" android:title="编辑"/>
        <item android:id="@+id/view" android:title="视图"/>
    </menu>
  5. 新建package menu

  6. 新建MenuActivity

1. 选项菜单

  1. onCreate方法

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_menu);
        }
  2. 重写onCreateOptionsMenu方法创建menu 此方法用于创建选项菜单,getMenuInflater().inflate()用于把刚刚写过的item_menu与系统菜单menu对象绑定在一起,这样菜单中显示的就是刚刚咱们写的item_menu的布局,此方法会被系统自动调用

    //选项菜单,系统会自动调用这两个方法
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            //关联资源,相当于把R.item_menu.xml文件里面的内容加载到menu对象中
            getMenuInflater().inflate(R.menu.item_menu, menu);
            return super.onCreateOptionsMenu(menu);
        }
  3. 重写onOptionsItemSelected 此方法用于实现点击菜单中的其中一个item后进行什么样的操作, 此处作演示, 就通知一下item的名称,在点击时此方法会被系统自动调用

    //选中后要通知
        @Override
        public boolean onOptionsItemSelected(@NonNull MenuItem item) {
            //当选择这个item后,通知
            ToastUtil.show(this,item.getTitle().toString());
            return super.onOptionsItemSelected(item);
        }
  4. 源文件下的values里的theme里的noActionBar删掉否则会不显示,因为和选项的三个点一行的叫做ActionBar

  5. 运行一下点击右上角菜单(三个点)

    整体代码如下:

    package menu;
    ​
    import androidx.annotation.NonNull;
    import androidx.appcompat.app.AppCompatActivity;
    ​
    import android.content.ClipData;
    import android.content.ClipboardManager;
    import android.content.Context;
    import android.os.Bundle;
    import android.view.ContextMenu;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.PopupMenu;
    ​
    import com.example.notification.R;
    import com.example.notification.utils.ToastUtil;
    ​
    public class MenuActivity extends AppCompatActivity {
    ​
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_menu);
        }
    ​
        //选项菜单,系统会自动调用这两个方法
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            //关联资源,相当于把R.item_menu.xml文件里面的内容加载到menu对象中
            getMenuInflater().inflate(R.menu.item_menu, menu);
            return super.onCreateOptionsMenu(menu);
        }
        //选中后要通知
        @Override
        public boolean onOptionsItemSelected(@NonNull MenuItem item) {
            //当选择这个item后,通知
            ToastUtil.show(this,item.getTitle().toString());
            return super.onOptionsItemSelected(item);
        }
    }

2.上下文菜单

  1. 在activity_menu XML文件中加入两个文本输入框作演示,将复制内容的文本框内容复制后粘贴至粘贴文本框中

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 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="menu.MenuActivity"
        android:orientation="vertical">
        <EditText
            android:id="@+id/edt_copy"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="20sp"
            android:hint="复制内容"/>
        <EditText
            android:id="@+id/edt_paste"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="20sp"
            android:hint="粘贴内容" />
    </LinearLayout>
  2. onCreate方法, registerForContextMenu()方法用于注册上下文菜单,为这两个文本框中注册上下文菜单,之后才能在文本框处长按后出现上下文菜单

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_menu);
            initViews();
            //注册上下文菜单
            registerForContextMenu(edt_copy);
            registerForContextMenu(edt_paste);
            }
  3. initViews方法,注意要将作用域提高到整个类

    private void initViews() {
            edt_copy = findViewById(R.id.edt_copy);
            edt_paste = findViewById(R.id.edt_paste);
        }
  4. 重写onCreateContextMenu方法 此方法用于创建上下文菜单,getMenuInflater().inflate()用于将咱们写的item_menu与系统的上下文菜单menu对象绑定在一起,系统自动调用

    //上下文菜单
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            //关联菜单
            getMenuInflater().inflate(R.menu.item_menu, menu);
            super.onCreateContextMenu(menu, v, menuInfo);
        }
  5. 重写onContextItemSelected方法 此方法用于实现点击菜单中的其中一个item后进行什么样的操作 ,此处作演示,实现将复制文本框中的内容复制然后粘贴至粘贴文本框

    //选中这个上下文菜单中的选项
        @Override
        public boolean onContextItemSelected(@NonNull MenuItem item) {
            //获取点击item的id
            int id = item.getItemId();
            //获取系统剪切板
            ClipboardManager cm = (ClipboardManager) getSystemService((Context.CLIPBOARD_SERVICE));
            //选中菜单中的复制
            if(id==R.id.file_copy){
                //将文本复制到剪切板中
                //类似于map形式,key对应复制的内容value (key,value)
                cm.setPrimaryClip(ClipData.newPlainText("msg",edt_copy.getText().toString()));
                ToastUtil.show(this,"复制成功");
            }
            //选中菜单中的粘贴
            if(id==R.id.file_paste){
                //获取剪切板的内容并且粘贴至粘贴文本框
                edt_paste.setText(cm.getPrimaryClip().getItemAt(0).getText());
            }
            return super.onContextItemSelected(item);
        }
  6. 运行一下,在输入文本框中输入内容,长按后复制,长按粘贴文本框并粘贴

    整体代码如下:

    MenuActivity类(包不一定准确)
    package menu;
    ​
    import androidx.annotation.NonNull;
    import androidx.appcompat.app.AppCompatActivity;
    ​
    import android.content.ClipData;
    import android.content.ClipboardManager;
    import android.content.Context;
    import android.os.Bundle;
    import android.view.ContextMenu;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.PopupMenu;
    ​
    import com.example.notification.R;
    import com.example.notification.utils.ToastUtil;
    ​
    public class MenuActivity extends AppCompatActivity {
    ​
        private EditText edt_copy;
        private EditText edt_paste;
    ​
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_menu);
            initViews();
            //注册上下文菜单
            registerForContextMenu(edt_copy);
            registerForContextMenu(edt_paste);
        }
    ​
        private void initViews() {
            edt_copy = findViewById(R.id.edt_copy);
            edt_paste = findViewById(R.id.edt_paste);
        }
        //上下文菜单
        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            getMenuInflater().inflate(R.menu.item_menu, menu);
            super.onCreateContextMenu(menu, v, menuInfo);
        }
        //选中这个上下文菜单中的选项
        @Override
        public boolean onContextItemSelected(@NonNull MenuItem item) {
            int id = item.getItemId();
            //获取系统剪切板
            ClipboardManager cm = (ClipboardManager) getSystemService((Context.CLIPBOARD_SERVICE));
            //选中菜单中的复制
            if(id==R.id.file_copy){
                //将文本复制到剪切板中
                //类似于map形式,key对应复制的内容value (key,value)
                cm.setPrimaryClip(ClipData.newPlainText("msg",edt_copy.getText().toString()));
                ToastUtil.show(this,"复制成功");
            }
            //选中菜单中的粘贴
            if(id==R.id.file_paste){
                //获取剪切板的内容
                edt_paste.setText(cm.getPrimaryClip().getItemAt(0).getText());
            }
            return super.onContextItemSelected(item);
        }
    }
    activity_menu XML文件
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 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="menu.MenuActivity"
        android:orientation="vertical">
    ​
        <EditText
            android:id="@+id/edt_copy"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="20sp"
            android:hint="复制内容"/>
        <EditText
            android:id="@+id/edt_paste"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="20sp"
            android:hint="粘贴内容" />
    </LinearLayout>
     

3.弹出式菜单

  1. 在activity_menu XML文件中加入按钮

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 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="menu.MenuActivity"
        android:orientation="vertical">
        
        <Button
            android:id="@+id/btn_popupmenu"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="弹出式菜单"
            android:textSize="20sp"/>
    </LinearLayout>
  2. onCreate方法 给点击按钮设置事件,事件为弹出菜单

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_menu);
            initViews();
            
            //给这个按钮设置点击事件
            btn_popupmenu.setOnClickListener(V->{
                //创建弹出式菜单,点击后在按钮处弹出菜单
                PopupMenu popupMenu = new PopupMenu(MenuActivity.this,btn_popupmenu);
                //关联菜单
                popupMenu.getMenuInflater().inflate(R.menu.item_menu,popupMenu.getMenu());
                //设置点击事件
                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                //点击后通知一下点击的哪一个
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        ToastUtil.show(MenuActivity.this,item.getTitle().toString());
                        return false;
                    }
                });
                popupMenu.show();
            });
        }
  3. initViews方法,注意要将作用域提高到整个类

    private void initViews() {
            btn_popupmenu = findViewById(R.id.btn_popupmenu);
        }

    整体代码如下:

    MenuActivity类(包不一定准确)
    package menu;
    ​
    import androidx.annotation.NonNull;
    import androidx.appcompat.app.AppCompatActivity;
    ​
    import android.content.ClipData;
    import android.content.ClipboardManager;
    import android.content.Context;
    import android.os.Bundle;
    import android.view.ContextMenu;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.PopupMenu;
    ​
    import com.example.notification.R;
    import com.example.notification.utils.ToastUtil;
    ​
    public class MenuActivity extends AppCompatActivity {
    ​
        private Button btn_popupmenu;
    ​
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_menu);
            initViews();
            
            //给这个按钮设置点击事件
            btn_popupmenu.setOnClickListener(V->{
                //创建弹出式菜单,点击后在按钮处弹出菜单
                PopupMenu popupMenu = new PopupMenu(MenuActivity.this,btn_popupmenu);
                //关联菜单
                popupMenu.getMenuInflater().inflate(R.menu.item_menu,popupMenu.getMenu());
                //设置点击事件
                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        ToastUtil.show(MenuActivity.this,item.getTitle().toString());
                        return false;
                    }
                });
                popupMenu.show();
            });
        }
    ​
        private void initViews() {
            btn_popupmenu = findViewById(R.id.btn_popupmenu);
        }
    }
    activity_menu XML文件
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 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="menu.MenuActivity"
        android:orientation="vertical">
        
        <Button
            android:id="@+id/btn_popupmenu"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="弹出式菜单"
            android:textSize="20sp"/>
    </LinearLayout>

三合一整体代码如下:

package menu;
​
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
​
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.PopupMenu;
​
import com.example.notification.R;
import com.example.notification.utils.ToastUtil;
​
public class MenuActivity extends AppCompatActivity {
​
    private EditText edt_copy;
    private EditText edt_paste;
    private Button btn_popupmenu;
​
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);
        initViews();
        //注册上下文菜单
        registerForContextMenu(edt_copy);
        registerForContextMenu(edt_paste);
​
        //给这个按钮设置点击事件
        btn_popupmenu.setOnClickListener(V->{
            //创建弹出式菜单,点击后在按钮处弹出菜单
            PopupMenu popupMenu = new PopupMenu(MenuActivity.this,btn_popupmenu);
            //关联菜单
            popupMenu.getMenuInflater().inflate(R.menu.item_menu,popupMenu.getMenu());
            //设置点击事件
            popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    ToastUtil.show(MenuActivity.this,item.getTitle().toString());
                    return false;
                }
            });
            popupMenu.show();
        });
    }
​
    private void initViews() {
        edt_copy = findViewById(R.id.edt_copy);
        edt_paste = findViewById(R.id.edt_paste);
        btn_popupmenu = findViewById(R.id.btn_popupmenu);
    }
​
    //选项菜单,系统会自动调用这两个方法
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //关联资源,相当于把R.item_menu.xml文件里面的内容加载到menu对象中
        getMenuInflater().inflate(R.menu.item_menu, menu);
        return super.onCreateOptionsMenu(menu);
    }
    //选中后要通知
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        //当选择这个item后,通知
        ToastUtil.show(this,item.getTitle().toString());
        return super.onOptionsItemSelected(item);
    }
​
    //上下文菜单
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        getMenuInflater().inflate(R.menu.item_menu, menu);
        super.onCreateContextMenu(menu, v, menuInfo);
    }
    //选中这个上下文菜单中的选项
    @Override
    public boolean onContextItemSelected(@NonNull MenuItem item) {
        int id = item.getItemId();
        //获取系统剪切板
        ClipboardManager cm = (ClipboardManager) getSystemService((Context.CLIPBOARD_SERVICE));
        //选中菜单中的复制
        if(id==R.id.file_copy){
            //将文本复制到剪切板中
            //类似于map形式,key对应复制的内容value (key,value)
            cm.setPrimaryClip(ClipData.newPlainText("msg",edt_copy.getText().toString()));
            ToastUtil.show(this,"复制成功");
        }
        //选中菜单中的粘贴
        if(id==R.id.file_paste){
            //获取剪切板的内容
            edt_paste.setText(cm.getPrimaryClip().getItemAt(0).getText());
        }
        return super.onContextItemSelected(item);
    }
}

activity_menu XML文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="menu.MenuActivity"
    android:orientation="vertical">
​
    <EditText
        android:id="@+id/edt_copy"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:hint="复制内容"/>
    <EditText
        android:id="@+id/edt_paste"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:hint="粘贴内容" />
​
    <Button
        android:id="@+id/btn_popupmenu"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="弹出式菜单"
        android:textSize="20sp"/>
</LinearLayout>

item_menu XML文件

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/file" android:title="文件">
        <menu>
            <item android:id="@+id/file_copy" android:title="复制"/>
            <item android:id="@+id/file_paste" android:title="粘贴"/>
        </menu>
    </item>
    <item android:id="@+id/edit" android:title="编辑"/>
    <item android:id="@+id/view" android:title="视图"/>
</menu>

接下来运行一下MenuActivity就可以了(*^_^*)。
tips:学习留存使用,欢迎积极的交流和批评指正。(ง •_•)ง

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Aayasu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值