学习Android的第二十二天

目录

[Android ContextMenu 上下文菜单](#Android ContextMenu 上下文菜单)

ContextMenu

范例

参考文档

[Android SubMenu 子菜单](#Android SubMenu 子菜单)

范例

参考文档

[Android PopupMenu 弹出菜单](#Android PopupMenu 弹出菜单)

范例

参考文档


Android ContextMenu 上下文菜单

在Android开发中,ContextMenu(上下文菜单)为用户提供了一种简便的方式来执行对特定组件的操作。例如,长按列表中的一个项目时,可能会出现一个菜单,让用户选择"编辑"、"删除"等操作。

ContextMenu

Android提供了一种非常简单的方式来创建和处理上下文菜单(ContextMenu),主要通过在Activity中重写几个关键方法来实现。

这种方式不依赖于XML布局文件或是直接实例化某个类,而是通过与Activity生命周期紧密相关的几个回调方法来管理。

  1. registerForContextMenu(View view)
  • 说明:这个方法用于为特定的View注册上下文菜单。当用户长按该View时,就会触发上下文菜单的显示。
  • 使用场景:通常在Activity的onCreate()方法中调用此方法,为想要显示上下文菜单的View注册。
  1. onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)
  • 说明:当注册了上下文菜单的View被长按时,这个方法会被调用。在这里,你可以定义上下文菜单的内容,比如菜单项。
  • 使用场景:需要重写这个方法来填充上下文菜单,例如添加菜单项。
  1. onContextItemSelected(MenuItem item)
  • 说明:用户选择上下文菜单中的某个项时,这个方法会被触发。在这里,你可以处理用户的点击事件。
  • 使用场景:需要重写这个方法来响应用户对上下文菜单项的选择。

调用顺序和流程

  1. 注册上下文菜单:在onCreate()方法中,通过调用registerForContextMenu(view)为特定的View注册上下文菜单。
  2. 创建上下文菜单:当用户长按已注册的View时,会自动调用onCreateContextMenu(menu, v, menuInfo)方法,在这里定义上下文菜单的内容。
  3. 响应菜单项点击:用户点击上下文菜单中的某个项时,onContextItemSelected(MenuItem item)方法会被调用,在这里处理点击事件。

范例

1、修改 activity_main.xml

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">
    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

2、修改 MainActivity.java

java 复制代码
package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    ListView listView;
    String[] items = {"Java", "C#", "Python", "Ruby", "PHP", "C++", "Go", "Swift", "Kotlin", "JavaScript"};

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

        listView = findViewById(R.id.listview);
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, items);
        listView.setAdapter(adapter);

        // 注册 Context Menu
        registerForContextMenu(listView);
    }

    // 创建 Context Menu
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        getMenuInflater().inflate(R.menu.context_menu, menu);
    }

    // 处理 Context Menu 项点击事件
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
        int itemId = item.getItemId();
        if (itemId == R.id.action_edit) {
            Toast.makeText(this, "编辑 " + items[info.position], Toast.LENGTH_SHORT).show();
            return true;
        } else if (itemId == R.id.action_delete) {
            Toast.makeText(this, "删去 " + items[info.position], Toast.LENGTH_SHORT).show();
            return true;
        } else {
            return super.onContextItemSelected(item);
        }
    }
}

3、在res/menu目录下创建一个名为context_menu.xml的文件(如果没有menu目录,则需要创建它)。

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/action_edit"
        android:title="编辑"/>
    <item
        android:id="@+id/action_delete"
        android:title="删去"/>
</menu>

参考文档

  1. Android menus

在Android开发中,SubMenu(子菜单)是一种常用的UI组件,允许在一个主菜单项下创建一个二级菜单。这对于分类和组织复杂的菜单项非常有用,可以帮助用户更好地导航应用的功能。(子菜单不是单独存在的,而是在 OptionMenu 或者 ContextMenu 中可以添加子菜单)

范例

1、创建菜单资源文件

首先,需要在res/menu目录下创建一个XML文件来定义菜单项,比如main_menu.xml。

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- checkableBehavior 的可选值由三个:single设置为单选,all为多选,none为普通选项 -->
    <group android:checkableBehavior="none">
        <item android:id="@+id/create"
            android:title="新建" />
        <item android:id="@+id/edit"
            android:title="编辑" />
    </group>
    <item android:id="@+id/saveall"
        android:title="子菜单" >
        <menu xmlns:android="http://schemas.android.com/apk/res/android">
            <item android:id="@+id/save"
                android:title="保存" />
            <item android:id="@+id/save_as"
                android:title="另存为..." />
            <item
                android:id="@+id/save_all"
                android:title="保存全部" />
        </menu>
    </item>
    <item android:id="@+id/help"
        android:title="帮助" />
