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

Android自定义对话框Dialog的简单实现

程序员文章站 2023-12-14 22:15:28
本文着重研究了自定义对话框,通过一下步骤即可清晰的理解原理,通过更改界面设置和style类型,可以应用在各种各样适合自己的app中。 首先来看一下效果图: 首先是act...

本文着重研究了自定义对话框,通过一下步骤即可清晰的理解原理,通过更改界面设置和style类型,可以应用在各种各样适合自己的app中。

首先来看一下效果图:

首先是activity的界面

Android自定义对话框Dialog的简单实现

点击了上述图片的按钮后,弹出对话框:

Android自定义对话框Dialog的简单实现

点击对话框的确定按钮:

Android自定义对话框Dialog的简单实现

点击对话框的取消按钮:

Android自定义对话框Dialog的简单实现

下面来说一下具体实现步骤:

第一步:设置dialog的样式(一般项目都可以直接拿来用):style.xml中

<!--自定义dialog背景全透明无边框theme-->
 <style name="mydialog" parent="android:style/theme.dialog">
  <!--背景颜色和透明程度-->
  <item name="android:windowbackground">@android:color/transparent</item>
  <!--是否去除标题-->
  <item name="android:windownotitle">true</item>
  <!--是否去除边框-->
  <item name="android:windowframe">@null</item>
  <!--是否浮现在activity之上-->
  <item name="android:windowisfloating">true</item>
  <!--是否模糊-->
  <item name="android:backgrounddimenabled">false</item>
 </style>

第二步:自定义dialog:

(1)自定义的dialog的布局:dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="#11ffffff">
<linearlayout
 android:layout_width="260dp"
 android:layout_height="wrap_content"
 android:layout_centerinparent="true"
 android:background="@drawable/free_dialog_bg"
 android:orientation="vertical">
<textview
 android:id="@+id/title"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_gravity="center"
 android:text="警告!!!"
 android:textcolor="#38adff"
 android:textsize="16sp"/>
 <textview
  android:id="@+id/message"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_marginleft="20dp"
  android:layout_marginright="20dp"
  android:layout_gravity="center"
  android:text="您的手机马上自爆"/>
 <view
  android:layout_width="match_parent"
  android:layout_height="1px"
  android:layout_margintop="15dp"
  android:background="#e4e4e4"/>
 <linearlayout
  android:layout_width="match_parent"
  android:layout_height="40dp"
  android:orientation="horizontal">
  <button
   android:id="@+id/no"
   android:layout_width="0dp"
   android:layout_height="match_parent"
   android:layout_weight="1"
   android:layout_marginleft="10dp"
   android:background="@null"
   android:gravity="center"
   android:lines="1"
   android:text="取消"
   android:textcolor="#7d7d7d"
   android:textsize="16sp"/>
  <view
   android:layout_width="1px"
   android:layout_height="match_parent"
   android:background="#e4e4e4"/>
  <button
   android:id="@+id/yes"
   android:layout_width="0dp"
   android:layout_height="match_parent"
   android:layout_weight="1"
   android:layout_marginright="10dp"
   android:background="@null"
   android:gravity="center"
   android:lines="1"
   android:text="确定"
   android:textcolor="#38adff"
   android:textsize="16sp"/>
 </linearlayout>
</linearlayout>
</relativelayout>

(2)自定义dialog布局中的背景:free_dialog_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <solid android:color="#ffffff" />
 <stroke
  android:width="0.8dp"
  android:color="#ffffff" />
 <!-- 圆角 -->
 <corners android:radius="6dp" />
</shape>

(3) 自定义的dialog的java:mydialog.class

package com.syah.mydialog;

import android.app.dialog;
import android.content.context;
import android.os.bundle;
import android.support.annotation.nonnull;
import android.support.annotation.styleres;
import android.view.view;
import android.widget.button;
import android.widget.textview;

/**
 * 创建自定义的dialog,主要学习实现原理
 * created by admin on 2017/8/30.
 */

public class mydialog extends dialog {
 private button yes;//确定按钮
 private button no;//取消按钮
 private textview titletv;//消息标题文本
 private textview message;//消息提示文本
 private string titlestr;//从外界设置的title文本
 private string messagestr;//从外界设置的消息文本
 //确定文本和取消文本的显示的内容
 private string yesstr, nostr;
 private onnoonclicklistener noonclicklistener;//取消按钮被点击了的监听器
 private onyesonclicklistener yesonclicklistener;//确定按钮被点击了的监听器

