Android Studio新手开发第十二天

Android对话框详解与使用

目录

1.提醒对话框AlertDialog

2.日期对话框DatePickerDialog

3.时间对话框TimePickerDialog


1.提醒对话框AlertDialog

        提醒对话框AlertDialog是常用的对话框,可以完成常见的交互操作,如提示,确认,选择等功能。查看AlertDialog类的源代码可以看到它并没有public类型的构造方法,因此无法通过正常方式获取实例,那么该如何获取这个类的实例呢?在AlertDialog的源码中有一个公共Builder类,它可以通过create方法生成一个对话框实例,通过create获取的实例调用show方法弹出对话框。下面是部分源代码,可以看到AlertDialog的构造方法是protected类型,无法在类外调用。在Builder中的这两个方法都返回ALertDialog实例,那么两者有什么区别?create方法是返回一个实例但还需要调用生成的实例的show方法来展示对话框;而show方法则一步到位直接显示对话框,相当于同时调用crate方法与show方法。

//AlertDialog中的构造函数
    protected AlertDialog(Context context) {
        super((Context)null);
        throw new RuntimeException("Stub!");
    }

    protected AlertDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {
        super((Context)null);
        throw new RuntimeException("Stub!");
    }

    protected AlertDialog(Context context, int themeResId) {
        super((Context)null);
        throw new RuntimeException("Stub!");
    }
//AlertDialog中的Builder类中的方法
public static class Builder {
        public AlertDialog create() {
            throw new RuntimeException("Stub!");
        }

        public AlertDialog show() {
            throw new RuntimeException("Stub!");
        }
    }

        由于AlertDialog无法正常获取实例,需要借助建造器AlertDialog.Builder来设置参数,如对话框的标题、内容、图标等。这些都有对应的方法来设置。下面介绍主要的方法。

        1. setIcon:设置对话框的标题图标,图标显示在标题左侧。

        2. setTitle:设置对话框的标题。

        3. setMessage:设置对话框的文本内容。

        4. setPositiveButton:设置肯定按钮的信息,包括按钮的文本以及按钮监听器

        5. setNegativeButton:设置否定按钮的信息。

        6. setNeutralButton:设置中性按钮信息。

        7. create:获取ALertDialog实例。

        8. show:获取实例并展示对话框。

下面是代码示例,设置了两个按钮,一个先create后show,一个直接show。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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=".DialogActivity"
    android:orientation="vertical">

    <Button
        android:id="@+id/dialog_button_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="先create后show弹出提醒框"/>
    
    <Button
        android:id="@+id/dialog_button_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="直接show弹出对话框"/>

</LinearLayout>
import androidx.appcompat.app.AppCompatActivity;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class DialogActivity extends AppCompatActivity implements DialogInterface.OnClickListener, View.OnClickListener {

    private AlertDialog.Builder builder;

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

        Button dialog_button_1 = findViewById(R.id.dialog_button_1);
        Button dialog_button_2 = findViewById(R.id.dialog_button_2);
        builder = new AlertDialog.Builder(this);
        builder.setIcon(R.drawable.image_3);
        builder.setTitle(R.string.app_name);
        builder.setMessage("请选择");
        builder.setNeutralButton("忽略", this);
        builder.setNegativeButton("拒绝", this);
        builder.setPositiveButton("接受", this);
        dialog_button_1.setOnClickListener(this);
        dialog_button_2.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.dialog_button_1) {
            AlertDialog alertDialog = builder.create();
            alertDialog.show();
        } else {
            AlertDialog alertDialog = builder.show();
        }

    }

    @Override
    public void onClick(DialogInterface dialogInterface, int i) {
        if (i == DialogInterface.BUTTON_NEUTRAL) {
            Toast.makeText(DialogActivity.this, "选择忽略", Toast.LENGTH_SHORT).show();
        } else if (i == DialogInterface.BUTTON_POSITIVE) {
            Toast.makeText(DialogActivity.this, "选择接受", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(DialogActivity.this, "选择拒绝", Toast.LENGTH_SHORT).show();
        }
    }
}

