Android原生Dialog

在原生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。

下课!

相关推荐
莞凰8 小时前
昇腾CANN的“灵脉根基“:Runtime仓库探秘
android·人工智能·transformer
NiceCloud喜云9 小时前
Claude Files API 深入:从上传、复用到配额管理的工程化指南
android·java·数据库·人工智能·python·json·飞书
ujainu9 小时前
CANN pto-isa:虚拟指令集如何连接编译与执行
android·ascend
赏金术士10 小时前
第六章:UI组件与Material3主题
android·ui·kotlin·compose
TechMerger11 小时前
Android 17 重磅重构!服役 20 年的 MessageQueue 迎来无锁改造,卡顿大幅优化!
android·性能优化
yuhuofei202114 小时前
【Python入门】Python中字符串相关拓展
android·java·python
dalancon14 小时前
Android Input Spy Window
android
dalancon16 小时前
InputDispatcher派发事件,查找目标窗口
android
我命由我1234516 小时前
Android Framework P3 - MediaServer 进程、认识 ServiceManager 进程
android·c语言·开发语言·c++·visualstudio·visual studio·android runtime
天才少年曾牛17 小时前
Android14 新增系统服务后,应用调用出现 “hidden api” 警告的原因与解决方案
android·frameworks