属于自己的Android对话框(Dialog)自定义集合

针对“属于自己的Android对话框(Dialog)自定义集合”的完整攻略,下面将进行详细讲解。

1.前言

Dialog是Android开发中常用的一个组件,一般情况下系统已经提供了许多定制化的Dialog,但这些Dialog并不能直接满足我们的业务需求,因此需要自定义Dialog,本攻略将用实例来展示如何编写属于自己的Dialog组件。

2.思路分析

自定义Dialog的基本思路是创建一个继承自Dialog类的自定义类,在该类中编写自定义的样式和行为,最终将该类实例化并显示出来。

具体步骤如下:

  1. 创建一个类继承自Dialog;

  2. 在该类中编写自己的样式和行为,比如:添加控件和设置布局等;

  3. 在Activity中实例化自定义类,然后调用show()方法呈现出来。

3.示例解析

下面以“自定义登录对话框”和“自定义日期选择对话框”两个实例来分别展示自定义Dialog的详细步骤。

3.1 自定义登录对话框

3.1.1 创建布局文件

首先需要创建一个布局文件dialog_login.xml,用于设置对话框的布局样式。该文件代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="300dp"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="#ffd700"
        android:gravity="center_horizontal|center_vertical"
        android:text="登录"
        android:textSize="20dp" />

    <EditText
        android:id="@+id/username"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:hint="请输入用户名"
        android:paddingLeft="10dp" />

   <EditText
        android:id="@+id/password"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:hint="请输入密码"
        android:paddingLeft="10dp" />

   <Button
       android:id="@+id/btn_confirm"
       android:layout_width="match_parent"
       android:layout_height="50dp"
       android:text="登录"
       android:background="#ffd700" />

</LinearLayout>

该布局文件采用了线性布局的形式,包含了一个TextView和两个EditText控件以及一个Button控件。

3.1.2 创建自定义类

接着需要创建一个自定义类LoginDialog,继承自Dialog类,用于实现自定义的登录对话框,代码如下:

public class LoginDialog extends Dialog {

    public EditText username, password;
    public Button btnConfirm;

    public LoginDialog(Context context) {
        super(context);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.dialog_login);
        setCanceledOnTouchOutside(false);
        initView();
    }

    private void initView() {
        username = findViewById(R.id.username);
        password = findViewById(R.id.password);
        btnConfirm = findViewById(R.id.btn_confirm);
    }

    public void setPositiveListener(View.OnClickListener listener) {
        btnConfirm.setOnClickListener(listener);
    }
}

该自定义类LoginDialog继承自Dialog类,构造函数中使用requestWindowFeature方法请求不显示标题,然后设置布局文件为dialog_login.xml,并且设置对话框可点击外部取消。同时,该类中包含了三个公共属性:username、password和btnConfirm,分别对应了布局文件中的两个EditText控件和一个Button控件。除此之外,还提供了一个公共方法setPositiveListener,用于设置确认登录按钮的点击事件监听器。

3.1.3 在Activity中使用

最后在Activity中实例化自定义类LoginDialog,并设置确认登录按钮的点击事件监听器,代码如下:

public class MainActivity extends AppCompatActivity {

    private Button mBtnLogin;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        initListener();
    }

    private void initView() {
        mBtnLogin = findViewById(R.id.btn_login);
    }

    private void initListener() {
        mBtnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LoginDialog dialog = new LoginDialog(MainActivity.this);
                dialog.setPositiveListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        String username = dialog.username.getText().toString();
                        String password = dialog.password.getText().toString();
                        Toast.makeText(MainActivity.this, "用户名:" + username + " ,密码:" + password, Toast.LENGTH_SHORT).show();
                        dialog.dismiss();
                    }
                });
                dialog.show();
            }
        });
    }
}

在Activity的onCreate()方法中,首先找到登录按钮控件mBtnLogin,然后为该控件设置点击事件监听器。监听器中,实例化LoginDialog类并为其设置确认登录按钮的点击事件监听器,并在该监听器中获取输入的用户名和密码,并显示一个Toast提示信息,最后调用dismiss方法关闭对话框。

