欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 自定义弹出菜单和对话框功能实例代码

程序员文章站 2023-11-24 10:00:40
android 开发当中,可能会存在许多自定义布局的需求,比如自定义弹出菜单(popupwindow),以及自定义对话框(dialog)。 话不多说,直接上图片。 &n...

android 开发当中,可能会存在许多自定义布局的需求,比如自定义弹出菜单(popupwindow),以及自定义对话框(dialog)。

话不多说,直接上图片。

Android 自定义弹出菜单和对话框功能实例代码 


Android 自定义弹出菜单和对话框功能实例代码

先讲第一种,自定义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>

效果也是一样的!

Android 自定义弹出菜单和对话框功能实例代码

然后你要使用该对话框的话,只要新建对话框就可以了!

dialogshoucangshare dialogshoucangshare=new dialogshoucangshare(mycontext); //弹出分享对话框 
dialogshoucangshare.show();

总结

以上所述是小编给大家介绍的android 自定义弹出菜单和对话框功能实例代码,希望对大家有所帮助