Android 使用PopupWindow实现弹出更多的菜单.docx
- 文档编号:24137701
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:20
- 大小:55.09KB
Android 使用PopupWindow实现弹出更多的菜单.docx
《Android 使用PopupWindow实现弹出更多的菜单.docx》由会员分享,可在线阅读,更多相关《Android 使用PopupWindow实现弹出更多的菜单.docx(20页珍藏版)》请在冰豆网上搜索。
Android使用PopupWindow实现弹出更多的菜单
Android使用PopupWindow实现弹出更多的菜单
最近想要做一个弹出更多的菜单,而原生的弹出菜单却不是我们想要的效果,所以必然要自定义菜单咯。
本人也是借鉴网上的资料进行封装的,感觉还蛮不错的。
原生的菜单如下图:
是不是看到这里之后,对比可知,原生的效果不太理想,所以还是再自己定义吧!
源码下载
1、PopupWindow可以说是一个浮动在Activity之上的容器,通常用来显示自定义的视图。
弹出菜单的封装PopMenuMore
[java]viewplaincopy在CODE上查看代码片派生到我的代码片
/**
*对弹出菜单的封装.
*
*Author:
msdx(645079761@)
*Time:
14-6-13下午1:
51
*/
publicclassPopMenuMore{
/**
*上下文.
*/
privateContextmContext;
/**
*菜单项
*/
privateArrayList
/**
*列表适配器.
*/
privateBaseAdaptermAdapter;
/**
*菜单选择监听.
*/
privateOnItemSelectedListenermListener;
/**
*下角图标
*/
privateImageViewcornerIcon;
/**
*列表.
*/
privateListViewmListView;
/**
*弹出窗口.
*/
privatePopupWindowmPopupWindow;
publicPopMenuMore(Contextcontext){
mContext=context;
mItemList=newArrayList<>();
Viewview=onCreateView(context);
view.setFocusableInTouchMode(true);
mAdapter=onCreateAdapter(context,mItemList);
cornerIcon=findCornerView(view);
mListView=findListView(view);
mListView.setAdapter(mAdapter);
mListView.setOnItemClickListener(newAdapterView.OnItemClickListener(){
@Override
publicvoidonItemClick(AdapterView
>parent,Viewview,intposition,longid){
PopMenuMoreItemitem=(PopMenuMoreItem)mAdapter.getItem(position);
if(mListener!
=null){
mListener.selected(view,item,position);
}
mPopupWindow.dismiss();
}
});
view.setOnKeyListener(newView.OnKeyListener(){
@Override
publicbooleanonKey(Viewv,intkeyCode,KeyEventevent){
if(keyCode==KeyEvent.KEYCODE_MENU&&mPopupWindow.isShowing()){
mPopupWindow.dismiss();
returntrue;
}
returnfalse;
}
});
mPopupWindow=newPopupWindow(view,ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT,true);
mPopupWindow.setBackgroundDrawable(newColorDrawable(0x00000000));
setBackgroundColor(Color.parseColor("#000000"));
setCorner(R.mipmap.triangle);
}
/**
*设置ListView背景
*
*@paramargbColor.parseColor("..")
*/
publicvoidsetBackgroundColor(intargb){
//intstrokeWidth=5;//3dp边框宽度
introundRadius=5;//8dp圆角半径
//intstrokeColor=Color.parseColor("#2E3135");//边框颜色
//intfillColor=Color.parseColor("#DFDFE0");//内部填充颜色
GradientDrawablegd=newGradientDrawable();//创建drawable
gd.setColor(gb);
gd.setCornerRadius(roundRadius);
//gd.setStroke(strokeWidth,strokeColor);
mListView.setBackgroundDrawable(gd);
}
/**
*设置下角图标
*
*@paramresId
*/
publicvoidsetCorner(intresId){
cornerIcon.setBackgroundResource(resId);
}
protectedViewonCreateView(Contextcontext){
returnLayoutInflater.from(context).inflate(R.layout.layout_popmenu_more,null);
}
protectedImageViewfindCornerView(Viewview){
return(ImageView)view.findViewById(R.id.corner_iv);
}
protectedListViewfindListView(Viewview){
return(ListView)view.findViewById(R.id.menu_listview);
}
/**
*菜单列表中的适配器.
*
*@paramcontext
*@paramitems表示所有菜单项.
*@return
*/
protectedBaseAdapteronCreateAdapter(Contextcontext,ArrayList
returnnewPopMenuMoreAdapter(context,items);
}
/**
*添加菜单项
*
*@paramitem
*/
publicvoidaddItem(PopMenuMoreItemitem){
mItemList.add(item);
mAdapter.notifyDataSetChanged();
}
publicvoidaddItems(List
if(items!
=null){
mItemList.clear();
}
for(PopMenuMoreItemitem:
items){
mItemList.add(item);
}
mAdapter.notifyDataSetChanged();
}
/**
*作为指定View的下拉控制显示.
*
*@paramparent所指定的View
*/
publicvoidshowAsDropDown(Viewparent){
mPopupWindow.showAsDropDown(parent);
}
/**
*隐藏菜单.
*/
publicvoiddismiss(){
mPopupWindow.dismiss();
}
/**
*设置菜单选择监听.
*
*@paramlistener监听器.
*/
publicvoidsetOnItemSelectedListener(OnItemSelectedListenerlistener){
mListener=listener;
}
/**
*当前菜单是否正在显示.
*
*@return
*/
publicbooleanisShowing(){
returnmPopupWindow.isShowing();
}
/**
*菜单项选择监听接口.
*/
publicinterfaceOnItemSelectedListener{
/**
*菜单被选择时的回调接口.
*
*@paramview被选择的内容的View.
*@paramitem被选择的菜单项.
*@paramposition被选择的位置.
*/
voidselected(Viewview,PopMenuMoreItemitem,intposition);
}
}
2、菜单中ListView的适配器:
PopMenuMoreAdapter
[java]viewplaincopy在CODE上查看代码片派生到我的代码片
/**
*@authorSoBan
*@create2017/4/1210:
29.
*/
publicclassPopMenuMoreAdapterextendsBaseAdapter{
privateArrayList
privateContextcontext;
publicPopMenuMoreAdapter(Contextcontext,ArrayList
this.context=context;
this.items=items;
}
@Override
publicintgetCount(){
returnitems.size();
}
@Override
publicPopMenuMoreItemgetItem(intposition){
returnitems.get(position);
}
@Override
publiclonggetItemId(intposition){
returnposition;
}
@Override
publicViewgetView(intposition,Viewview,ViewGroupparent){
if(view==null){
view=LayoutInflater.from(context).inflate(R.layout.item_popmenu_more,null);
ViewHolderholder=ewViewHolder();
holder.icon=(ImageView)view.findViewById(R.id.menu_icon);
holder.text=(TextView)view.findViewById(R.id.menu_text);
view.setTag(holder);
}elseif(view.getParent()!
=null){
((ViewGroup)view.getParent()).removeView(view);
}
ViewHolderholder=(ViewHolder)view.getTag();
PopMenuMoreItemitem=items.get(position);
if(item.getResId()==0){
holder.icon.setVisibility(View.GONE);
}
holder.text.setText(item.getText());
returnview;
}
privateclassViewHolder{
ImageViewicon;
TextViewtext;
}
}
4、菜单项中item:
PopMenuMoreItem
[java]viewplaincopy在CODE上查看代码片派生到我的代码片
/**
*菜单项.
*/
publicclassPopMenuMoreItem{
publicintid;//标识
publicintresId;//资源图标
publicStringtext;//文字
publicPopMenuMoreItem(intid,Stringtext){
this.id=id;
this.resId=0;
this.text=text;
}
publicPopMenuMoreItem(intid,intresId,Stringtext){
this.id=id;
this.resId=resId;
this.text=text;
}
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicintgetResId(){
returnresId;
}
publicvoidsetResId(intresId){
this.resId=resId;
}
publicStringgetText(){
returntext;
}
publicvoidsetText(Stringtext){
this.text=text;
}
}
4、宽度适配内容、不滚动的ListView:
PopMenuMoreListView
[java]viewplaincopy在CODE上查看代码片派生到我的代码片
/**
*宽度适配内容的ListView.
*Author:
msdx(645079761@)
*Time:
14-9-2下午5:
14
*/
publicclassPopMenuMoreListViewextendsListView{
publicPopMenuMoreListView(Contextcontext){
super(context);
}
publicPopMenuMoreListView(Contextcontext,AttributeSetattrs){
super(context,attrs);
}
publicPopMenuMoreListView(Contextcontext,AttributeSetattrs,intdefStyle){
super(context,attrs,defStyle);
}
@Override
protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
intwidth=0;
for(inti=0;i Viewchild=getChildAt(i); child.measure(MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED),heightMeasureSpec); intw=child.getMeasuredWidth(); if(w>width)width=w; } widthMeasureSpec=MeasureSpec.makeMeasureSpec(width+getPaddingLeft()+getPaddingRight(),MeasureSpec.EXACTLY); super.onMeasure(widthMeasureSpec,heightMeasureSpec); } } 5、item的布局: item_popmenu_more.xml [html]viewplaincopy在CODE上查看代码片派生到我的代码片 xmlversion="1.0"encoding="utf-8"? > android=" android: layout_width="wrap_content" android: layout_height="wrap_content" android: paddingBottom="10dip" android: paddingLeft="20dip" android: paddingRight="20dip" android: paddingTop="10dip"> android: id="@+id/menu_icon" android: layout_width="wrap_content" android: layout_height="wrap_content" android: layout_gravity="center_vertical" android: layout_marginLeft="5dip" android: layout_marginRight="5dip" android: src="@mipmap/demand_icon_location"/> android: id="@+id/menu_text" android: layout_width="wrap_content" android: layout_height="wrap_content" android: layout_gravity="center_vertical" android: singleLine="true" android: textColor="#FFFFFF"/> 6、更多菜单的布局: layout_popmenu_more.xml [html]viewplaincopy在CODE上查看代码片派生到我的代码片 xmlversion="1.0"encoding="utf-8"? > android=" android: layout_width="match_parent" android: layout_height="wrap_content" android: orientation="vertical" android: paddingRight="5dip"> android: id="@+id/corner_iv" android: layout_width="wrap_content" android: layout_height="wrap_content" android: layout_gravity="right" android: layout_marginRight="15dip" android: contentDescription="@null"/> android: id="@+id/menu_listview" android: layout_width="wrap_content" android: layout_height="wrap_content" android: layout_gravity="right" android: cacheColorHint="@android: color/transparent" android: listSelector="@android: color/transparent" android: divider="#FFFFFF" android: dividerHeight="1px" android: focusable="true"/> 7、例子Activity: MainActivity [java]viewp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 使用PopupWindow实现弹出更多的菜单 使用 PopupWindow 实现 弹出 更多 菜单