轻松实现可扩展自定义的Android滚轮时间选择控件

yizhihongxing

下面给您详细讲解“轻松实现可扩展自定义的Android滚轮时间选择控件”的完整攻略。

1. 需求明确与分析

在开始实现Android滚轮时间选择控件之前,我们需要先明确需求,并分析需要具备哪些功能。本次需求明确如下:

  • 实现时间选择控件,能够快速选择时分。
  • 时间可自定义,如自定义可选择时间范围、可设置最小、最大可选择时间等。
  • 提供回调函数接口以便于获取用户选择结果。

2. 设计与实现

根据需求分析,我们可以设计并实现出一个具有可扩展自定义的Android滚轮时间选择控件,具体实现步骤如下:

2.1 自定义日期选择控件

首先我们需要自定义一个时间选择控件,用于用户选择所需的时间。我们可以通过Java代码及XML布局文件两种方式来自定义控件。这里我们采用XML布局文件的方式,具体实现步骤如下:

  • 在项目的res/layout目录下,新建一个名为"my_time_picker.xml"的布局文件;
  • 在该布局文件中添加一个"NumberPicker"(数字选择器)和一个"TextView"(文本标签),其中"NumberPicker"用于选择小时和分钟,"TextView"用于显示“小时”和“分钟”;
  • 设定"NumberPicker"的最小值、最大值、当前值,设定"NumberPicker"的选择器属性;
  • 在"NumberPicker"和"TextView"之间使用水平布局,使其水平排列。

my_time_picker.xml 文件代码示例如下:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">

<NumberPicker
    android:id="@+id/np_time"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:gravity="center"
    android:maxValue="59"
    android:minValue="0"
    android:value="0" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="小时" />

</LinearLayout>

2.2 创建时间选择对话框

接下来,我们需要创建一个时间选择对话框,用于用户选择小时和分钟。具体实现步骤如下:

  • 创建一个alertDialog,用于显示时间选择器;
  • 设置对话框标题;
  • 引入自定义的视图,即“my_time_picker.xml”中的布局文件,用于实现选择器界面;
  • 给“OK”、“CANCEL”按钮设置监听器,用于处理用户选择结果。

代码示例如下:

public class TimePickerDialog extends DialogFragment implements DialogInterface.OnClickListener {
    private OnTimeSelectedListener mListener;
    private int mCurrentHour = 0;
    private int mCurrentMinute = 0;

    public interface OnTimeSelectedListener {
        void onTimeSelected(int hour, int minute);
    }

    public TimePickerDialog() {
        // Required empty public constructor
    }

    public static TimePickerDialog newInstance(int currentHour, int currentMinute) {
        TimePickerDialog fragment = new TimePickerDialog();
        Bundle args = new Bundle();
        args.putInt("currentHour", currentHour);
        args.putInt("currentMinute", currentMinute);
        fragment.setArguments(args);
        return fragment;
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Bundle savedInstanceState1 = getArguments();
        mCurrentHour = savedInstanceState1.getInt("currentHour");
        mCurrentMinute = savedInstanceState1.getInt("currentMinute");

        View view = getActivity().getLayoutInflater().inflate(R.layout.my_time_picker, null);

        NumberPicker npTime = view.findViewById(R.id.np_time);
        npTime.setMinValue(0);
        npTime.setMaxValue(23);
        npTime.setValue(mCurrentHour);

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("请选择时间");
        builder.setView(view);
        builder.setPositiveButton(android.R.string.ok, this);
        builder.setNegativeButton(android.R.string.cancel, null);

        return builder.create();
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        NumberPicker npTime = ((AlertDialog)dialog).findViewById(R.id.np_time);
        int hour = npTime.getValue();
        mListener.onTimeSelected(hour,mCurrentMinute);

    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnTimeSelectedListener) {
            mListener = (OnTimeSelectedListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnTimeSelectedListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }
}

2.3 展示时间选择对话框

最后,我们需要在当前Activity中展示时间选择对话框,并获取用户选择结果。具体实现步骤如下:

  • 继承自本文定义的视图内部接口,用于显示时间选择对话框;
  • 设置时间选择控件的监听器,用于处理用户的选择结果;
  • 实现OnTimeSelectedListener接口,用于获取用户选择的时间结果。

代码示例如下:

public class MainActivity extends AppCompatActivity implements TimePickerDialog.OnTimeSelectedListener {
    private TextView tv_result;

