将按钮的文本设置为 datepicker 上的选定日期

Posted

技术标签:

【中文标题】将按钮的文本设置为 datepicker 上的选定日期【英文标题】:set the text of button to the chosen date on datepicker 【发布时间】:2018-12-23 09:30:25 【问题描述】:

我正在尝试将按钮的文本更改为所选日期以进一步存储在 firebase 数据库中。 这是我使用的java代码:

public static class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener 
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) 
        // Use the current date as the default date in the picker
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);
        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(), this, year, month, day);
    
    public void onDateSet(DatePicker view, int year, int month, int day) 
        // Do something with the date chosen by the user   
    

public void showDatePickerDialog(View v) 
    DialogFragment newFragment = new MortgageProtectionActivity.DatePickerFragment();
    newFragment.show(getFragmentManager(), "datePicker");

按钮的 ID 是 btn_pf_dob 和 onclick 的 showDatePickerDialog。

【问题讨论】:

【参考方案1】:

您可以覆盖onDateSet 方法以在按钮或其他地方放置一个值。要使用对话框片段执行此操作,您可以让您的主要活动实现OnDateSetListener 而不是对话框(请参阅此question 或this one)。或者,请参阅下面的编辑 2。

编辑 1:如果您不需要使用 DialogFragment,另一种方法是

public void showDatePickerDialog(View v) 
    final Button btn = findViewById(R.id.btn_pf_dob);
    final  DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() 
        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear,
                              int dayOfMonth) 
            // generate string from year, month, and day
            String dateStr = yourMethodHere(year,month,day);
            btn.setText(dateStr);
        
    ;

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

    DatePickerDialog dpd = new DatePickerDialog(this, dateSetListener, year, month, day);
    dpd.show();

编辑 2:如果您需要使用 DialogFragment 但又不想让您的 Activity 实现 onDateSet,您可以使用类似以下的内容。你为什么要这个?如果您有多个从同一个活动启动的日期选择器,您可能希望每个活动都有不同的侦听器。在 Activity 上实现它可以防止这种情况发生,而这种方法可以让您为每个日期选择器创建一个唯一的侦听器。

public static class DatePickerFragment extends DialogFragment 

    private DatePickerDialog.OnDateSetListener listener = null;

    void setListener(DatePickerDialog.OnDateSetListenerlistener) 
        this.listener = listener;
    

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) 

        DatePickerDialog dpd = null;

        if( listener != null ) 
            // Use the current date as the default date in the picker
            Calendar c = Calendar.getInstance();
            int year = c.get(Calendar.YEAR);
            int month = c.get(Calendar.MONTH);
            int day = c.get(Calendar.DAY_OF_MONTH);

            // Create a new instance of DatePickerDialog
            dpd = new DatePickerDialog(getActivity(), listener, year, month, day);
        
        return dpd;
    


public void showDatePickerDialog(View v) 
    final Button btn = findViewById(R.id.btn_pf_dob);
    DatePickerFragment newFragment = new DatePickerFragment();
    newFragment.setListener(new DatePickerDialog.OnDateSetListener() 
        @Override
        public void onDateSet(DatePicker view, int year, int month, int day) 
            String dateStr = "date: " + year + " " + month + " " + day;
            btn.setText(dateStr);
        
    
    );
    newFragment.show(getFragmentManager(), "datePicker");

要在 Activity 中正确设置它,通过屏幕旋转,您需要在 Activity onCreate 中重置监听器,以便在显示对话框时旋转屏幕,类似于

    if (savedInstanceState != null) 
        DatePickerDialogFragment dpf = (DatePickerDialogFragment) getFragmentManager()
                .findFragmentByTag("datePicker");
        if (dpf != null) 
            dpf.setListener(new DatePickerDialog.OnDateSetListener() 
                @Override
                public void onDateSet(DatePicker view, int year, int month, int day) 
                    String dateStr = "date: " + year + " " + month + " " + day;
                    btn.setText(dateStr);
                
            
            );
        
    

【讨论】:

我是一个初学者,所以我有点挣扎。我用您的覆盖方法替换了我的 showDatePickerDialog,并将“yourMethodhere”更改为“DatePickerDialog”。它突出显示所有覆盖方法都是红色的,声称“片段应该是静态的,以便可以恢复它们”。尝试在 public 和 void 之间添加静态,但它并没有真正起作用。 好点。看看这里***.com/questions/11527051/… 我也在答案中添加了另一种方法(过去对我来说效果很好)

以上是关于将按钮的文本设置为 datepicker 上的选定日期的主要内容,如果未能解决你的问题,请参考以下文章

如何清除/重置 jQuery UI Datepicker 日历上的选定日期?

UIPickerView 作为按钮操作并根据选择器的选定值设置文本字段的文本

jQuery:在 Datepicker 中为选定的日期添加样式

将 UIButton 标题设置为选定的表格单元格

Swift:在带有完成按钮的文本框中弹出 DatePicker

突出显示两个选定日期之间的日期 jQuery UI Datepicker