运维开发网

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

运维开发网 https://www.qedev.com 2022-04-24 15:50 出处:网络
这篇文章主要为大家详细介绍了Android自定义对话框Dialog的简单实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

这篇文章主要为大家详细介绍了Android自定义对话框Dialog的简单实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文重点研究自定义对话框,通过一步就能清楚的了解原理。通过改变界面设置和风格类型,可以应用到各种适合自己的app上。

我们先来看看效果图:

首先是活动的界面。


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


单击对话框中的确定按钮:


单击对话框中的取消按钮:


下面说说具体的实施步骤:

第一步:设置对话框的样式(一般项目可以直接使用):在style.xml中

lt;!--自定义Dialog背景全透明无边框theme--gt; lt;style name="MyDialog" parent="android:style/Theme.Dialog"gt; lt;!--背景颜色和透明程度--gt; lt;item name="android:windowBackground"gt;@android:color/transparentlt;/itemgt; lt;!--是否去除标题--gt; lt;item name="android:windowNoTitle"gt;truelt;/itemgt; lt;!--是否去除边框--gt; lt;item name="android:windowFrame"gt;@nulllt;/itemgt; lt;!--是否浮现在activity之上--gt; lt;item name="android:windowIsFloating"gt;truelt;/itemgt; lt;!--是否模糊--gt; lt;item name="android:backgroundDimEnabled"gt;falselt;/itemgt; lt;/stylegt;

步骤2:自定义对话框:

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

lt;#63;xml version="1.0" encoding="utf-8"#63;gt;lt;RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#11ffffff"gt;lt;LinearLayout android:layout_width="260dp" android:layout_height="wrap_content" android:layout_centerInParent="true" android:background="@drawable/free_dialog_bg" android:orientation="vertical"gt;lt;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"/gt; lt;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="您的手机马上自爆"/gt; lt;View android:layout_width="match_parent" android:layout_height="1px" android:layout_marginTop="15dp" android:background="#E4E4E4"/gt; lt;LinearLayout android:layout_width="match_parent" android:layout_height="40dp" android:orientation="horizontal"gt; lt;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"/gt; lt;View android:layout_width="1px" android:layout_height="match_parent" android:background="#E4E4E4"/gt; lt;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"/gt; lt;/LinearLayoutgt;lt;/LinearLayoutgt;lt;/RelativeLayoutgt;

(2)自定义对话框布局中的背景:free _ dialog _ bg.xml。

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

(3)自定义对话框的Java:my Dialog . 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(); }}

步骤3:使用活动中的自定义对话框:

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

lt;#63;xml version="1.0" encoding="utf-8"#63;gt;lt;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"gt; lt;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" /gt;lt;/android.support.constraint.ConstraintLayoutgt;

(2)主活动.类

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.通过构造方法为对话框设置一个主题R.style.MyDialog,主要设置对话框的显示属性,一般都是透明无边框的;

2.然后在对话框的onCreate()方法中,用setContentView(r . layout . self Dialog)设置对话框的XML文件,我们就可以在布局文件中创建自定义的对话框样式了。这里我自定义xml文件格式,实现自定义外观样式,不受系统主题影响。

3.然后,通过设置一些向外界公开的方法,将值传递给自定义对话框。这里的标题和消息可以通过从外部传入值来设置。例如,以下公共方法用于外部活动设置标题和消息:

/** * 从外界Activity为Dialog设置标题 * * @param title */ public void setTitle(String title) { titleStr = title; } /** * 从外界Activity为Dialog设置message * * @param message */ public void setMessage(String message) { messageStr = message; }

标题和消息可以在活动实例化对话框后设置。

myDialog=new MyDialog(MainActivity.this);myDialog.setTitle("警告!");myDialog.setMessage("警告:您的手机3秒钟内自爆");

另外,在MyDialog.class中,可以通过下面的构造函数更灵活地选择对话框的类型。

public MyDialog(@NonNull Context context, @StyleRes int themeResId) { super(context, themeResId); }

在活动中使用自定义对话框:

myDialog=new MyDialog(MainActivity.this,R.style.MyDialog);

4.最后,当自定义对话框包含一些按钮时,此时,如果你希望按钮有一个点击事件,并且这个点击事件可以传递给activity,让activity做一些事情,你需要在这里设置一个监控接口,让按钮的点击事件可以让外面的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可以将监控接口设置为实时获取按钮点击事件,如下所示:

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(); } });

这就是本文的全部内容。希望对大家的学习有帮助,也希望大家能支持一下搜源网。


0

精彩评论

暂无评论...
验证码 换一张
取 消