    private int mHour = 0;
    private int mMinute = 0;

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

        tv_result = findViewById(R.id.tv_result);
        findViewById(R.id.btn_show_timepicker).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                TimePickerDialog timePickerDialog = TimePickerDialog.newInstance(mHour, mMinute);
                timePickerDialog.show(MainActivity.this.getSupportFragmentManager(), null);
            }
        });
    }

    @Override
    public void onTimeSelected(int hour, int minute) {
        mHour = hour;
        mMinute = minute;
        tv_result.setText(getString(R.string.your_choice, String.valueOf(mHour), String.valueOf(mMinute)));
    }
}

至此,我们的时间选择控件已经构建完成,完整代码如下所示:

public class TimePickerDialog extends DialogFragment implements DialogInterface.OnClickListener {
    private OnTimeSelectedListener mListener;
    private int mCurrentHour = 0;
    private int mCurrentMinute = 0;

    public interface OnTimeSelectedListener {
        void onTimeSelected(int hour, int minute);
    }

    public TimePickerDialog() {
        // Required empty public constructor
    }

    public static TimePickerDialog newInstance(int currentHour, int currentMinute) {
        TimePickerDialog fragment = new TimePickerDialog();
        Bundle args = new Bundle();
        args.putInt("currentHour", currentHour);
        args.putInt("currentMinute", currentMinute);
        fragment.setArguments(args);
        return fragment;
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Bundle savedInstanceState1 = getArguments();
        mCurrentHour = savedInstanceState1.getInt("currentHour");
        mCurrentMinute = savedInstanceState1.getInt("currentMinute");

        View view = getActivity().getLayoutInflater().inflate(R.layout.my_time_picker, null);

        NumberPicker npTime = view.findViewById(R.id.np_time);
        npTime.setMinValue(0);
        npTime.setMaxValue(23);
        npTime.setValue(mCurrentHour);

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("请选择时间");
        builder.setView(view);
        builder.setPositiveButton(android.R.string.ok, this);
        builder.setNegativeButton(android.R.string.cancel, null);

        return builder.create();
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        NumberPicker npTime = ((AlertDialog)dialog).findViewById(R.id.np_time);
        int hour = npTime.getValue();
        mListener.onTimeSelected(hour,mCurrentMinute);

    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnTimeSelectedListener) {
            mListener = (OnTimeSelectedListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnTimeSelectedListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }
}
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">

<NumberPicker
    android:id="@+id/np_time"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:gravity="center"
    android:maxValue="59"
    android:minValue="0"
    android:value="0" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="小时" />

</LinearLayout>
public class MainActivity extends AppCompatActivity implements TimePickerDialog.OnTimeSelectedListener {
    private TextView tv_result;

    private int mHour = 0;
    private int mMinute = 0;

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

        tv_result = findViewById(R.id.tv_result);
        findViewById(R.id.btn_show_timepicker).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                TimePickerDialog timePickerDialog = TimePickerDialog.newInstance(mHour, mMinute);
                timePickerDialog.show(MainActivity.this.getSupportFragmentManager(), null);
            }
        });
    }

    @Override
    public void onTimeSelected(int hour, int minute) {
        mHour = hour;
        mMinute = minute;
        tv_result.setText(getString(R.string.your_choice, String.valueOf(mHour), String.valueOf(mMinute)));
    }
}

以上,我们就已经实现了一个可扩展自定义的Android滚轮时间选择控件。

示例说明1:自定义选择时间范围

我们可以在NumberPicker设置中添加setDisplayedValues()函数,该函数的参数String[] values可以以字符串数组的形式设置选择器显示的内容,从而实现自定义选择时间范围的功能。例如,我们可以设置只允许选择8:00AM到5:00PM之间的时间。代码示例如下:

public class customTimePick extends AppCompatActivity implements TimePickerDialog.OnTimeSelectedListener {
    private TextView tv_result;
    private final String[] HOURS = new String[]{"08", "09", "10", "11", "12", "13", "14", "15", "16", "17"};
    private final String[] MINUTES = new String[]{"00", "15", "30", "45"};
    private int mHour = 0;
    private int mMinute = 0;

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

