|
|
/*
|
|
|
* 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);
|
|
|
}
|
|
|
}
|