 public mydialog(@nonnull context context, @styleres int themeresid) {
  super(context, themeresid);
 }

 /**
  * 设置取消按钮的显示内容和监听
  *
  * @param str
  * @param onnoonclicklistener
  */
 public void setnoonclicklistener(string str, onnoonclicklistener onnoonclicklistener) {
  if (str != null) {
   nostr = str;
  }
  this.noonclicklistener = onnoonclicklistener;
 }

 /**
  * 设置确定按钮的显示内容和监听
  *
  * @param str
  * @param yesonclicklistener
  */
 public void setyesonclicklistener(string str, onyesonclicklistener yesonclicklistener) {
  if (str != null) {
   yesstr = str;
  }
  this.yesonclicklistener = yesonclicklistener;
 }



 @override
 protected void oncreate(bundle savedinstancestate) {
  super.oncreate(savedinstancestate);
  setcontentview(r.layout.dialog);
  //空白处不能取消动画
  setcanceledontouchoutside(false);

  //初始化界面控件
  initview();

  //初始化界面数据
  initdata();
  //初始化界面控件的事件
  initevent();
 }

 /**
  * 初始化界面控件
  */
 private void initview() {
  yes = findviewbyid(r.id.yes);
  no = findviewbyid(r.id.no);
  titletv = (textview) findviewbyid(r.id.title);
  message = (textview) findviewbyid(r.id.message);
 }

 /**
  * 初始化界面控件的显示数据
  */
 private void initdata() {
  //如果用户自定了title和message
  if (titlestr != null) {
   titletv.settext(titlestr);
  }
  if (messagestr != null) {
   message.settext(messagestr);
  }
  //如果设置按钮文字
  if (yesstr != null) {
   yes.settext(yesstr);
  }
  if (nostr != null) {
   no.settext(nostr);
  }
 }

 /**
  * 初始化界面的确定和取消监听
  */
 private void initevent() {
  //设置确定按钮被点击后,向外界提供监听
  yes.setonclicklistener(new view.onclicklistener() {
   @override
   public void onclick(view v) {
    if (yesonclicklistener != null) {
     yesonclicklistener.onyesonclick();
    }
   }
  });
  //设置取消按钮被点击后,向外界提供监听
  no.setonclicklistener(new view.onclicklistener() {
   @override
   public void onclick(view v) {
    if (noonclicklistener != null) {
     noonclicklistener.onnoclick();
    }
   }
  });
 }

 /**
  * 从外界activity为dialog设置标题
  *
  * @param title
  */
 public void settitle(string title) {
  titlestr = title;
 }

 /**
  * 从外界activity为dialog设置message
  *
  * @param message
  */
 public void setmessage(string message) {
  messagestr = message;
 }

 public interface onnoonclicklistener {
  public void onnoclick();
 }

 public interface onyesonclicklistener {
  public void onyesonclick();
 }
}

第三步:activity中使用自定义对话框:

(1)activity的布局文件:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.constraintlayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context="com.syah.mydialog.mainactivity">

 <button
  android:id="@+id/btn"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="自定义dialog"
  app:layout_constraintbottom_tobottomof="parent"
  app:layout_constraintleft_toleftof="parent"
  app:layout_constraintright_torightof="parent"
  app:layout_constrainttop_totopof="parent" />

</android.support.constraint.constraintlayout>

(2) mainactivity.class

package com.syah.mydialog;

import android.support.v7.app.appcompatactivity;
import android.os.bundle;
import android.view.view;
import android.view.window;
import android.widget.button;
import android.widget.toast;

public class mainactivity extends appcompatactivity {
 private mydialog mydialog;
 private button button;

 @override
 protected void oncreate(bundle savedinstancestate) {
  super.oncreate(savedinstancestate);
  requestwindowfeature(window.feature_no_title);
  setcontentview(r.layout.activity_main);
  button = (button) findviewbyid(r.id.btn);
  button.setonclicklistener(new view.onclicklistener() {
   @override
   public void onclick(view view) {
    mydialog=new mydialog(mainactivity.this,r.style.mydialog);
    mydialog.settitle("警告!");
    mydialog.setmessage("警告:您的手机3秒钟内自爆");
    mydialog.setyesonclicklistener("确定", new mydialog.onyesonclicklistener() {
     @override
     public void onyesonclick() {
      toast.maketext(getapplicationcontext(),"拜拜,我们来生见",toast.length_long).show();
      mydialog.dismiss();
     }
    });
    mydialog.setnoonclicklistener("取消", new mydialog.onnoonclicklistener() {
     @override
     public void onnoclick() {
      toast.maketext(getapplicationcontext(),"明智的选择",toast.length_long).show();
      mydialog.dismiss();
     }
    });
    mydialog.show();
   }
  });
 }
}