        tv_result = findViewById(R.id.tv_result);
        findViewById(R.id.btn_show_custom_time_picker).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                TimePickerDialog timePickerDialog = TimePickerDialog.newInstance(mHour, mMinute, HOURS, MINUTES);
                timePickerDialog.show(customTimePick.this.getSupportFragmentManager(), null);
            }
        });
    }

    @Override
    public void onTimeSelected(int hour, int minute) {
        mHour = hour;
        mMinute = minute;
        tv_result.setText(getString(R.string.your_choice, String.valueOf(mHour), String.valueOf(mMinute)));
    }
}

需要注意,在上述代码中我添加了两个字符串数组HOURSMINUTES,用于设置NumberPicker的显示范围。

my_custom_time_picker.xml 文件代码示例如下:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">

<NumberPicker
    android:id="@+id/np_hour"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:gravity="center" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text=":" />

<NumberPicker
    android:id="@+id/np_minute"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:gravity="center" />

</LinearLayout>

时间选择对话框的代码示例如下:

public class TimePickerDialog extends DialogFragment implements DialogInterface.OnClickListener {
    private OnTimeSelectedListener mListener;
    private int mCurrentHour = 0;
    private int mCurrentMinute = 0;
    private String[] mDisplayedHours;
    private String[] mDisplayedMinutes;

    public interface OnTimeSelectedListener {
        void onTimeSelected(int hour, int minute);
    }

    public TimePickerDialog() {
        // Required empty public constructor
    }

    public static TimePickerDialog newInstance(int currentHour, int currentMinute) {
        return newInstance(currentHour, currentMinute, null, null);
    }

    public static TimePickerDialog newInstance(int currentHour, int currentMinute, String[] hours, String[] minutes) {
        TimePickerDialog fragment = new TimePickerDialog();
        Bundle args = new Bundle();
        args.putInt("currentHour", currentHour);
        args.putInt("currentMinute", currentMinute);
        if (hours != null) {
            args.putStringArray("hours", hours);
        }
        if (minutes != null) {
            args.putStringArray("minutes", minutes);
        }
        fragment.setArguments(args);
        return fragment;
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Bundle savedInstanceState1 = getArguments();
        mCurrentHour = savedInstanceState1.getInt("currentHour");
        mCurrentMinute = savedInstanceState1.getInt("currentMinute");
        mDisplayedHours = savedInstanceState1.getStringArray("hours");
        mDisplayedMinutes = savedInstanceState1.getStringArray("minutes");

        View view = getActivity().getLayoutInflater().inflate(R.layout.my_custom_time_picker, null);

        NumberPicker npHour = view.findViewById(R.id.np_hour);
        if (mDisplayedHours != null) {
            npHour.setMinValue(0);
            npHour.setMaxValue(mDisplayedHours.length - 1);
            npHour.setDisplayedValues(mDisplayedHours);
        } else {
            npHour.setMinValue(0);
            npHour.setMaxValue(23);
        }
        npHour.setValue(mCurrentHour);

        NumberPicker npMinute = view.findViewById(R.id.np_minute);
        if (mDisplayedMinutes != null) {
            npMinute.setMinValue(0);
            npMinute.setMaxValue(mDisplayedMinutes.length - 1);
            npMinute.setDisplayedValues(mDisplayedMinutes);
        } else {
            npMinute.setMinValue(0);
            npMinute.setMaxValue(59);
        }

        npMinute.setValue(mCurrentMinute);

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("请选择时间");
        builder.setView(view);
        builder.setPositiveButton(android.R.string.ok, this);
        builder.setNegativeButton(android.R.string.cancel, null);

        return builder.create();
    }

