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

Android 自定义dialog的实现代码

程序员文章站 2023-10-23 14:52:16
android 自定义dialog的实现代码 搜索相关关键字网上一大堆实现,但是看完总觉得缺胳膊少腿,绕了不少弯路,终于弄好了自定义dialog。把自己整合的完整代码发上...

android 自定义dialog的实现代码

搜索相关关键字网上一大堆实现,但是看完总觉得缺胳膊少腿,绕了不少弯路,终于弄好了自定义dialog。把自己整合的完整代码发上来。

要点:

1、设置自定义dialog的布局文件my_dialog.xml
2、设置一份自定义的样式文件styles_wx.xml,该文件用于覆盖android的默认主题样式,如黑色边框等。
3、java代码继承dialog实现自定义类mydialog,实现自定义布局,还有设置窗口的大小、位置等。

(网上文章要么少介绍第2点,要么是使用alterdialog直接实现效果)

先看下效果,模仿微信风格的dialog:

Android 自定义dialog的实现代码

Android 自定义dialog的实现代码

允许添加子view到弹出dialog,如:

代码。

part1.styles_wx.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources xmlns:android="http://schemas.android.com/apk/res/android"> 
 
  <!-- 微信弹窗 --> 
  <style name="wx_dialog" parent="@android:style/theme.dialog"> 
    <item name="android:windowframe">@null</item> <!-- 边框 --> 
    <item name="android:windowisfloating">true</item> <!-- 是否浮现在activity之上 --> 
    <item name="android:windowistranslucent">false</item> <!-- 半透明 --> 
    <item name="android:windownotitle">true</item> <!-- 无标题 --> 
    <item name="android:windowbackground">@drawable/transparent</item> <!-- 自己想要的背景 --> 
    <item name="android:backgrounddimenabled">true</item> <!-- 背景内容模糊 --> 
  </style> 
 
</resources> 

注意,此处:

<item name="android:windowbackground">@drawable/transparent</item> 

这是设置对话框弹出背景,尝试设置@null,仍然是黑色背景,在使用半透明图片时会受其影响。

所以,可以在这里指定你想要的背景图片或者颜色。

我为了灵活性,我设置该属性为名为"transparent"的图片,这是一张1*1的透明图片。这样背景完全透明,真正使用的背景在my_dialog.xml里定义

part2.my_dialog.xml

<?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="wrap_content" 
  android:background="@drawable/frame_white" 
  android:orientation="vertical" 
  android:padding="15dp" > 
 
  <textview 
    android:id="@+id/tvtitle" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/systitle" 
    android:textsize="18sp" /> 
 
 
  <!-- 分隔符用 --> 
 
  <textview 
    android:id="@+id/tvseparator" 
    style="@style/textviewasseparator" 
    android:layout_marginbottom="5dp" 
    android:layout_margintop="5dp" /> 
 
  <textview 
    android:id="@+id/tvtext" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/systext" 
    android:textsize="18sp" /> 
 
  <!-- 该relativelayout作为子视图容器 --> 
 
  <relativelayout 
    android:id="@+id/rlcontent" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 
  </relativelayout> 
 
  <relativelayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_margintop="10dp" 
    android:orientation="horizontal" > 
 
    <textview 
      android:id="@+id/tvbutton2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignparentright="true" 
      android:layout_marginleft="10dp" 
      android:background="@drawable/selector_text_button" 
      android:clickable="true" 
      android:paddingbottom="5dp" 
      android:paddingleft="15dp" 
      android:paddingright="15dp" 
      android:paddingtop="5dp" 
      android:text="@string/ok" 
      android:textcolor="@color/wx_text_link" 
      android:textsize="14sp" 
      android:visibility="visible" /> 
 
    <textview 
      android:id="@+id/tvbutton1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignwithparentifmissing="true" 
      android:layout_marginleft="10dp" 
      android:layout_toleftof="@id/tvbutton2" 
      android:background="@drawable/selector_text_button" 
      android:clickable="true" 
      android:paddingbottom="5dp" 
      android:paddingleft="15dp" 
      android:paddingright="15dp" 
      android:paddingtop="5dp" 
      android:text="@string/cancel" 
      android:textcolor="@color/wx_text_link" 
      android:textsize="14sp" /> 
  </relativelayout> 
 
</linearlayout> 

part3.mydialog.java

package com.kwws; 
 
