Android 自定义弹出菜单和对话框功能实例代码
程序员文章站
2023-12-11 21:06:40
android 开发当中,可能会存在许多自定义布局的需求,比如自定义弹出菜单(popupwindow),以及自定义对话框(dialog)。
话不多说,直接上图片。
&n...
android 开发当中,可能会存在许多自定义布局的需求,比如自定义弹出菜单(popupwindow),以及自定义对话框(dialog)。
话不多说,直接上图片。
先讲第一种,自定义popupwindow
1.popupwindow
protected void showpopwindow(view view, final int pos){ windowmanager wm= (windowmanager) mycontext.getsystemservice(context.window_service); int width=wm.getdefaultdisplay().getwidth(); layoutinflater layoutinflater=(layoutinflater)mycontext.getsystemservice(context.layout_inflater_service); view popview=layoutinflater.inflate(r.layout.layout_shoucang_popupwindow,null); //加载弹出菜单的布局文件 final listview lvpop= (listview) popview.findviewbyid(r.id.lvshoucangpop); list<string> strdata=new arraylist<>(); strdata.add("删除"); strdata.add("分享"); popview.measure(view.measurespec.unspecified, view.measurespec.unspecified); popupwindow=new popupwindow(popview,3*width/10, viewgroup.layoutparams.wrap_content); //设置popupwindow 的大小 lvpop.setadapter(new adaptershoucangdeletepop(mycontext,strdata)); lvpop.setonitemclicklistener(new adapterview.onitemclicklistener() { @override public void onitemclick(adapterview<?> parent, view view, int position, long id) { if(position==0){ //点击删除按钮的逻辑 // toastutil.toastbuttom(mycontext,"点击删除按钮"); // datas.remove(pos); //remove掉这行数据 toactivitypos=pos; // notifydatasetchanged(); senddeleteboardcast(); //发送一条广播 popupwindow.dismiss(); }else if(position ==1){ //点击分享的逻辑 string title=datas.get(position).ucdesc; string photourl=datas.get(position).ucicon; string contenturl=datas.get(position).ucurl; dialogshoucangshare dialogshoucangshare=new dialogshoucangshare(mycontext,title,photourl,contenturl); //弹出分享对话框 dialogshoucangshare.show(); popupwindow.dismiss(); } } }); int[] location=new int[2]; view.getlocationonscreen(location); popupwindow.setfocusable(true); popupwindow.setbackgrounddrawable(new bitmapdrawable());//最好加上这一句,因为他可以取消显示这个弹出菜单,不加的话,弹出菜单很难消失 //下方:popupwindow.showasdropdown(v); //popupwindow.showatlocation(v, gravity.no_gravity, location[0]+v.getwidth(), location[1]); 显示在右边 //popupwindow显示在左边 popupwindow.showatlocation(view, gravity.no_gravity , location[0]-popupwindow.getwidth(),location[1]); //这里的view是传进来的view,比如点击事件中的view,就把它传进来,popupwindow的位置可以自行调整 }
弹出菜单的布局,用listview 填充,然后由于要加圆角的背景,所以更改background
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <listview android:id="@+id/lvshoucangpop" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="2dp" android:background="@drawable/bg_shoucang_popup_bg" android:listselector="@drawable/izd_shoucang_delete_selector_pop" /> </linearlayout>
listview的圆角背景图片
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <solid android:color="#eeeeee"/> <corners android:radius="8.0dip"/> </shape> </item> </selector>
然后你只要在你的逻辑代码中调用showpopwindow()
这个方法就行了,是不是很简单!
紧接着开始讲自定义对话框了,因为很多app中都有这个功能,而且效果还不错!
public class dialogshoucangshare extends dialog{ private context mycontext; private relativelayout rlcancle; private gridview gridview; //那些图片 private int[] data=new int[]{r.drawable.izd_shoucang_wechat,r.drawable.izd_shoucang_friend,r.drawable.izd_shoucang_qq, r.drawable.izd_shoucang_weibo,r.drawable.izd_shoucang_qzone,r.drawable.izd_shoucang_email}; public dialogshoucangshare(context context,string title,string photourl,string contenturl) { super(context); } @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); super.setcontentview(r.layout.izd_shoucang_dialog_share); sharesdk.initsdk(mycontext); gridview = (gridview) super.findviewbyid(r.id.gv_share); gridview.setselector(new colordrawable(color.transparent)); adapterscsharegridview adapter=new adapterscsharegridview(mycontext,data); gridview.setadapter(adapter); gridview.setonitemclicklistener(new adapterview.onitemclicklistener() { @override public void onitemclick(adapterview<?> parent, view view, int position, long id) { switch (position) { //对于gridview中的item的点击事件 } dialogshoucangshare.this.dismiss(); } }); rlcancle = (relativelayout) findviewbyid(r.id.shoucang_rlcancle); rlcancle.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { dialogshoucangshare.this.dismiss(); } }); @override public void show() { this.requestwindowfeature(window.feature_no_title); this.requestwindowfeature(window.feature_action_bar_overlay); this.setcanceledontouchoutside(true); window dialogwindow = this.getwindow(); //得到对话框 dialogwindow.setgravity(gravity.left | gravity.bottom); dialogwindow.getdecorview().setpadding(0, 0, 0, 0); windowmanager.layoutparams lp = dialogwindow.getattributes(); lp.width = windowmanager.layoutparams.match_parent; lp.height = windowmanager.layoutparams.wrap_content; dialogwindow.setattributes(lp); dialogwindow.setwindowanimations(r.style.izd_dialogwindowanim); //设置窗口弹出动画 ,由styles配置,有进入和退出动画 //dialogwindow.setwindowanimations(r.anim.dialog_enter_anim); // // windowmanager.layoutparams lp = dialogwindow.getattributes(); // lp.width = 100; // 宽度 // lp.height = 300; // 高度 // //lp.alpha = 0.7f; // 透明度 // //dialogwindow.setattributes(lp); dialogwindow.setbackgrounddrawableresource(r.drawable.radius_shoucang_share_nopadding); //设置对话框背景 // dialogwindow.setbackgrounddrawableresource(r.color.izd_white); //设置对话框背景 super.show(); } }
再看下该对话框的布局文件:只有一个gridview 和relativelayout
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_margintop="10dp" android:layout_marginleft="10dp" android:layout_marginright="10dp" android:layout_marginbottom="8dp" android:background="@color/transparent" > <linearlayout android:layout_width="match_parent" android:orientation="vertical" android:layout_height="match_parent"> <gridview android:id="@+id/gv_share" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:numcolumns="3" android:verticalspacing="-36dp" android:background="@drawable/bg_share_shoucang"> </gridview> <relativelayout android:id="@+id/shoucang_rlcancle" android:layout_width="match_parent" android:layout_height="48dp" android:layout_margintop="8dp" android:background="@drawable/bg_share_shoucang" > <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="取消" android:textcolor="#009688" android:textsize="16sp" android:layout_centerinparent="true"/> </relativelayout> </linearlayout> </linearlayout>
这是设置对话框的背景的布局文件,其实主要设置对话框的圆角,以及对话框颜色为透明就行了!
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#ffffff"/> <corners android:radius="4dp" /> <gradient android:startcolor="#00000000" android:endcolor="#00000000"/> </shape>
再次声明,这里使用gridview是为了,方便以后填充更多的数据,如果用相对布局加线性布局,写死的话,以后若要再次添加数据的话,就要再去修改布局,比较麻烦!因为有前车之鉴的我,下面就是我之前不用gridview去写的布局文件!新手如果想练手的话,可以尝试!
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <relativelayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1"> <linearlayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_centerinparent="true"> <imageview android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margintop="32dp" android:src="@drawable/izd_shoucang_wechat" android:layout_centerhorizontal="true"/> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="微信" android:layout_gravity="center" android:layout_margintop="9dp" android:layout_centerhorizontal="true"/> </linearlayout> </relativelayout> <relativelayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1"> <linearlayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_centerinparent="true"> <imageview android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margintop="32dp" android:src="@drawable/izd_shoucang_friend" android:layout_centerhorizontal="true"/> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="朋友圈" android:layout_gravity="center" android:layout_margintop="9dp" android:layout_centerhorizontal="true"/> </linearlayout> </relativelayout> <relativelayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1"> <linearlayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_centerinparent="true"> <imageview android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margintop="32dp" android:src="@drawable/izd_shoucang_qq" android:layout_centerhorizontal="true"/> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="qq好友" android:layout_gravity="center" android:layout_margintop="9dp" android:layout_centerhorizontal="true"/> </linearlayout> </relativelayout> </linearlayout> <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <relativelayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1"> <linearlayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_centerinparent="true"> <imageview android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margintop="24dp" android:src="@drawable/izd_shoucang_weibo" android:layout_centerhorizontal="true"/> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="微博" android:layout_gravity="center" android:layout_margintop="9dp" android:layout_centerhorizontal="true"/> </linearlayout> </relativelayout> <relativelayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1"> <linearlayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_centerinparent="true"> <imageview android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margintop="24dp" android:src="@drawable/izd_shoucang_qzone" android:layout_centerhorizontal="true"/> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="qq空间" android:layout_gravity="center" android:layout_margintop="9dp" android:layout_centerhorizontal="true"/> </linearlayout> </relativelayout> <relativelayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1"> <linearlayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_centerinparent="true"> <imageview android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margintop="24dp" android:src="@drawable/izd_shoucang_email" android:layout_centerhorizontal="true"/> <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="邮箱" android:layout_gravity="center" android:layout_margintop="9dp" android:layout_centerhorizontal="true"/> </linearlayout> </relativelayout> </linearlayout> </linearlayout> <relativelayout android:layout_width="match_parent" android:layout_height="48dp" android:layout_margintop="8dp" > <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="取消" android:textcolor="#009688" android:textsize="16sp" android:layout_centerinparent="true"/> </relativelayout> </linearlayout>
效果也是一样的!
然后你要使用该对话框的话,只要新建对话框就可以了!
dialogshoucangshare dialogshoucangshare=new dialogshoucangshare(mycontext); //弹出分享对话框 dialogshoucangshare.show();
总结
以上所述是小编给大家介绍的android 自定义弹出菜单和对话框功能实例代码,希望对大家有所帮助
推荐阅读
-
Android 自定义弹出菜单和对话框功能实例代码
-
Android实现底部对话框BottomDialog弹出实例代码
-
Android自定义按周签到打卡功能实例代码
-
Android 自定义弹出菜单和对话框功能实例代码
-
Android中自定义对话框(Dialog)的实例代码
-
Android 之BottomsheetDialogFragment仿抖音评论底部弹出对话框效果(实例代码)
-
Android 之BottomsheetDialogFragment仿抖音评论底部弹出对话框效果(实例代码)
-
Android实现底部对话框BottomDialog弹出实例代码
-
Android自定义按周签到打卡功能实例代码
-
Android加载loading对话框的功能及实例代码(不退出沉浸式效果)