Android_三种常用Menu菜单(附源码)

简介: 记录一下我写菜单的代码,我写了一共有三种菜单,从常用到不常用。

记录一下我写菜单的代码,我写了一共有三种菜单,从常用到不常用。


去往三个不同菜单的按钮


package com.example.menutext;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void toOptionMenu(View view) {
        Intent intent=new Intent(this,OptionMenuActivity.class);
        startActivity(intent);
    }
    public void toContextMenu(View view) {
        Intent intent=new Intent(this,ContextMenuActivity.class);
        startActivity(intent);
    }
    public void toEjectMenu(View view) {
        Intent intent=new Intent(this,EjectMenuActivity.class);
        startActivity(intent);
    }
}


(1)选项菜单

需要


1.Menu的XML文件

首先Menu的XML文件有几个图标就有几个item,showAsAction是让图标显示在Toolbar上还是不显示在上面。

<?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/menu_local"
        android:title="定位"
        android:icon="@drawable/local"
        app:showAsAction="ifRoom"/>
    <item android:id="@+id/menu_like"
        android:title="喜欢"
        android:icon="@drawable/like"
        app:showAsAction="ifRoom"/>
    <item android:id="@+id/menu_share"
        android:title="分享"
        android:icon="@drawable/share"
        app:showAsAction="ifRoom"/>
    <item android:id="@+id/menu_report"
        android:title="举报"
        android:icon="@drawable/report"
        app:showAsAction="ifRoom"/>
</menu>


2.Java自定义Adapter代码

接下来,我还设置了一下导航栏的title以及返回图标。getSupportActionbar()方法是获取当前Activity的导航栏并返回一个对象,通过对象去设置里面的信息。


里面有两个回调方法,onCreateOptionsMenu()方法是创建一个菜单


onOptionsItemSelected()方法是对菜单里的图标进行操作,获取每个图标的id等于获取了每个菜单里的图标的信息。

package com.example.menutext;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;
public class OptionMenuActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_option_menu);
        //获取导航栏
        ActionBar actionBar = getSupportActionBar();
        actionBar.setTitle("选项菜单");
        //设置返回图标
        actionBar.setDisplayHomeAsUpEnabled(true);
    }
    //创建菜单
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //绑定menu菜单和xml文件
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.menu_option,menu);
        return super.onCreateOptionsMenu(menu);
    }
    //对菜单操作
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        int itemId = item.getItemId();
        Toast.makeText(this, item.getTitle()
                ,Toast.LENGTH_SHORT).show();
        switch (itemId){
            case R.id.menu_like:
                return true;
            case R.id.menu_local:
                return true;
            case R.id.menu_share:
                return true;
                //对返回图标进行操作
//            case android.R.id.home:
//                this.finish();
//                break;
            default:
                break;
        }
        return false;
    }
}


最后看看效果


c66203bf646b4a9f94db764e7f86608c.png


(2)上下文菜单(用了ArrayAdapter适配器)


1.Menu的XML文件

这里图个方便,menu文件都用一样的吧,就是上面已经贴出来了再贴一次吧,懒得让你们翻了

<?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/menu_local"
        android:title="定位"
        android:icon="@drawable/local"
        app:showAsAction="ifRoom"/>
    <item android:id="@+id/menu_like"
        android:title="喜欢"
        android:icon="@drawable/like"
        app:showAsAction="ifRoom"/>
    <item android:id="@+id/menu_share"
        android:title="分享"
        android:icon="@drawable/share"
        app:showAsAction="ifRoom"/>
    <item android:id="@+id/menu_report"
        android:title="举报"
        android:icon="@drawable/report"
        app:showAsAction="ifRoom"/>
</menu>


2.Layout文件主代码

然后是Layout文件主代码,挺简单的


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    tools:context=".ContextMenuActivity">
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        android:layout_gravity="center_horizontal"/>
    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>


3.Java主代码

然后就是Java主代码

package com.example.menutext;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
public class ContextMenuActivity extends AppCompatActivity {
    Button btn;
    ListView listView;
    String[] strings={"1","22","33","55","88","yuyu","huhu","momo"
,"33","55","88","yuyu","huhu","momo"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_context_menu);
        //获取组件
        btn = findViewById(R.id.button);
        listView= findViewById(R.id.lv);
        //上下文菜单和其他两个菜单不一样的是控件要想显示菜单必须注册
        registerForContextMenu(btn);
        registerForContextMenu(listView);
        //获取导航栏(和菜单无关)
        ActionBar supportActionBar = getSupportActionBar();
        supportActionBar.setTitle("上下文菜单");
        supportActionBar.setDisplayHomeAsUpEnabled(true);
        //设置适配器
        listView.setAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1,strings));
    }
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, 
                          ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        //获取menu的xml文件
        MenuInflater menuInflater = getMenuInflater();
        //xml文件和此方法绑定,才会被创建
        menuInflater.inflate(R.menu.menu_option,menu);
    }
    @Override
    public boolean onContextItemSelected(@NonNull MenuItem item) {
        //此处是点击ListView中的item中的信息,对Button用会报错
//        AdapterView.AdapterContextMenuInfo menuInfo =
//                (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
//        Toast.makeText(this, item.getTitle().toString()
//                +menuInfo.position, Toast.LENGTH_SHORT).show();
        //此处是点击Button,对ListView中的item没用
        int id = item.getItemId();
        Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show();
        return super.onContextItemSelected(item);
    }
}


