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

yizhihongxing

针对“属于自己的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日

相关文章

  • TreeSet详解和使用示例_动力节点Java学院整理

    TreeSet详解和使用示例 概述 TreeSet是基于TreeMap实现的一种具有排序功能的集合,可以自动对集合中的元素进行排序,也可以自行指定排序规则。TreeSet中不允许插入重复元素,而且TreeSet中的元素一定是按照某种排序规则排序的,这也是TreeSet的最大特点。本文将详细介绍TreeSet的使用方法和注意事项。 TreeSet的特点 Tre…

    other 2023年6月26日
    00
  • win7系统中怎么设置打印机的IP地址和端口?

    在Win7系统中设置打印机的IP地址和端口需要按照以下步骤进行操作: 首先,确保你已经连接到了与打印机相同的网络。确保打印机已经正确连接到电源并且处于开启状态。 打开控制面板。你可以通过点击开始菜单,然后选择控制面板来打开它。 在控制面板中,找到并点击“设备和打印机”选项。 在设备和打印机窗口中,你会看到已经安装的打印机列表。找到你想要设置IP地址和端口的打…

    other 2023年7月30日
    00
  • chrome开发者工具-timeline的详细介绍

    Chrome 开发者工具 – Timeline 的详细介绍 Chrome 开发者工具是一款功能强大的 web 开发调试工具,其中 Timeline 是其中的一个非常重要的功能模块。它可以记录网站运行中的各种时间数据,帮助我们分析网站性能问题。接下来我将详细介绍 Chrome 开发者工具 – Timeline 功能模块的使用方法。 如何打开 Timeline …

    other 2023年6月27日
    00
  • 蘑菇街TeamTalk编译连接过程中遇到的问题及解决方法(iOS)

    蘑菇街TeamTalk是一款开源的即时通讯软件,支持多平台,包括iOS。在编译连接过程中,可能会遇到一些问题。本文将详细介绍蘑菇街TeamTalk编译连接过程中可能遇到的问题及解决方法,并提供两个示例说明。 问题及解决方法 问题1:Undefined symbols for architecture armv7 错误信息: Undefined symbols…

    other 2023年5月5日
    00
  • mssql存储过程表名和字段名为变量的实现方法

    要实现mssql存储过程表名和字段名为变量的功能,可以采用动态SQL语句的方式。具体步骤如下: 1. 声明变量 首先,需要声明两个变量:一个表示表名,一个表示字段名。可以使用以下语句进行声明: DECLARE @tableName NVARCHAR(MAX); DECLARE @columnName NVARCHAR(MAX); 这里将变量类型设置为NVAR…

    other 2023年6月26日
    00
  • 一个ASP创建动态对象的工厂类(类似PHP的stdClass)

    以下是创建一个ASP创建动态对象的工厂类(类似PHP的stdClass)的完整攻略: 创建动态对象的工厂类 创建一个名为DynamicObjectFactory的类,用于创建动态对象。示例代码如下: Class DynamicObjectFactory Public Function CreateObject() Set CreateObject = Ser…

    other 2023年10月15日
    00
  • iPhone手机无法上网怎么办 连不上频繁断开的解决方法

    iPhone手机无法上网怎么办 连不上频繁断开的解决方法 问题表现 有些用户在使用 iPhone 手机上网时,遇到无法上网或连接频繁断开等问题,这些问题会严重影响用户的使用体验。 问题原因 网络信号问题:当手机网络信号不稳定或者信号弱时,会出现上网困难的情况。 网络设置问题:网络设置错误也可能导致上网失败或者频繁断开。 软件问题:当 iOS 系统或者浏览器等…

    other 2023年6月27日
    00
  • C++变量,常量,数组和字符串详解

    C++变量、常量、数组和字符串详解 变量 在C++中,变量是用于存储数据的一种方式。每个变量都有一个类型和一个名称,可以通过名称来访问和操作变量的值。 声明变量 在使用变量之前,需要先声明它们。变量的声明告诉编译器变量的类型和名称。 int age; // 声明一个整数类型的变量age float salary; // 声明一个浮点数类型的变量salary …

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