/* * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) * * 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. */ package net.micode.notes.ui; import android.content.Context; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.PopupMenu; import android.widget.PopupMenu.OnMenuItemClickListener; import net.micode.notes.R; public class DropdownMenu { private Button mButton; private PopupMenu mPopupMenu; private Menu mMenu; public DropdownMenu(Context context, Button button, int menuId) { mButton = button; mButton.setBackgroundResource(R.drawable.dropdown_icon); mPopupMenu = new PopupMenu(context, mButton); mMenu = mPopupMenu.getMenu(); mPopupMenu.getMenuInflater().inflate(menuId, mMenu); mButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { mPopupMenu.show(); } }); } public void setOnDropdownMenuItemClickListener(OnMenuItemClickListener listener) { if (mPopupMenu != null) { mPopupMenu.setOnMenuItemClickListener(listener); } } public MenuItem findItem(int id) { return mMenu.findItem(id); } public void setTitle(CharSequence title) { mButton.setText(title); } } package net.micode.notes.ui; import android.content.Context; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.PopupMenu; import android.widget.PopupMenu.OnMenuItemClickListener; import net.micode.notes.R; // DropdownMenu类用于创建一个下拉菜单的功能组件,它将一个Button按钮与一个PopupMenu(弹出式菜单)相关联, // 点击按钮时会弹出对应的菜单,并且可以设置菜单选项的点击监听器、查找特定菜单项以及设置按钮显示的标题等操作。 public class DropdownMenu { // 用于存储关联的Button按钮对象,该按钮作为触发弹出菜单显示的交互元素 private Button mButton; // 用于存储创建的PopupMenu(弹出式菜单)对象,承载具体的菜单内容和交互逻辑 private PopupMenu mPopupMenu; // 用于存储PopupMenu对应的Menu对象,方便后续对菜单本身进行一些操作,比如查找菜单项等 private Menu mMenu; // 构造函数,用于初始化DropdownMenu实例,传入上下文、要关联的Button按钮以及菜单资源的ID public DropdownMenu(Context context, Button button, int menuId) { // 将传入的Button按钮对象赋值给成员变量mButton,以便后续操作 mButton = button; // 为Button按钮设置背景资源,这里使用了资源文件中定义的drawable资源(dropdown_icon)作为按钮的背景图片, // 通常用于展示一个下拉箭头之类的图标,提示用户该按钮可以点击弹出菜单 mButton.setBackgroundResource(R.drawable.dropdown_icon); // 创建一个PopupMenu实例,传入当前上下文和关联的Button按钮,使得弹出菜单能够在合适的位置(以按钮为锚点)显示出来 mPopupMenu = new PopupMenu(context, mButton); // 获取PopupMenu对应的Menu对象,并赋值给成员变量mMenu,方便后续操作菜单内容 mMenu = mPopupMenu.getMenu(); // 使用MenuInflater(菜单填充器)将指定资源ID对应的菜单布局资源填充到创建的Menu对象中, // 这样就构建好了具体的菜单结构,包含了各个菜单项等内容 mPopupMenu.getMenuInflater().inflate(menuId, mMenu); // 为Button按钮设置点击事件监听器,当按钮被点击时触发相应逻辑 mButton.setOnClickListener(new OnClickListener() { // 实现OnClickListener接口的点击事件处理方法,当按钮被点击时 public void onClick(View v) { // 调用PopupMenu的show方法,显示弹出式菜单,使其展示在屏幕上供用户选择菜单项 mPopupMenu.show(); } }); } // 用于设置PopupMenu中菜单项的点击事件监听器,外部可以传入实现了OnMenuItemClickListener接口的实例, // 来处理用户点击菜单项后的相应逻辑 public void setOnDropdownMenuItemClickListener(OnMenuItemClickListener listener) { if (mPopupMenu!= null) { // 如果PopupMenu对象不为空,为其设置菜单项点击事件监听器,将传入的监听器对象关联到PopupMenu上 mPopupMenu.setOnMenuItemClickListener(listener); } } // 用于在已构建的Menu对象中查找指定ID的菜单项,返回对应的MenuItem对象,方便外部对特定菜单项进行操作,比如获取其属性、设置其状态等 public MenuItem findItem(int id) { return mMenu.findItem(id); } // 用于设置Button按钮显示的标题文本内容,改变按钮上展示给用户的文字提示信息 public void setTitle(CharSequence title) { mButton.setText(title); } }