效果图如下,先后点击两个按钮发现效果一样。一般情况下选择第一种方式较为稳妥。

2.日期对话框DatePickerDialog

        日期选择功能是比较常见的,系统专门提供了日期选择器DatePicker,但这种选择器不是弹窗模式而要占据页面的一块较大的区域且不会自动关闭。在正常使用时所需要的功能是选择好日期后自动关闭且最好不要占据太大的页面区域。日期对话框能够实现类似的功能。日期对话框DatePickerDialog可以看做在提醒对话框ALertDialog中加了日期选择器DatePicker。日期选择事件由监听器OnDateSetListener负责响应,在该监听器的onDateSet方法的参数中的月份参数的起始值是由0开始的,所以要使用该值需要记得加一。代码示例如下。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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=".DatePickerDialogActivity"
    android:orientation="vertical">

    <DatePicker
        android:id="@+id/datePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="弹出日期对话框"/>

</LinearLayout>

        Calendar类用于获取当前的年月日。在实例化DatePickerDialog的构造方法中,第一个参数为当前页面实例,第二个为日期监听器,后面三个分别为年月日。onDateSet方法的第一个参数为日期对话框实例,后三个为年月日,特别注意月要加一才能正确获取。最后给按钮添加点击监听器。

//部分Java代码
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_date_picker_dialog);
        DatePicker datePicker = findViewById(R.id.datePicker);

        Button button = findViewById(R.id.button);
        Calendar calendar = Calendar.getInstance();
        datePicker.setFirstDayOfWeek(calendar.getFirstDayOfWeek());

        DatePickerDialog datePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker datePicker, int year, int month, int day) {
                Toast.makeText(DatePickerDialogActivity.this,String.format("%s年%s月%s日",year,month+1,day), Toast.LENGTH_SHORT).show();
            }
        },calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH));

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                datePickerDialog.show();
            }
        });
    }

效果图如下,可以看到DatePicker的视图范围是很大的,而使用日期对话框就只需要一个按钮即可并不用占据过大的页面空间。在对话框选择好日期后点击确定或者取消即可关闭,不用占据页面空间。

3.时间对话框TimePickerDialog

        有了日期选择器自然也要有时间选择器。不过该时间选择器的缺点与日期类似,在使用上不方便。于是也有了时间对话框TimePickerDialog,它的用法与日期对话框DatePickerDialog类似,在构造方法中有些不同。时间选择监听器为OnTimeSetListener,对应需要实现onTimeSet方法。示例代码如下。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".TimePickerDialogActivity">

    <TimePicker
        android:id="@+id/timePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="弹出时间对话框" />

</LinearLayout>

        方法setIs4HourView用于设置是否为24小时制,这里的参数值为true即为24小时制。TimePickerDialog的构造方法第一个参数为页面实例,第二个为时间监听器,第三四个为小时与分钟,最后一个为是否为24小时制,这里的值为true表示24小时制。

//部分Java代码
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_time_picker_dialog);

        TimePicker timePicker = findViewById(R.id.timePicker);
        Button button = findViewById(R.id.button);

        Calendar calendar = Calendar.getInstance();
        timePicker.setIs24HourView(true);
        timePicker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY));
        timePicker.setCurrentMinute(calendar.get(Calendar.MINUTE));

        TimePickerDialog timePickerDialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
            @Override
            public void onTimeSet(TimePicker timePicker, int hour, int minute) {
                Toast.makeText(TimePickerDialogActivity.this,String.format("%s:%s",hour,minute),Toast.LENGTH_SHORT).show();
            }
        },calendar.get(Calendar.HOUR_OF_DAY),calendar.get(Calendar.MINUTE),true);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                timePickerDialog.show();
            }
        });
    }

效果图如下,时间采取24小时制。左下角的键盘点击进去可以自行输入时间。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值