import android.app.dialog; 
import android.content.context; 
import android.os.bundle; 
import android.util.displaymetrics; 
import android.view.layoutinflater; 
import android.view.view; 
import android.view.window; 
import android.view.windowmanager; 
import android.widget.relativelayout; 
import android.widget.textview; 
 
import com.navigator.r; 
 
/** 
 * 自定义对话框 
 * 
 * @author kangwei 
 * 
 */ 
public class mydialog extends dialog { 
 
  /* 属性 */ 
 
  // 数据 
  string title = "title"; 
  string text = "text"; 
  string cancelbuttontext = "cancel"; 
  string okbuttontext = "ok"; 
  int okcolor = -1; 
  int cancelcolor = -1; 
 
  // ui 
  context mcontent; 
  textview tvtitle; 
  textview tvseparator; 
  textview tvtext; 
  textview tvbtn1; 
  textview tvbtn2; 
  relativelayout childviewwrapper;// 子组件容器 
 
  /** 
   * 设置对话框样式,设置null则不显示 
   * 
   * @param context 
   *      上下文 
   * @param title 
   *      标题 
   * @param text 
   *      文本 
   * @param cancelbuttontext 
   *      取消按钮文本 
   * @param okbuttontext 
   *      确认按钮文本 
   */ 
  public mydialog(context context, string title, string text, 
      string cancelbuttontext, string okbuttontext) { 
    super(context, r.style.wx_dialog);// 样式定义,该样式去除android默认的黑色背景边框等。 
    this.mcontent = context; 
    setdialogstyle(title, text, cancelbuttontext, okbuttontext); 
  } 
 
  @override 
  protected void oncreate(bundle savedinstancestate) { 
    // todo auto-generated method stub 
    super.oncreate(savedinstancestate); 
    layoutinflater layout = layoutinflater.from(mcontent); 
    view view = layout.inflate(r.layout.my_dialog, null); 
    setcontentview(view); 
    findview(); 
    initview(); 
    initviewevent(); 
  } 
 
  private void setdialogstyle(string title, string text, 
      string cancelbuttontext, string okbuttontext) { 
    this.title = title; 
    this.text = text; 
    this.cancelbuttontext = cancelbuttontext; 
    this.okbuttontext = okbuttontext; 
  } 
 
  private void findview() { 
    tvtitle = (textview) findviewbyid(r.id.tvtitle); 
    tvseparator = (textview) findviewbyid(r.id.tvseparator); 
    tvtext = (textview) findviewbyid(r.id.tvtext); 
    tvbtn1 = (textview) findviewbyid(r.id.tvbutton1); 
    tvbtn2 = (textview) findviewbyid(r.id.tvbutton2); 
    childviewwrapper = (relativelayout) findviewbyid(r.id.rlcontent); 
  } 
 
  private void initview() { 
    if (title == null) { 
      tvtitle.setvisibility(view.gone); 
      tvseparator.setvisibility(view.gone); 
    } else { 
      tvtitle.setvisibility(view.visible); 
      tvseparator.setvisibility(view.visible); 
      tvtitle.settext(title); 
    } 
    if (text == null) { 
      tvtext.setvisibility(view.gone); 
    } else { 
      tvtext.setvisibility(view.visible); 
      tvtext.settext(text); 
    } 
    if (cancelbuttontext == null) { 
      tvbtn1.setvisibility(view.gone); 
    } else { 
      tvbtn1.setvisibility(view.visible); 
      tvbtn1.settext(cancelbuttontext); 
      if (cancelcolor != -1) { 
        tvbtn1.settextcolor(cancelcolor); 
      } 
    } 
    if (okbuttontext == null) { 
      tvbtn2.setvisibility(view.gone); 
    } else { 
      tvbtn2.setvisibility(view.visible); 
      tvbtn2.settext(okbuttontext); 
      if (okcolor != -1) { 
        tvbtn2.settextcolor(okcolor); 
      } 
    } 
 
    if (childviewwrapper != null && childview != null) { 
      childviewwrapper.addview(childview); 
    } 
 
    // 设置对话框大小 
    window dialogwindow = getwindow(); 
    windowmanager.layoutparams lp = dialogwindow.getattributes(); 
    displaymetrics d = mcontent.getresources().getdisplaymetrics(); 
    // 获取屏幕宽、高用 
    lp.width = (int) (d.widthpixels * 0.8); // 高度设置为屏幕的0.8 
    dialogwindow.setattributes(lp); 
  } 
 
