在原生android里面,有两种dialog写法,一种是直接使用里面提供的AlertDialog.Builder方法去使用,另一种是我们自己根据自己的ui来设计(自定义)。在一般开发中,我们主要使用的是自定义,主要是AlertDialog.Builder提供的dialog不够美观,此外也可能无法满足我们的业务要求,但为了大家理解dialog这一个情况,我们两种都介绍一下。
1.AlertDialog.Builder方法
AlertDialog.Builder方法中创建dialog我们只需要在java(或kotlin中)调用提供的方法,不需要我们自己去布局xml,我以java来介绍:
(1)创建对象
AlertDialog.Builder builder = new AlertDialog.Builder(this);
(2)调用对象方法
setTitle();设置弹框标题
setMessage();设置弹框信息
builder.setTitle("提示");
builder.setMessage("是否要关闭这个程序");
(3)添加点击按钮以及点击事件
在android开发弹框里,我们只有三种按钮可以设置,分别是消极(negative)、中立(neutral)、积极(positive)按钮,一个按钮只能设置一个,多次设置会由最新的覆盖老的。消极按钮一般用于cancel等取消按键,积极按钮则是sure等确认按键,中立一般需要看业务来进行设置和配置。
在这个过程中,我们用的方法只有下面两种,当我们不想传入点击事件的话我们可以使用null,此外补充一点,在点击事件里的finish是退出程序结束程序进程的作用:
setPositiveButton();设置积极按钮
setNeutralButton();设置中立按钮
setNegativeButton();设置消极按钮
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
builder.setNegativeButton("取消",null);
(4)展示dialog
builder.show();
效果如下:

怎么样,样式是不是很有年代感,所以我们在原生开发中,一般都会使用自定义来满足我们的业务需求和美观需求,接下来我将展示简约的自定义弹框 。
2.自定义方法
(1)设计xml布局
首先我们要设计我们自定义弹框的布局,我下面设计了一个简约的弹框:
activity_newdialog
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/dialog"
android:clickable="true"
android:orientation="vertical">
<TextView
android:id="@+id/tips_title"
android:textSize="15sp"
android:textStyle="bold"
android:gravity="center"
android:textColor="@color/black"
android:text="弹框"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:layout_marginTop="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tips"
android:layout_marginTop="12dp"
android:layout_marginStart="30dp"
android:layout_marginEnd="30dp"
android:layout_marginBottom="20dp"
android:textSize="15sp"
android:gravity="center"
android:textColor="#888888"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<View
android:background="#EEEEEE"
android:layout_width="match_parent"
android:layout_height="0.5dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/negative_btn"
android:layout_marginTop="15dp"
android:layout_marginStart="20dp"
android:layout_marginEnd="20dp"
android:layout_marginBottom="15dp"
android:gravity="center"
android:textColor="@color/black"
android:textStyle="bold"
android:textSize="15.55sp"
android:text="cancel"
android:layout_weight="0.5"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<View
android:background="#EEEEEE"
android:layout_width="0.5dp"
android:layout_height="match_parent"/>
<TextView
android:id="@+id/positive_btn"
android:layout_marginTop="15dp"
android:layout_marginStart="20dp"
android:layout_marginEnd="20dp"
android:layout_marginBottom="15dp"
android:text="sure"
android:textColor="@color/black"
android:textSize="15.55sp"
android:textStyle="bold"
android:layout_weight="0.5"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
(2)创建MyDialogActivity
我们创建我们对应的Activity文件,为什么创建这个呢,创建后我们就可以当对象方法使用,我们可以在本文件中设计点击事件,需注意的是,本文件需要继承Dialog类
package com.example.myapplication;
import android.app.Dialog;
import android.content.Context;
import android.view.View;
import androidx.annotation.NonNull;
public class MyDialogActivity extends Dialog {
public MyDialogActivity(@NonNull Context context, int themeResId) {
super(context, themeResId);
setContentView(R.layout.activity_newdialog);
findViewById(R.id.positive_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.exit(0);
}
});
findViewById(R.id.negative_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
}
}
话外载体一嘴,我们这里是没有finish方法的,那我们替换为System.exit(0);
(3)设置样式
因为我们后面实例化样式的话需要传递两个参数,一个是this,还有一个是我们的样式,所以我们在themes下创建样式
<style name="mydialog" parent="Theme.MaterialComponents.Dialog">
<!-- 透明背景 -->
<item name="android:windowBackground">@android:color/transparent</item>
<!-- 隐藏标题栏 -->
<item name="android:windowNoTitle">true</item>
<!-- 文字颜色 -->
<item name="android:textColorPrimary">@color/black</item>
<!-- 按钮样式 -->
<item name="buttonBarPositiveButtonStyle">@style/Widget.MaterialComponents.Button.TextButton.Dialog</item>
<item name="buttonBarNegativeButtonStyle">@style/Widget.MaterialComponents.Button.TextButton.Dialog</item>
</style>
(4)实例化对象并使用
MyDialogActivity md = new MyDialogActivity(this,R.style.mydialog);
md.show();
最终效果展示:

嗯?是不是比原本原生提供的好看?嗯?那我问你,look at my eyes。
下课!