当前位置: 移动技术网 > IT编程>移动开发>Android > Android UI设计系列之自定义Dialog实现各种风格的对话框效果(7)

Android UI设计系列之自定义Dialog实现各种风格的对话框效果(7)

2019年07月24日  | 移动技术网IT编程  | 我要评论

都阳鳗鱼,电费怎么算,北京721

虽然android给我们提供了众多组件,但是使用起来都不是很方便,我们开发的apk都有自己的风格,如果使用了系统自带的组件,总是觉得和应用的主题不着边际并且看起来也不顺心,那我们就需要自定义了,为了方便大家对自定义组件的学习,我接下来准备了几遍有关自定义的dialog的文章,希望对大家有帮助。
在开发apk中最常见的估计就数弹出对话框了,这种对话框按照按钮数量来分大致是三种:一个按钮,两个按钮,三个按钮。现在要讲的就是按照按钮数量分为以上三类吧(当然了可以有更多的按钮,只要你愿意)。
自定义dialog对话大致可分为三步走吧:第一步就是重新定义dialog的样式,第二部就是定义我们需要显示的布局文件,第三部就是设置事件监听器。
好了,还是老规矩,首先贴上工程目录:

在工程中我定义了一个基类basebean,这个类用来作为在整个工程项目中的基类,基类中定义一些公共的常用的属性,如有需要另外属性我们只需要继承基类就好了,所以我定义了dialogbean,它继承了basebean,因此拥有了basebean的所有功能。那我们先看看basebean中定义的都是啥吧:

public class basebean { 
 
  /** 
   * 标题 
   */ 
  string title; 
  /** 
   * 内容 
   */ 
  string content; 
 
  /** 
   * 获取标题 
   * 
   * @return 标题 
   */ 
  public string gettitle() { 
    return title; 
  } 
 
  /** 
   * 设置标题 
   * 
   * @param title 
   *      标题 
   */ 
  public void settitle(string title) { 
    this.title = title; 
  } 
 
  /** 
   * 获取内容 
   * 
   * @return 内容 
   */ 
  public string getcontent() { 
    return content; 
  } 
 
  /** 
   * 设置内容 
   * 
   * @param content 
   *      内容 
   */ 
  public void setcontent(string content) { 
    this.content = content; 
  } 
} 

以上是基类中的内容,那接下来就看看dialog中是怎么定义的吧:

public class dialogbean extends basebean { 
 
  /** 
   * 点击返回键是否可消失 
   */ 
  boolean cancelable; 
  /** 
   * 点击蒙皮是否可以消失 
   */ 
  boolean outcancelable; 
  /** 
   * 事件监听 
   */ 
  dialogclicklistener listener; 
  /** 
   * 按钮类型【默认显示两个按钮】 
   */ 
  dialogbuttontype buttontype = dialogbuttontype.twobutton; 
 
  /** 
   * 显示布局资源id 
   */ 
  integer layoutresid; 
 
  public dialogbean() { 
  } 
 
  /** 
   * 点击back键是否可以消失 
   * 
   * @return 【true:可消失】【false:不消失】 
   */ 
  public boolean iscancelable() { 
    return cancelable; 
  } 
 
  /** 
   * 设置点击back键是否可以消失 
   * 
   * @param cancelable 
   *      【true:可消失】【false:不消失】 
   */ 
  public void setcancelable(boolean cancelable) { 
    this.cancelable = cancelable; 
  } 
 
  /** 
   * 点击蒙皮是否可以消失 
   * 
   * @return 【true:可消失】【false:不消失】 
   */ 
  public boolean isoutcancelable() { 
    return outcancelable; 
  } 
 
  /** 
   * 设置点击蒙皮是否可以消失 
   * 
   * @param outcancelable 
   *      【true:可消失】【false:不消失】 
   */ 
  public void setoutcancelable(boolean outcancelable) { 
    this.outcancelable = outcancelable; 
  } 
 
  /** 
   * 获取事件监听器 
   * 
   * @return 事件监听器 
   */ 
  public dialogclicklistener getlistener() { 
    return listener; 
  } 
 
  /** 
   * 设置事件监听器 
   * 
   * @param listener 
   *      事件监听器 
   */ 
  public void setlistener(dialogclicklistener listener) { 
    this.listener = listener; 
  } 
 
  /** 
   * 获取按钮类型 
   * 
   * @return 按钮类型 
   */ 
  public dialogbuttontype getbuttontype() { 
    return buttontype; 
  } 
 
  /** 
   * 设置按钮类型 
   * 
   * @param buttontype 
   *      按钮类型 
   */ 
  public void setbuttontype(dialogbuttontype buttontype) { 
    this.buttontype = buttontype; 
  } 
 
  /** 
   * 获取要显示的布局id 
   * 
   * @return 要显示的布局id 
   */ 
  public integer getlayoutresid() { 
    return layoutresid; 
  } 
 
  /** 
   * 设置要显示的布局id 
   * 
   * @param layoutresid 
   *      要显示的布局id 
   */ 
  public void setlayoutresid(integer layoutresid) { 
    this.layoutresid = layoutresid; 
  } 
 
  /** 
   * 按钮类型 
   * 
   * @author llew 
   */ 
  public enum dialogbuttontype { 
    /** 
     * 一个按钮 
     */ 
    onebutton, 
    /** 
     * 两个按钮 
     */ 
    twobutton, 
    /** 
     * 三个按钮 
     */ 
    threebutton 
  } 
 
  /** 
   * 按钮点击监听器 
   * 
   * @author llew 
   * 
   */ 
  public interface dialogclicklistener { 
    /** 
     * 点击按钮 
     * 
     * @param buttonindex 
     *      按钮下标【从0开始】 
     */ 
    public void onclick(int buttonindex); 
  } 
} 