原理:

1、通过构造方法给dialog设置一个主题 r.style.mydialog , 主要设置dialog的显示属性,一般都是 全透明无边框

2、然后在dialog的oncreate()方法中,用setcontentview( r.layout.selfdialog) 为dialog设置xml文件,我们就可以在layout文件中创建自定义的dialog风格。这里我就自定义了xml文件格式,实现了自定义的外观风格,不受系统的主题影响。

3、然后通过设置要为外界设置一些public 公开的方法,来向自定义的dialog传递值。这里的title 和 message,都是可以通过外界传值进来,进行设置的。如下面的public 方法就是供外界activity来设置title和message的:

/**
  * 从外界activity为dialog设置标题
  *
  * @param title
  */
 public void settitle(string title) {
  titlestr = title;
 }

 /**
  * 从外界activity为dialog设置message
  *
  * @param message
  */
 public void setmessage(string message) {
  messagestr = message;
 }

在activity通过实例化dialog后就可以设置titile和message了。

mydialog=new mydialog(mainactivity.this);
mydialog.settitle("警告!");
mydialog.setmessage("警告:您的手机3秒钟内自爆");

另外在mydialog.class中通过下面构造器可以更灵活的选择dialog的类型

public mydialog(@nonnull context context, @styleres int themeresid) {
  super(context, themeresid);
  }

activity中使用自定义的dialog:

mydialog=new mydialog(mainactivity.this,r.style.mydialog);

4、最后,自定义的dialog中包含了一些按钮的时候,这个时候要想让按钮有点击事件,并且把这个点击事件能够传递给activity,让acitvity做一些事情,这里就需要设置监听接口,让button的点击事件能够让外界activity知道。如下面的代码。

/**
  * 确定按钮接口
  */
 public interface onnoonclicklistener {
  public void onnoclick();
 }

 /**
  * 取消按钮接口
  */
 public interface onyesonclicklistener {
  public void onyesonclick();
 }
private onnoonclicklistener noonclicklistener;//取消按钮被点击了的监听器
 private onyesonclicklistener yesonclicklistener;//确定按钮被点击了的监听器

 /**
  * 设置取消按钮的显示内容和监听
  *
  * @param str
  * @param onnoonclicklistener
  */
 public void setnoonclicklistener(string str, onnoonclicklistener onnoonclicklistener) {
  if (str != null) {
   nostr = str;
  }
  this.noonclicklistener = onnoonclicklistener;
 }

 /**
  * 设置确定按钮的显示内容和监听
  *
  * @param str
  * @param yesonclicklistener
  */
 public void setyesonclicklistener(string str, onyesonclicklistener yesonclicklistener) {
  if (str != null) {
   yesstr = str;
  }
  this.yesonclicklistener = yesonclicklistener;
 }
//设置确定按钮被点击后,向外界提供监听
  yes.setonclicklistener(new view.onclicklistener() {
   @override
   public void onclick(view v) {
    if (yesonclicklistener != null) {
     yesonclicklistener.onyesonclick();
    }
   }
  });
  //设置取消按钮被点击后,向外界提供监听
  no.setonclicklistener(new view.onclicklistener() {
   @override
   public void onclick(view v) {
    if (noonclicklistener != null) {
     noonclicklistener.onnoclick();
    }
   }
  });

activity就可以设置监听接口来实时获取button的点击事件如下:

mydialog.setyesonclicklistener("确定", new mydialog.onyesonclicklistener() {
     @override
     public void onyesonclick() {
      toast.maketext(getapplicationcontext(),"拜拜,我们来生见",toast.length_long).show();
      mydialog.dismiss();
     }
    });
    mydialog.setnoonclicklistener("取消", new mydialog.onnoonclicklistener() {
     @override
     public void onnoclick() {
      toast.maketext(getapplicationcontext(),"明智的选择",toast.length_long).show();
      mydialog.dismiss();
     }
    });

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

上一篇:

下一篇: