【问题标题】:datePicker in android安卓中的日期选择器
【发布时间】:2020-03-05 16:36:50
【问题描述】:

我想要日期选择器,我可以在其中选择年、月和日期。像这样,

但我得到这样的日期选择器,

我想选择年份和月份,但在上面的日期选择器中我只能选择月份 这是我的代码:

DatePickerDialog.OnDateSetListener mDateListener;

edBirthday.setOnClickListener( new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Calendar cal = Calendar.getInstance();
                int year = cal.get(Calendar.YEAR);
                int month = cal.get(Calendar.MONTH);
                int day = cal.get(Calendar.DAY_OF_MONTH);

                DatePickerDialog dialog =  new DatePickerDialog(
                        RegisterActivity.this,
                        android.R.style.Theme_Holo_Light_Dialog_MinWidth,
                        mDateListener,
                        year,month,day
                );
                dialog.getWindow().setBackgroundDrawable( new ColorDrawable( Color.TRANSPARENT ) );
                dialog.show();
            }
        } );

        mDateListener = new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker datePicker ,int year ,int month ,int day) {
                month = month + 1;

                Log.d( "onDateSet" , month + "/" + day + "/" + year );
                edBirthday.setText( new StringBuilder().append( day ).append( "-" )
                        .append( month ).append( "-" ).append( year ) );
            }
        };

【问题讨论】:

  • 您可能会发现以下链接很有用。 stackoverflow.com/a/38344035/2641380
  • 我想要日期选择器而不是月份和年份选择器@SHS
  • 你需要像 first snap 这样的输出吗?
  • @Unnati 该链接有日、月和年选择器的示例,如第一个屏幕截图一样。年份选择是可选的,由用户选择。您可以根据返回的值创建日期对象。
  • 你做得对,我想你可能需要在弹出窗口中点击年份

标签: android date datepicker


【解决方案1】:

是的,这可以使用自定义对话框,

创建lay_calander.xml

<DatePicker xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/datePicker"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:calendarViewShown="false"
    android:datePickerMode="spinner" />

为您的自定义对话框创建 Java 类,

import android.app.DatePickerDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.DatePicker;

import java.util.Calendar;

public class MyDatePickerDialog extends AlertDialog implements DialogInterface.OnClickListener, DatePicker.OnDateChangedListener {

    private DatePickerDialog.OnDateSetListener mDateSetListener;
    private DatePicker mDatePicker;

    protected MyDatePickerDialog(@NonNull Context context) {
        super(context);
        init();
    }

    protected MyDatePickerDialog(@NonNull Context context, int themeResId) {
        super(context, themeResId);
        init();
    }

    protected MyDatePickerDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) {
        super(context, cancelable, cancelListener);
        init();
    }


    private void init() {
        View view = LayoutInflater.from(getContext()).inflate(R.layout.lay_calander, null);
        mDatePicker = view.findViewById(R.id.datePicker);
        setView(view);
    }

    public void showDatePicker(DatePickerDialog.OnDateSetListener listener, Calendar defaultDate) {

        setButton(BUTTON_POSITIVE, getContext().getString(android.R.string.ok), this);
        setButton(BUTTON_NEGATIVE, getContext().getString(android.R.string.cancel), this);

        mDateSetListener = listener;

        if (defaultDate == null) {
            defaultDate = Calendar.getInstance();

        }
        int year = defaultDate.get(Calendar.YEAR);
        int monthOfYear = defaultDate.get(Calendar.MONTH);
        int dayOfMonth = defaultDate.get(Calendar.DAY_OF_MONTH);
        mDatePicker.init(year, monthOfYear, dayOfMonth, this);

        show();

    }


    @Override
    public void onClick(@NonNull DialogInterface dialog, int which) {
        switch (which) {
            case BUTTON_POSITIVE:
                if (mDateSetListener != null) {
                    // Clearing focus forces the dialog to commit any pending
                    // changes, e.g. typed text in a NumberPicker.
                    mDatePicker.clearFocus();
                    if (mDateSetListener != null) {
                        mDateSetListener.onDateSet(mDatePicker, mDatePicker.getYear(),
                                mDatePicker.getMonth(), mDatePicker.getDayOfMonth());
                    }
                }
                break;
            case BUTTON_NEGATIVE:
                cancel();
                break;
        }
    }

    @Override
    public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        mDatePicker.init(year, monthOfYear, dayOfMonth, this);
    }
}

从您的活动中调用对话框,

MyDatePickerDialog dialog = new MyDatePickerDialog(this);
        dialog.setTitle("Set Date");
        dialog.showDatePicker(new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                //Date select callback
            }
        }, Calendar.getInstance());

您的输出看起来像,

确保您的 AppTheme 应该是 Extend AppCompat, 清单 - android:theme="@style/AppTheme"

 <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

【讨论】:

  • 当我运行并单击编辑文本以打开对话框时,它会抛出错误 java.lang.IllegalStateException:您需要在此活动中使用 Theme.AppCompat 主题(或后代)。在 myDatePickerDialog 类中 showDatePicker() 函数中的 show()
  • 我的 AppTheme 是 Manifest 中的扩展 AppCompat。
  • 公共类 MainActivity 扩展 AppCompatActivity 也应该是活动。
  • 我的 Activity 也扩展了 AppCompatActivity
  • 没有错误它可以完美运行,但输出不是我想要的。它给出了第二个快照输出。 @安东尼诺