dialogbean中的代码注释的都很详细了,就不再多解释了,主要就是封装了对话框中常见的属性。接下来就看看定义的所需要的dialog的样式吧:

<style name="theme_dialog_alert" parent="@android:style/theme.dialog"> 
    <item name="android:windownotitle">true</item> 
    <item name="android:windowbackground">@android:color/transparent</item> 
</style> 

样式主要定义了该对话框没有标题,背景颜色是透明的,现在所需的样式定义完了,主角globledialog该出场了,代码如下:

public class globledialog extends dialog implements view.onclicklistener { 
 
  private textview titletextview, contenttextview; 
  private button leftbutton, centerbutton ,rightbutton; 
  private dialogbean bean; 
   
  public globledialog(context context, int theme, dialogbean bean) { 
    super(context, theme); 
    this.bean = bean; 
    initwedgits(); 
  } 
 
  /** 
   * 初始化各组件 
   */ 
  private void initwedgits() { 
    try { 
      setcancelable(bean.iscancelable()); 
      setcanceledontouchoutside(bean.isoutcancelable()); 
      view dialogview = getlayoutinflater().inflate(bean.getlayoutresid(), null); 
      titletextview = (textview) dialogview.findviewbyid(r.id.button_title); 
      contenttextview = (textview) dialogview.findviewbyid(r.id.button_content); 
      titletextview.settext(bean.gettitle()); 
      contenttextview.settext(bean.getcontent()); 
      leftbutton = (button) dialogview.findviewbyid(r.id.button_left); 
      centerbutton = (button) dialogview.findviewbyid(r.id.button_center); 
      rightbutton = (button) dialogview.findviewbyid(r.id.button_right); 
       
      leftbutton.setonclicklistener(this); 
      centerbutton.setonclicklistener(this); 
      rightbutton.setonclicklistener(this); 
       
      if(dialogbuttontype.onebutton == bean.getbuttontype()) { 
        leftbutton.setvisibility(view.gone); 
        rightbutton.setvisibility(view.gone); 
      } else if(dialogbuttontype.twobutton == bean.getbuttontype()) { 
        centerbutton.setvisibility(view.gone); 
      } 
      setcontentview(dialogview); 
       
      window dialogwindow = getwindow(); 
      windowmanager.layoutparams lp = dialogwindow.getattributes(); 
      dialogwindow.setgravity(gravity.center); 
      displaymetrics dm = new displaymetrics(); 
      dialogwindow.getwindowmanager().getdefaultdisplay().getmetrics(dm); 
      lp.width = dm.widthpixels - 20; 
      dialogwindow.setattributes(lp); 
    } catch (exception e) { 
      e.printstacktrace(); 
    } 
  } 
 
  @override 
  public void onclick(view v) { 
    try { 
      switch (v.getid()) { 
      case r.id.button_left: 
        bean.getlistener().onclick(0); 
        break; 
      case r.id.button_center: 
        bean.getlistener().onclick(1); 
        break; 
      case r.id.button_right: 
        bean.getlistener().onclick(2); 
        break; 
      default: 
        break; 
      } 
    } catch (exception e) { 
      e.printstacktrace(); 
    } 
  } 
 
} 

自定义的globledialog的代码写完了,那就看看是如何使用的吧:

package com.llew.e.dialog.view.activity; 
 
import android.app.activity; 
import android.app.dialog; 
import android.os.bundle; 
import android.view.view; 
import android.view.view.onclicklistener; 
import android.widget.textview; 
import android.widget.toast; 
 
import com.llew.e.dialog.r; 
import com.llew.e.dialog.view.bean.dialogbean; 
import com.llew.e.dialog.view.bean.dialogbean.dialogbuttontype; 
import com.llew.e.dialog.view.bean.dialogbean.dialogclicklistener; 
import com.llew.e.dialog.view.wedgit.globledialog; 
 
public class mainactivity extends activity { 
  /** called when the activity is first created. */ 
   
  private dialog dialog; 
  private textview textview; 
   
  @override 
  public void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 
    setcontentview(r.layout.main); 
    textview = (textview) findviewbyid(r.id.textview); 
    textview.setonclicklistener(new onclicklistener() { 
      @override 
      public void onclick(view v) { 
        dialogbean dialogbean = new dialogbean(); 
        dialogbean.setcancelable(true); 
        dialogbean.setoutcancelable(true); 
        dialogbean.settitle("小练习"); 
        dialogbean.setcontent("在这里输入提示信息"); 
        dialogbean.setbuttontype(dialogbuttontype.twobutton); 
        dialogbean.setlayoutresid(r.layout.dialog_common); 
        dialogbean.setlistener(new dialogclicklistener() { 
          @override 
          public void onclick(int buttonindex) { 
            switch (buttonindex) { 
            case 0: 
              toast.maketext(mainactivity.this, "点击了播放", toast.length_short).show(); 
              break; 
            case 1: 
              toast.maketext(mainactivity.this, "点击了暂停", toast.length_short).show(); 
              break; 
            case 2: 
              toast.maketext(mainactivity.this, "点击了停止", toast.length_short).show(); 
              break; 
            default: 
              break; 
            } 
          } 
        }); 
        createdialog(dialogbean); 
      } 
    }); 
  } 
   
  public void createdialog(dialogbean bean) { 
    if(null == dialog) { 
      dialog = new globledialog(mainactivity.this, r.style.theme_dialog_alert, bean); 
    } 
    dialog.show(); 
  } 
} 

代码实在是没有什么好解释的,我相信你一看就会,那看看运行效果吧:

界面看上去有点丑,大家可以自己修改颜色值或者使用图片代替。

好了,到这里自定义dialog实现不同风格效果的对话框就讲解完了,谢谢大家的阅读。

源码下载:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网