  private void initviewevent() { 
    view.onclicklistener listener = new view.onclicklistener() { 
 
      @override 
      public void onclick(view v) { 
        // todo auto-generated method stub 
        switch (v.getid()) { 
        case r.id.tvbutton1: 
          if (mlistener != null) { 
            mlistener.oncancelbuttonclick(mydialog.this, v); 
          } 
          break; 
        case r.id.tvbutton2: 
          if (mlistener != null) { 
            mlistener.onokbuttonclick(mydialog.this, v); 
          } 
          break; 
        default: 
          break; 
        } 
      } 
    }; 
    tvbtn1.setonclicklistener(listener); 
    tvbtn2.setonclicklistener(listener); 
  } 
 
  public interface ondialogbuttonclicklistener { 
    void oncancelbuttonclick(mydialog dialog, view view); 
 
    void onokbuttonclick(mydialog dialog, view view); 
  } 
 
  private ondialogbuttonclicklistener mlistener; 
 
  /** 
   * 对话框按钮监听 
   * 
   * @param listener 
   */ 
  public void setondialogbuttonclicklistener( 
      ondialogbuttonclicklistener listener) { 
    this.mlistener = listener; 
  } 
 
  /** 
   * 确定按钮文本颜色 
   * 
   * @param color 
   */ 
  public void setokbuttontextcolor(int color) { 
    this.okcolor = color; 
  } 
 
  /** 
   * 取消按钮文本颜色 
   * 
   * @param color 
   */ 
  public void setcancelbuttontextcolor(int color) { 
    this.cancelcolor = color; 
  } 
 
  view childview; 
 
  /** 
   * 在对话框显示自定义视图 
   */ 
  public void setchildview(view view) { 
    childview = view; 
  } 
} 

part4.使用

// 退出提示框 
public void exitdialog() { 
 
  mydialog dialog = new mydialog(this, "提示", "确认退出?", "取消", "退出"); 
  dialog.setokbuttontextcolor(getresources().getcolor(r.color.red)); 
  dialog.setondialogbuttonclicklistener(new ondialogbuttonclicklistener() { 
 
    @override 
    public void onokbuttonclick(mydialog dialog, view view) { 
      finish(); 
    } 
 
    @override 
    public void oncancelbuttonclick(mydialog dialog, view view) { 
      dialog.dismiss(); 
    } 
  }); 
  dialog.show(); 
} 

/* 
   * 显示配置对话框 
   */ 
  private void showconfigdialog() { 
    // 读取参数 
    final sharedpreferenceshelper helper = new sharedpreferenceshelper( 
        this, "config"); 
    final string ip = helper.getvalue("serverip"); 
    final string port = helper.getvalue("serverport"); 
 
    // 配置界面 输入ip和端口的简单界面,这里就不附xml了 
    view view = getlayoutinflater().inflate(r.layout.dialog_config, null); 
    final edittext etip = (edittext) view.findviewbyid(r.id.etip); 
    final edittext etport = (edittext) view.findviewbyid(r.id.etport); 
    etip.settext(ip != null ? ip : ksoap2helper.getserverip()); 
    etport.settext(port != null ? port : string.valueof(ksoap2helper 
        .getserverport())); 
 
    // 配置对话框 
    mydialog dialog = new mydialog(this, "参数配置", null, "取消", "确定"); 
    // 添加配置界面到对话框 
    dialog.setchildview(view); 
    // 按钮监听 
    dialog.setondialogbuttonclicklistener(new ondialogbuttonclicklistener() { 
 
      @override 
      public void onokbuttonclick(mydialog dialog, view view) { 
        // 保存配置 
        string newip = etip.gettext().tostring(); 
        string newport = etport.gettext().tostring(); 
 
        if (true) { 
          helper.putvalue("serverip", newip); 
          ksoap2helper.setserverip(newip); 
        } 
        if (true) { 
          helper.putvalue("serverport", newport); 
          ksoap2helper.setserverport(integer.valueof(newport)); 
        } 
        dialog.dismiss(); 
      } 
 
      @override 
      public void oncancelbuttonclick(mydialog dialog, view view) { 
        dialog.dismiss(); 
      } 
    }); 
    dialog.show(); 
  } 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!