    @Override
    public void onClick(DialogInterface dialogInterface, int i) {
        NumberPicker npHour = ((AlertDialog)dialogInterface).findViewById(R.id.np_hour);
        NumberPicker npMinute = ((AlertDialog)dialogInterface).findViewById(R.id.np_minute);
        int hour = npHour.getValue();
        int minute = npMinute.getValue();

        mListener.onTimeSelected(hour,minute);
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnTimeSelectedListener) {
            mListener = (OnTimeSelectedListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnTimeSelectedListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }
}

需要注意,为了实现显示自定义时间范围,在时间选择对话框的构造函数中添加了两个参数传递String数组类型的时间范围。在相应位置中进行判断并设置显示时间范围即可。

示例说明2:自定义分钟间隔

我们可以在Activity中准备一个分钟间隔数组,从而自定义分钟间隔。例如,在此我们可以设置分钟间隔为15分钟,即允许用户选择“0”、“15”、“30”、“45”这4个数值。代码如下:

```java
public class customTimePick extends AppCompatActivity implements TimePickerDialog.OnTimeSelectedListener {
private TextView tv_result;
private final String[] HOURS = new String[]{"08", "09", "10", "11", "12", "13", "14", "15", "16", "17"};
private final String[] MINUTES = new String[]{"00", "15", "30", "45"};
private int mHour = 0;
private int mMinute = 0;

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

    tv_result = findViewById(R.id.tv_result);
    findViewById(R.id.btn_show_custom_time_picker).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Time

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:轻松实现可扩展自定义的Android滚轮时间选择控件 - Python技术站

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

相关文章

  • JS+Canvas实现自定义头像功能

    JS+Canvas实现自定义头像功能需要以下步骤: 步骤一:创建画布元素 首先,需要在页面中创建一个canvas标签作为画布元素。可以通过以下HTML代码进行创建: <canvas id="canvas" width="200" height="200"></canvas> …

    other 2023年6月25日
    00
  • Windows11菜单右键全空白怎么办?Win11右键空白没有菜单解决方法

    当你在Windows11系统中右键桌面或者任务栏时,右键菜单出现全空白,无法正常使用,这时候需要进行以下步骤进行解决。 步骤一:使用Powershell进行问题诊断 打开Powershell:按下Win+X组合键,选择“Windows Powershell(管理员)”; 输入以下命令:Get-AppXPackage -AllUsers | Foreach {…

    other 2023年6月26日
    00
  • 解析Java继承中方法的覆盖和重载

    下面是详细讲解“解析Java继承中方法的覆盖和重载”的完整攻略。 什么是Java继承? Java继承是一种面向对象编程的重要概念。在Java中,子类可以从父类继承属性和方法,从而减少代码的重复,提高代码的复用性。子类也可以新增自己特有的属性和方法。通过继承,子类可以使用父类的方法和属性,同时也可以根据自身需要进行扩展和修改。在Java中,子类可以覆盖或重载父…

    other 2023年6月27日
    00
  • Windows Server2012 R2 FTP服务器配置图文教程

    Windows Server2012 R2 FTP服务器配置图文教程 简介 本文主要介绍如何在 Windows Server 2012 R2 操作系统中配置 FTP 服务器。FTP 是一种常用的文件传输协议,通过配置 FTP 服务器,可以实现在不同计算机之间方便地传输文件。 准备工作 在开始配置 FTP 服务器之前,需要进行以下准备工作: 确保 Window…

    other 2023年6月27日
    00
  • java TreeUtil菜单递归工具类

    TreeUtil是一个Java工具类,它提供了一些递归函数,用于将列表数据构建成树形结构。这个工具类的使用非常方便,特别是在前后端分离的Web应用程序中,前端通常需要树形结构的JSON数据表示,而该工具类正是为此而设计。 TreeUtil菜单递归工具类的主要功能是将一组菜单数据转换为树结构,并使用json返回给前端页面。 标题 引入 在使用该工具类之前,需要…

    other 2023年6月27日
    00
  • 使用SoupUI进行简单的WebService接口测试

    使用SoupUI进行简单的WebService接口测试 测试WebService接口是Web应用程序测试中很重要的一部分。SoapUI是一个好用的测试工具,它可以提供一整套测试WebService的解决方案。 本文将介绍如何使用SoapUI测试WebService接口。 安装SoapUI 首先,需要安装SoapUI,可以从SoapUI的网站下载最新版本的安装…

    其他 2023年3月28日
    00
  • ES6基础语法之字符串扩展

    ES6基础语法之字符串扩展 在ES6中,字符串扩展得到了加强,新增了许多特性,例如新增了模板字符串、字符串的迭代器和标签模板等。下面我们将对这些特性进行详细讲解。 模板字符串 模板字符串是ES6中新增的语法,可以通过反引号(`)来表示一个字符串,其中可以包含嵌入的表达式,且这些表达式将被计算后输出。 示例1: const name = "world…

    other 2023年6月20日
    00
  • 内核线程优先级设置的方法介绍

    内核线程优先级设置的方法介绍 什么是内核线程优先级? 内核线程是在内核空间运行的线程,与用户空间的线程相比,内核线程更具有高优先级和更多的系统权限。内核线程优先级决定了内核线程在竞争系统资源时的调度顺序。 如何设置内核线程优先级? 在Linux系统中,可以使用nice命令来设置内核线程的优先级。nice命令可以为进程或线程调整优先级,较低的nice值代表较高…

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