一旦点击了登录按钮,就会显示一个自定义的登录对话框,用户可以在该对话框中输入用户名和密码,然后点击确认按钮,即可触发保存操作和关闭对话框。

3.2 自定义日期选择对话框

3.2.1 创建布局文件

同样需要先创建一个布局文件dialog_date_picker.xml,该文件用于设置对话框的布局样式。该文件代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="300dp"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <DatePicker
        android:id="@+id/date_picker"
        android:layout_width="match_parent"
        android:layout_height="240dp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:padding="10dp"
        android:gravity="right">

        <Button
            android:id="@+id/btn_confirm"
            android:layout_width="50dp"
            android:layout_height="wrap_content"
            android:background="#ffd700"
            android:text="确认" />

        <Button
            android:id="@+id/btn_cancel"
            android:layout_width="50dp"
            android:layout_height="wrap_content"
            android:background="#ffd700"
            android:text="取消" />
    </LinearLayout>
</LinearLayout>

该布局文件采用了线性布局的形式,包含了一个DatePicker控件以及两个Button控件。

3.2.2 创建自定义类

接着需要创建一个自定义类DatePickerDialog,继承自Dialog类,用于实现自定义的日期选择对话框,代码如下:

public class DatePickerDialog extends Dialog {

    private DatePicker datePicker;
    private Button btnCancel;
    private Button btnConfirm;

    public DatePickerDialog(Context context, int themeResId) {
        super(context, themeResId);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.dialog_date_picker);
        datePicker = findViewById(R.id.date_picker);
        btnCancel = findViewById(R.id.btn_cancel);
        btnConfirm = findViewById(R.id.btn_confirm);

        btnCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });
    }

    public void setDate(int year, int month, int day) {
        datePicker.updateDate(year, month, day);
    }

    public void setPositiveButton(View.OnClickListener listener) {
        btnConfirm.setOnClickListener(listener);
    }
}

该自定义类DatePickerDialog继承自Dialog类,构造函数中同样使用requestWindowFeature方法请求不显示标题,然后设置布局文件为dialog_date_picker.xml。此外,在该类中还提供了两个自定义方法:setDate和setPositiveButton。setDate方法用于设置DatePicker控件的初始日期,setPositiveButton方法用于设置确认日期选择按钮的点击事件监听器。

3.2.3 在Activity中使用

最后在Activity中实例化自定义类DatePickerDialog,并将其显示出来,代码如下:

public class MainActivity extends AppCompatActivity {

    private Button mBtnDatePicker;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        initListener();
    }

    private void initView() {
        mBtnDatePicker = findViewById(R.id.btn_date_picker);
    }

    private void initListener() {
        mBtnDatePicker.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DatePickerDialog dialog = new DatePickerDialog(MainActivity.this, R.style.dialog);
                dialog.setDate(2021, 2, 6);
                dialog.setPositiveButton(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        int year = dialog.datePicker.getYear();
                        int month = dialog.datePicker.getMonth();
                        int day = dialog.datePicker.getDayOfMonth();
                        Toast.makeText(MainActivity.this, year + "-" + (month + 1) + "-" + day, Toast.LENGTH_SHORT).show();
                        dialog.dismiss();
                    }
                });
                dialog.show();
            }
        });
    }
}

在Activity中,首先找到日期选择按钮控件mBtnDatePicker,然后为该控件设置点击事件监听器。监听器中,实例化DatePickerDialog类并为其设置日期和确认日期选择按钮的点击事件监听器,并在该监听器中获取选择的日期,并显示一个Toast提示信息,最后调用dismiss方法关闭对话框。

一旦点击了日期选择按钮,就会显示一个自定义的日期选择对话框,用户可以在该对话框中选择日期,然后点击确认按钮,即可触发保存操作和关闭对话框。

4.总结