</menu>

2、修改 activity_main.xml

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/btn_pop"
        android:text="长按我弹出上下文菜单"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

3、修改 MainActivity.java

java 复制代码
package com.example.myapplication;

import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

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

        Button btnPop = findViewById(R.id.btn_pop);
        registerForContextMenu(btnPop);
    }

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

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        int itemId = item.getItemId();

        if (itemId == R.id.create) {
            // 处理新建操作
            return true;
        } else if (itemId == R.id.edit) {
            // 处理编辑操作
            return true;
        } else if (itemId == R.id.save) {
            // 处理保存操作
            return true;
        } else if (itemId == R.id.save_as) {
            // 处理另存为操作
            return true;
        } else if (itemId == R.id.save_all) {
            // 处理保存全部操作
            return true;
        } else if (itemId == R.id.help) {
            // 处理帮助操作
            return true;
        } else {
            return super.onContextItemSelected(item);
        }
    }

}

参考文档

  1. Android menus

Android PopupMenu 弹出菜单

在Android开发中,PopupMenu是一个非常有用的组件,它可以在用户界面的任何位置显示一个弹出菜单。这个菜单可以通过编程方式动态创建,也可以从XML菜单资源文件加载。

PopupMenu在Android中是一个用于显示上下文菜单的非常方便的组件,它可以附着在指定的视图(View)上。PopupMenu有几种构造方法允许你根据需要选择不同的参数来创建弹出菜单。以下是如何使用这些构造方法以及如何设置和显示PopupMenu的具体步骤:

  • 基本构造方法:PopupMenu(Context context, View anchor): 这是最基本的构造函数,只需要上下文(通常是Activity)和锚点视图(即触发弹出菜单的视图)。
  • 指定重力的构造方法:PopupMenu(Context context, View anchor, int gravity): 这个构造函数除了上下文和锚点视图外,还允许你指定弹出菜单的重力(gravity),例如Gravity.END,控制菜单显示的位置相对于锚点视图。
  • 完全自定义样式的构造方法:PopupMenu(Context context, View anchor, int gravity, int popupStyleAttr, int popupStyleRes): 这是最灵活的构造函数,它除了上述参数外,还允许你通过popupStyleAttr和popupStyleRes指定弹出菜单的样式。

范例

步骤1: 创建菜单资源文件

首先,在res/menu目录下创建一个名为main_menu.xml的菜单资源文件。

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/action_item1"
        android:title="选项 1"/>
    <item
        android:id="@+id/action_item2"
        android:title="选项 2"/>
    <item
        android:id="@+id/action_item3"
        android:title="选项 3"/>
</menu>

步骤2: 修改 activity_main.xml

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/button_show_popup"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="显示弹出菜单"
        android:layout_centerInParent="true"/>
</LinearLayout>

步骤3: 修改 MainActivity.java

java 复制代码
package com.example.myapplication;

import android.os.Bundle;
import android.view.Gravity;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.PopupMenu;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

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

        Button buttonShowPopup = findViewById(R.id.button_show_popup);
        buttonShowPopup.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 创建PopupMenu实例
                PopupMenu popupMenu = new PopupMenu(MainActivity.this, v, Gravity.RIGHT);
                // 从XML资源文件中填充菜单项
                popupMenu.getMenuInflater().inflate(R.menu.main_menu, popupMenu.getMenu());
                // 设置菜单项点击事件
                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        Toast.makeText(MainActivity.this, "选中了: " + item.getTitle(), Toast.LENGTH_SHORT).show();
                        return true;
                    }
                });
                // 显示PopupMenu
                popupMenu.show();
            }
        });
    }
}

参考文档

  1. Android menus
相关推荐
南宫生4 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
拭心4 小时前
Google 提供的 Android 端上大模型组件:MediaPipe LLM 介绍
android
sanguine__5 小时前
Web APIs学习 (操作DOM BOM)
学习
数据的世界017 小时前
.NET开发人员学习书籍推荐
学习·.net
带电的小王7 小时前
WhisperKit: Android 端测试 Whisper -- Android手机(Qualcomm GPU)部署音频大模型
android·智能手机·whisper·qualcomm
四口鲸鱼爱吃盐7 小时前
CVPR2024 | 通过集成渐近正态分布学习实现强可迁移对抗攻击
学习
梦想平凡7 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
元争栈道7 小时前
webview和H5来实现的android短视频(短剧)音视频播放依赖控件
android·音视频
阿甘知识库8 小时前
宝塔面板跨服务器数据同步教程:双机备份零停机
android·运维·服务器·备份·同步·宝塔面板·建站
元争栈道9 小时前
webview+H5来实现的android短视频(短剧)音视频播放依赖控件资源
android·音视频