/* * 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方法,传入菜单资源ID(menuId)和菜单对象(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); } }