以上就是自定义Dialog完整攻略的详细步骤和示例展示,自定义Dialog可以满足不同业务场景的需要,也为用户提供更便捷的操作。在自定义Dialog时需要注意样式和行为的一致性,并尽可能保持统一的风格和交互方式,以便于用户使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:属于自己的Android对话框(Dialog)自定义集合 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • windows server 2019 服务器搭建的方法步骤(图文)

    以下是详细讲解“windows server 2019 服务器搭建的方法步骤(图文)”的完整攻略,过程中包含两条示例说明。 1. 准备工作 在搭建Windows Server 2019服务器之前,我们需要做一些准备工作: 一台符合以下要求的电脑: 64位处理器 支持物理内存至少为2GB 支持512MB以上的可用系统存储器 支持网卡并至少具备传输速率为1Gbp…

    other 2023年6月27日
    00
  • 如何安装python的yaml包?

    如何安装Python的yaml包? yaml是一种轻量级的数据序列化格式,常用于配置文件和数据交换。在Python中,可以使用PyYAML库来解析和yaml格式的。本攻略将详细介绍如何安装PyYAML库,包括使用pip安装和手动安装种方法,并提供两示例说明。 使用pip安装 使用pip是安装Python库的最简单方法之一。以下是使用pip安装PyY`库的步骤…

    other 2023年5月7日
    00
  • redisstring的底层数据结构

    RedisString的底层数据结构 Redis是一个流行的开源内存数据库,同时也支持磁盘持久化,它提供了多种数据结构,其中之一就是RedisString。 RedisString是Redis中最基本的数据结构,在Redis中被描述为可以容纳任何类型的字符串。事实上,RedisString的底层数据结构是一个简单的动态字符数组。 动态字符数组 动态字符数组是…

    其他 2023年3月28日
    00
  • 正则表达式验证用户名、密码、手机号码、身份证(推荐)

    下面是正则表达式验证用户名、密码、手机号码、身份证的完整攻略: 什么是正则表达式 正则表达式是一种文本模式,用来描述、匹配一系列符合某个规则的字符串。它通常是由一个字符序列构成,包含了一些特殊字符,用来表达一定规则的字符串。 用户名验证 在用户名验证中,我们通常要求用户名由字母、数字或者下划线组成,长度在6到20之间。下面是对应的正则表达式: /^[a-zA…

    other 2023年6月27日
    00
  • http错误403.14-forbidden的解决办法

    以下是关于“HTTP错误403.14 Forbidden的解决办法”的完整攻略: HTTP错误403.14 Forbidden的解决办法 HTTP错误403.14 Forbidden通常由于IIS服务器上的配置问题导的。以下是一些可能的解决办法: 确认应用程序池的.NET版本:如果用程序池的.NET版本与应用程序不兼容,可能会导致HTTP错误403.14 F…

    other 2023年5月9日
    00
  • ADSL MODEM初始地址及用户名密码大全

    ADSL MODEM初始地址及用户名密码大全攻略 在此文档中,我们将详细讲解ADSL MODEM的初始地址及用户名和密码。如果您遇到了登陆ADSL MODEM时无法成功的问题,本文将为您提供有用的方法。 1. 初始地址 ADSL Modem 的初始地址是用来登陆 Modem 管理界面的,根据不同品牌的 Modem 类型结果也不同。常见的品牌及其对应的初始地址…

    other 2023年6月27日
    00
  • 详解Swift的内存管理

    详解Swift的内存管理攻略 Swift是一种现代的、安全的编程语言,它提供了自动内存管理的机制,使开发者能够更轻松地管理内存资源。本攻略将详细讲解Swift的内存管理机制,并提供两个示例来说明其工作原理。 引用计数(Reference Counting) Swift使用引用计数(Reference Counting)来管理内存。每当一个对象被引用时,其引用…

    other 2023年8月2日
    00
  • mininet和ryu控制器的连接

    Mininet和Ryu控制器的连接的完整攻略 Mininet是一个开源的网络仿真平台,可以用于构建虚拟网络环境。Ryu是一个基于Python的SDN控制器,可以用于控制和管理SDN网络。在SDN网络中,Mininet和Ryu控制器的连接非常重要,本文将为您提供一份Mininet和Ryu控制器的连接的完整攻略,包括实现思路、操作步骤和两个示例说明。 实现思路 …

    other 2023年5月5日
    00
合作推广
合作推广
分享本页
返回顶部