最后有效果图

333.png


(3)弹出式菜单


1.Menu的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/menu_local"
        android:title="定位"
        android:icon="@drawable/local"
        app:showAsAction="ifRoom"/>
    <item android:id="@+id/menu_like"
        android:title="喜欢"
        android:icon="@drawable/like"
        app:showAsAction="ifRoom"/>
    <item android:id="@+id/menu_share"
        android:title="分享"
        android:icon="@drawable/share"
        app:showAsAction="ifRoom"/>
    <item android:id="@+id/menu_report"
        android:title="举报"
        android:icon="@drawable/report"
        app:showAsAction="ifRoom"/>
</menu>


2.Layout主布局

点击一下按钮就会弹出菜单,和上下文菜单不同的是上下文菜单要长按才能显示出来

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    tools:context=".EjectMenuActivity">
    <Button
        android:id="@+id/btn_popup"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="BU"
        android:onClick="popup" />
</LinearLayout>


3.Java主代码

而且弹出式菜单直接new出一个对象设置属性就可以了,比前面两个容易理解,也比较方便,但就是用的比较少,popupMenu的构造函数里面的参数意思是,第一个是上下文,第二个直接把形参view传进去即可,第三个参数是弹出式菜单从鼠标左边弹出来还是右边,我感觉右边比较好(还有一个中间的,但是没啥用好像),其他挺简单的就不注释了hh

package com.example.menutext;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.PopupMenu;
import android.os.Bundle;
import android.view.Gravity;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class EjectMenuActivity extends AppCompatActivity {
    Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_eject_menu);
        btn = findViewById(R.id.btn_popup);
        ActionBar supportActionBar = getSupportActionBar();
        supportActionBar.setTitle("弹出式菜单");
        supportActionBar.setDisplayHomeAsUpEnabled(true);
    }
    public void popup(View view) {
        PopupMenu popupMenu=new PopupMenu(this,view, Gravity.RIGHT);
        popupMenu.inflate(R.menu.menu_option);
        popupMenu.show();
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                int itemId = item.getItemId();
                Toast.makeText(EjectMenuActivity.this,item.getTitle(), Toast.LENGTH_SHORT).show();
                return false;
            }
        });
    }
}


最后上效果图

444.png

目录
相关文章
|
3月前
|
XML API Android开发
码农之重学安卓:利用androidx.preference 快速创建一、二级设置菜单(demo)
本文介绍了如何使用androidx.preference库快速创建具有一级和二级菜单的Android设置界面的步骤和示例代码。
125 1
码农之重学安卓:利用androidx.preference 快速创建一、二级设置菜单(demo)
|
3月前
|
Ubuntu 开发工具 Android开发
Repo下载AOSP源码:基于ubuntu22.04 环境配置,android-12.0.0_r32
本文介绍了在基于Ubuntu 22.04的环境下配置Python 3.9、安装repo工具、下载和同步AOSP源码包以及处理repo同步错误的详细步骤。
244 0
Repo下载AOSP源码:基于ubuntu22.04 环境配置,android-12.0.0_r32
|
5月前
|
XML Java Android开发
34. 【Android教程】菜单:Menu
34. 【Android教程】菜单:Menu
116 2
|
5月前
|
开发工具 Android开发 开发者
Android Studio中两个让初学者崩溃菜单
Android Studio中两个让初学者崩溃菜单
56 0
|
3月前
|
API Android开发
Android使用AlertDialog实现弹出菜单
本文分享了在Android开发中使用AlertDialog实现弹出菜单的方法,并通过代码示例和错误处理,展示了如何避免因资源ID找不到导致的crash问题。
67 1
|
3月前
|
开发工具 git 索引
repo sync 更新源码 android-12.0.0_r34, fatal: 不能重置索引文件至版本 ‘v2.27^0‘。
本文描述了在更新AOSP 12源码时遇到的repo同步错误,并提供了通过手动git pull更新repo工具来解决这一问题的方法。
132 1
|
3月前
|
Android开发 Docker 容器
docker中编译android aosp源码,出现Build sandboxing disabled due to nsjail error
在使用Docker编译Android AOSP源码时,如果遇到"Build sandboxing disabled due to nsjail error"的错误,可以通过在docker run命令中添加`--privileged`参数来解决权限不足的问题。
707 1
|
3月前
|
开发工具 uml git
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
本文分享了下载AOSP源码的方法,包括如何使用repo工具和处理常见的repo sync错误,以及配置Python环境以确保顺利同步特定版本的AOSP代码。
472 0
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
|
3月前
|
Java Android开发 芯片
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
本文介绍了如何将基于全志H713芯片的AOSP Android源码导入Android Studio以解决编译和编码问题,通过操作步骤的详细说明,展示了在Android Studio中利用代码提示和补全功能快速定位并修复编译错误的方法。
143 0
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
|
3月前
|
Android开发
我的Android 进阶修炼(1): AOSP源码根目录结构
本文介绍了AOSP源码的根目录结构,提供了基于MTK9269 Android 9.0源码的目录说明,帮助读者了解AOSP源码的组织方式和各目录的功能。
189 0
我的Android 进阶修炼(1): AOSP源码根目录结构
下一篇
无影云桌面