You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2Q1/ui/DropdownMenu.java

98 lines
7.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* Copyright (c) 2010 - 2011, The MiCode Open Source Community (www.micode.net)
* 版权声明部分表明该代码遵循Apache License 2.0协议,同时说明了版权所属的开源社区以及相关许可的获取途径等信息。
*/
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// 声明该类所属的包名表明这个类位于net.micode.notes.ui包下在项目的整体包结构中有其特定的组织和访问层级关系。
package net.micode.notes.ui;
// 导入必要的Android系统相关类Context用于获取应用的上下文环境信息是很多Android操作如资源获取、系统服务调用等的基础。
import android.content.Context;
// 导入用于操作菜单相关的类Menu用于表示菜单对象包含了菜单项等相关信息MenuItem用于表示具体的菜单项可以设置其属性、响应点击事件等。
import android.view.Menu;
import android.view.MenuItem;
// 导入View相关类View是Android中所有可视化组件的基类这里用于处理视图相关的操作和事件监听等
// OnClickListener用于监听视图的点击事件以便在视图被点击时执行相应的逻辑。
import android.view.View;
import android.view.View.OnClickListener;
// 导入Button类用于创建按钮控件按钮是常见的用户交互组件可响应用户点击操作等。
import android.widget.Button;
// 导入PopupMenu相关类PopupMenu用于创建弹出式菜单提供一种在特定视图通常是某个按钮等上点击弹出菜单选项的交互方式
// OnMenuItemClickListener用于监听弹出式菜单中菜单项的点击事件以便执行相应的业务逻辑。
import android.widget.PopupMenu;
import android.widget.PopupMenu.OnMenuItemClickListener;
// 导入项目中自动生成的资源类R通过它可以访问项目中的各种资源如布局文件、图片资源、字符串资源等这里主要用于获取特定的图片资源。
import net.micode.notes.R;
// DropdownMenu类用于创建一个带有弹出式菜单功能的组件它关联一个按钮Button点击该按钮会弹出一个菜单PopupMenu
// 并且可以对菜单的相关属性如菜单项点击监听、查找菜单项、设置按钮显示文本等进行操作方便在Android应用中实现下拉菜单式的交互功能。
public class DropdownMenu {
// 定义一个Button类型的成员变量mButton用于存储关联的按钮控件这个按钮将作为触发弹出式菜单显示的入口。
private Button mButton;
// 定义一个PopupMenu类型的成员变量mPopupMenu用于存储创建的弹出式菜单对象通过这个对象可以进行弹出菜单的显示、设置菜单项点击监听等操作。
private PopupMenu mPopupMenu;
// 定义一个Menu类型的成员变量mMenu用于存储弹出式菜单对应的菜单对象通过它可以访问和操作菜单中的具体菜单项如添加、查找、移除菜单项等
private Menu mMenu;
// DropdownMenu类的构造函数用于创建该类的实例接收三个参数
// Context类型的context用于获取应用的上下文环境信息以便能够正确加载资源、创建相关的系统组件等
// Button类型的button是要关联的按钮控件点击这个按钮将弹出菜单
// int类型的menuId是菜单资源的ID用于指定要加载并显示的菜单布局资源通常在XML文件中定义了具体的菜单项等内容
public DropdownMenu(Context context, Button button, int menuId) {
// 将传入的按钮控件参数button赋值给成员变量mButton建立与外部传入按钮的关联后续通过这个成员变量对按钮进行相关操作如设置背景、添加点击监听等
mButton = button;
// 通过调用setBackgroundResource方法为按钮mButton设置背景图片资源这里使用了R.drawable.dropdown_icon所对应的图片资源
// 该图片通常会作为按钮的可视化标识,提示用户点击它可以弹出菜单,使按钮在界面上有符合功能需求的外观显示。
mButton.setBackgroundResource(R.drawable.dropdown_icon);
// 创建一个PopupMenu实例传入应用的上下文环境context和关联的按钮控件mButton这样创建的弹出式菜单会在点击mButton时弹出并且依赖于传入的上下文环境进行相关操作如资源加载等
mPopupMenu = new PopupMenu(context, mButton);
// 获取创建好的弹出式菜单mPopupMenu对应的菜单对象并赋值给成员变量mMenu通过这个对象后续可以对菜单中的具体菜单项进行操作如添加、查找等
mMenu = mPopupMenu.getMenu();
// 通过弹出式菜单mPopupMenu的getMenuInflater方法获取菜单填充器对象然后调用inflate方法传入菜单资源IDmenuId和菜单对象mMenu
// 这一步操作会根据指定的菜单资源ID对应的XML布局文件内容将菜单项填充到mMenu对象中从而构建出具有实际菜单项的菜单结构用于后续展示给用户选择操作。
mPopupMenu.getMenuInflater().inflate(menuId, mMenu);
// 为按钮mButton设置点击事件监听器当按钮被点击时会触发监听器中的onClick方法在这个方法内部通过调用mPopupMenu的show方法
// 实现弹出式菜单的显示,使得用户点击按钮后能看到弹出的菜单供其选择相应的菜单项,实现下拉菜单的基本交互功能。
mButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mPopupMenu.show();
}
});
}
// 用于设置弹出式菜单中菜单项点击事件监听器的方法接收一个OnMenuItemClickListener类型的参数listener
// 如果弹出式菜单mPopupMenu不为空就将传入的监听器设置给mPopupMenu使得当用户点击弹出菜单中的菜单项时会触发listener中定义的相应逻辑
// 以便执行根据菜单项选择而不同的业务操作(如跳转到不同页面、执行不同功能等)。
public void setOnDropdownMenuItemClickListener(OnMenuItemClickListener listener) {
if (mPopupMenu!= null) {
mPopupMenu.setOnMenuItemClickListener(listener);
}
}
// 用于在菜单mMenu中查找指定ID的菜单项的方法接收一个int类型的参数id表示要查找的菜单项的资源ID
// 通过调用mMenu对象的findItem方法根据传入的ID查找对应的菜单项并返回查找到的MenuItem对象方便后续对该菜单项进行进一步操作如获取其属性、设置其状态等
public MenuItem findItem(int id) {
return mMenu.findItem(id);
}
// 用于设置关联按钮mButton显示文本的方法接收一个CharSequence类型的参数title通过调用mButton的setText方法
// 将传入的文本设置为按钮上显示的内容,这样可以根据不同的业务场景动态改变按钮上显示的提示信息,增强交互的友好性和表意性。
public void setTitle(CharSequence title) {
mButton.setText(title);
}
}