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

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

程序员文章站 2024-03-04 00:03:10
虽然android给我们提供了众多组件,但是使用起来都不是很方便,我们开发的apk都有自己的风格,如果使用了系统自带的组件,总是觉得和应用的主题不着边际并且看起来也不顺心,...

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

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

在工程中我定义了一个基类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(); 
  } 
} 

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

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

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

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

源码下载:android ui设计实现各种风格的对话框效果

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