【解决方案2】:

喏,

让我们试试这段代码:

MainActivity.java

package com.antonino.datepicker;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TextView;

import java.util.Calendar;

//import android.icu.util.Calendar;

public class MainActivity extends Activity {

    private static TextView Output;
    private Button changeDate;

    private int year;
    private int month;
    private int day;

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

        Output = (TextView) findViewById(R.id.Output);
        changeDate = (Button) findViewById(R.id.changeDate);

        // Get current date by calendar

        final Calendar c = Calendar.getInstance();
        year  = c.get(Calendar.YEAR);
        month = c.get(Calendar.MONTH);
        day   = c.get(Calendar.DAY_OF_MONTH);

        // Show current date
        Output.setText(new StringBuilder()
                // Month is 0 based, just add 1
                .append(month + 1).append("-").append(day).append("-")
                .append(year).append(" "));

        // Button listener to show date picker dialog
        changeDate.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                // On button click show datepicker dialog
                DialogFragment newFragment = new SelectDateFragment();
                newFragment.show(getFragmentManager(), "DatePicker");

            }

        });
    }

    public static class SelectDateFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            final Calendar calendar = Calendar.getInstance();
            int yy = calendar.get(Calendar.YEAR);
            int mm = calendar.get(Calendar.MONTH);
            int dd = calendar.get(Calendar.DAY_OF_MONTH);
            return new DatePickerDialog(getActivity(), android.R.style.Theme_Holo_Light_Dialog, this, yy, mm, dd);
        }

        public void onDateSet(DatePicker view, int yy, int mm, int dd) {
            populateSetDate(yy, mm+1, dd);
        }
        public void populateSetDate(int year, int month, int day) {
            Output.setText(month+"/"+day+"/"+year);
        }

    }

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Selected Date (MM-DD-YYYY): "
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/Output"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <Button
        android:id="@+id/changeDate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Select Date"/>

</LinearLayout>

如果一切正常,您应该会看到这样的屏幕:


希望对你有帮助

祝你有美好的一天,
安东尼诺


注意:您可以使用 AlertDialog.THEME_HOLO_LIGHT 而不是 android.R.style.Theme_Holo_Light_Dialog 来获得类似于屏幕截图中的布局,但这是最后一个 has been deprecated 从 API 23 开始

参考文献

1 - DatePicker tutorial
2 - 教程中为Dialogs 调用的一些函数已被弃用,因此this answer 提供了基于DialogFragments 的修复
3 - DatePickerDialog 构造函数
4 - Holo Light Dialog Theme

【讨论】:

  • @UnnatiPatadia 好的问题:您如何解决 Calendar 类?建议您使用import android.icu.util.Calendar;import java.util.Calendar;。如果它还不是你当前的选择,你能试试最后一个吗?另外:您使用哪个Android手机和Android版本进行测试?我之所以问,是因为我在答案中显示的屏幕截图来自模拟器上的真实测试 [Nexus 5X,API 26]
  • 我的设备是小米Note 4,安卓版本6.0.1 Marshmallow
  • @UnnatiPatadia 我在 Galaxy Nexus、API 23 [Android 6.0] 上进行了尝试,输出与您要求的一样。不幸的是,我没有您使用的同一部手机,但就我刚才所说的而言,这可能是与品牌有关的问题。您是否也尝试在不同的手机上运行相同的应用程序?
【解决方案3】:

在此处使用 SpinnerDatePicker 库https://github.com/drawers/SpinnerDatePicker 并且用法非常简单,如其介绍中所述。

 new SpinnerDatePickerDialogBuilder()
            .context(MainActivity.this)
            .callback(MainActivity.this)
            .spinnerTheme(R.style.NumberPickerStyle)
            .showTitle(true)
            .showDaySpinner(true)
            .defaultDate(2017, 0, 1)
            .maxDate(2020, 0, 1)
            .minDate(2000, 0, 1)
            .build()
            .show();  

希望对你有帮助!

【讨论】:

    【解决方案4】:

    刚刚设置

    android:datePickerMode="spinner"
    

    在你的视图 xml 文件中

    如果您想添加清除按钮,您可以构建自定义视图并为底部按钮设置操作

    【讨论】:

      【解决方案5】:

      在android中,我们有日期选择器对话框来选择日期,但是如果你想改变日期选择器对话框的样式,那么你可以改变日期选择器的主题。这些是您可以根据需要更改的一些主题。

      1.AlertDialog.THEME_DEVICE_DEFAULT_DARK
      
      2.AlertDialog.THEME_DEVICE_DEFAULT_LIGHT
      
      3.AlertDialog.THEME_HOLO_DARK
      
      4.AlertDialog.THEME_HOLO_LIGHT
      
      5.AlertDialog.THEME_TRADITIONAL
      

      我正在与您分享链接,您可以在该链接中找到有关源代码的日期选择器对话框的更多信息。

      https://www.android-examples.com/change-datepickerdialog-theme-in-android-using-dialogfragment/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-28
        相关资源
        最近更新 更多