尝试将日历数据放入字符串中

问题描述 投票:0回答:2

尝试将数据存储到字符串中。

这是我的实用工具。

public class CommonDatePicker {

public static  void datePicker(final TextView textView, Context context) {
  Calendar dateCalender = Calendar.getInstance();
  final int year = dateCalender.get(Calendar.YEAR);
  final   int month = dateCalender.get(Calendar.MONTH);
  final int day = dateCalender.get(Calendar.DAY_OF_MONTH);


  DatePickerDialog datePickerDialog;
  datePickerDialog = new DatePickerDialog(context, new DatePickerDialog.OnDateSetListener() {
     @Override
     public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        monthOfYear = monthOfYear + 1;
        //2001-05-03
        // dayOfMonth  monthOfYear
        String formattedMonth = "" + monthOfYear;
        String formattedDayOfMonth = "" + dayOfMonth;

        if(monthOfYear < 10){

           formattedMonth = "0" + monthOfYear;
        }
        if(dayOfMonth < 10){

           formattedDayOfMonth  = "0" + dayOfMonth ;
        }
        //editText.setText( formattedDayOfMonth + "-" + formattedMonth + "-" + year);
        textView.setText( year + "-" + formattedMonth + "-" + formattedDayOfMonth);

     }

  }, year, month, day);
  datePickerDialog.setTitle("SELECT DATE");
  datePickerDialog.show();
   }
 }

这是我试图获取数据的地方。单击 textView 后,datePicker 按预期显示,但我想将选取的数据存储到字符串中。我不知道该怎么办。

这是我的main.java

txt_data_collection_date.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            CommonDatePicker.datePicker(txt_data_collection_date, TofsilForm10Activity.this);
            //String date; I want to store data in date.
        }
    });
java android android-datepicker java.util.calendar
2个回答
2
投票

注意,我不是 Android 开发人员,所以这可能是一个愚蠢的答案。


顺便说一句,可怕的

Calendar
类在几年前就被 JSR 310 中定义的现代 java.time 类所取代。Android 26+ 附带了一个实现。对于早期的 Android,最新的工具使大部分 java.time 功能可通过“API 脱糖”使用。

替换这个:

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

...使用以下

LocalDate
。请注意,与遗留类不同,java.time 使用合理的编号,2022 年为 2022 年,一月至十二月为 1-12。

LocalDate ld = LocalDate.now() ;
final int year = ld.getYear() ;
final int month = ld.getMonthValue() ;
final int day = ld.getDayOfMonth() ;

您想要的文本格式恰好符合 ISO 8601 标准。生成/解析文本时,java.time类默认使用该标准的格式。所以替换所有这些:

        monthOfYear = monthOfYear + 1;
        //2001-05-03
        // dayOfMonth  monthOfYear
        String formattedMonth = "" + monthOfYear;
        String formattedDayOfMonth = "" + dayOfMonth;

        if(monthOfYear < 10){

           formattedMonth = "0" + monthOfYear;
        }
        if(dayOfMonth < 10){

           formattedDayOfMonth  = "0" + dayOfMonth ;
        }
        //editText.setText( formattedDayOfMonth + "-" + formattedMonth + "-" + year);
        textView.setText( year + "-" + formattedMonth + "-" + formattedDayOfMonth);

…这样:

        textView.setText( LocalDate.of( year, monthOfYear, dayOfMonth ).toString() ) ;

所以第一段代码可能如下所示。请注意,更好的缩进如何使代码更加明显。

public class CommonDatePicker
{
    public static void datePicker ( final TextView textView , Context context )
    {
        LocalDate today = LocalDate.now();
        DatePickerDialog datePickerDialog =
                new DatePickerDialog(
                        context ,
                        new DatePickerDialog.OnDateSetListener()  // Implementing `DatePickerDialog.OnDateSetListener`.
                        {
                            @Override
                            public void onDateChanged ( DatePicker view , int year , int monthOfYear , int dayOfMonth )
                            {
                                textView.setText( LocalDate.of( year , monthOfYear , dayOfMonth ).toString() );
                            }
                        } ,
                        today.getYear() ,
                        today.getMonth() ,
                        today.getDayOfMonth()
                );
        datePickerDialog.setTitle( "SELECT DATE" );
        datePickerDialog.show();
    }
}

修改该代码后,让我们解决您的问题,这显然是您想要将用户选择的日期保存到另一个位置。我只是猜测(a)你的评论,(b)我无法确定你的第二个代码片段的目的。

您的

onDateChanged
方法会对用户在日期选择器中选择日期做出反应。在那里您可以生成所需的文本。您将该文本存储在
textView
中。您也可以将其存储在其他地方。

                            @Override
                            public void onDateChanged ( DatePicker view , int year , int monthOfYear , int dayOfMonth )
                            {
                                LocalDate chosenDate = LocalDate.of( year , monthOfYear , dayOfMonth ) ;
                                someOtherObject.someField = chosenDate.toString() ;
                                textView.setText( chosenDate.toString() );
                            }

更好的是,将

LocalDate
存储在其他位置,而不仅仅是文本。

                            @Override
                            public void onDateChanged ( DatePicker view , int year , int monthOfYear , int dayOfMonth )
                            {
                                LocalDate chosenDate = LocalDate.of( year , monthOfYear , dayOfMonth ) ;
                                someOtherObject.someField = chosenDate ;
                                textView.setText( chosenDate.toString() );
                            }

当然,像

someOtherObject.someField
这样的全局变量一般应该避免。所以就像你传入一样传入它
TextView textView

public void datePicker ( final LocalDate someLocalDateField, final TextView textView , Context context )

也许更好的方法是使用您创建的

CommonDatePicker
类。将该
datePicker
方法更改为实例方法,而不是
static
方法。向该类添加一个成员字段以携带用户选择的结果。我会将该方法的名称更改为更具描述性,例如
makeDatePicker

终止

show
通话。事后询问结果。

public class CommonDatePicker
{
    private LocalDate chosenDate ;
    public LocalDate getChosenDate() { return this.chosenDate ; }
    public void makeDatePicker ( final TextView textView , Context context )
    {
        LocalDate today = LocalDate.now();
        DatePickerDialog datePickerDialog =
                new DatePickerDialog(
                        context ,
                        new DatePickerDialog.OnDateSetListener()  // Implementing `DatePickerDialog.OnDateSetListener`.
                        {
                            @Override
                            public void onDateChanged ( DatePicker view , int year , int monthOfYear , int dayOfMonth )
                            {
                                this.chosenDate = LocalDate.of( year , monthOfYear , dayOfMonth ) ;
                                textView.setText( this.chosenDate.toString() );
                            }
                        } ,
                        today.getYear() ,
                        today.getMonth() ,
                        today.getDayOfMonth()
                );
        datePickerDialog.setTitle( "SELECT DATE" );
    }
}

用途:

CommonDatePicker commonDatePicker = new CommonDatePicker( context ) ;
DatePickerDialog datePicker = commonDatePicker.makeDatePicker() ;
datePicker.show() ;  // I assume this code blocks here until date picker is closed. (I don't know Android.)
LocalDate chosenDate = commonDatePicker.getChosenDate() ;

如果情况是用户可以取消日期选择器而不做出选择,那么我们的

LocalDate
引用变量将为 null。您可以检查是否为空。但最好返回一个
Optional
来明确表明 null 是一个可接受的预期值。

public Optional < LocalDate > getChosenDate() { return Optional.ofNullable ( this.chosenDate ) ; }

用途:

CommonDatePicker commonDatePicker = new CommonDatePicker( context ) ;
DatePickerDialog datePicker = commonDatePicker.makeDatePicker() ;
datePicker.show() ;  // I assume this code blocks here until date picker is closed. (I don't know Android.)
LocalDate date = commonDatePicker.getChosenDate().orElse( existingLocalDate ) ;

现在我们不再需要传入

final TextView textView
。将你的班级改为这样。

public class CommonDatePicker
{
    private LocalDate chosenDate ;
    public Optional < LocalDate > getChosenDate() { return Optional.ofNullable( this.chosenDate ) ; }
    public void makeDatePicker ( Context context )
    {
        LocalDate today = LocalDate.now();
        DatePickerDialog datePickerDialog =
                new DatePickerDialog(
                        context ,
                        new DatePickerDialog.OnDateSetListener()  // Implementing `DatePickerDialog.OnDateSetListener`.
                        {
                            @Override
                            public void onDateChanged ( DatePicker view , int year , int monthOfYear , int dayOfMonth )
                            {
                                this.chosenDate = LocalDate.of( year , monthOfYear , dayOfMonth ) ;
                            }
                        } ,
                        today.getYear() ,
                        today.getMonth() ,
                        today.getDayOfMonth()
                );
        datePickerDialog.setTitle( "SELECT DATE" );
    }
}

用途:

CommonDatePicker commonDatePicker = new CommonDatePicker( context ) ;
DatePickerDialog datePicker = commonDatePicker.makeDatePicker() ;
datePicker.show() ;  
LocalDate localDate = commonDatePicker.getChosenDate().orElse( existingLocalDate ) ;
someOtherPlace.updateDate( localDate ) ;
textView.setText( localDate.toString() ) ;

完成所有这些更改后,请注意我们如何将所有无关的部分从

CommonDatePicker
中拉出。现在,该类可以“管好自己的事”,而无需了解或关心应用程序的其他部分。它的工作只是收集用户的输入,而不是更新应用程序的各个部分。

我们可以进一步简化代码,因此调用应用程序不需要了解

DatePickerDialog
的使用。我们可以删除
makeDatePicker()
,并添加
show
方法。有了
show
方法,我们就可以跳过询问步骤,只需让
show
返回
Optional < LocalDate >
对象即可。

不要假设对话框应初始化为今天的日期,而是在其构造函数中接受日期。

public class CommonDatePicker
{
    private DatePickerDialog datePickerDialog;
    private LocalDate chosenDate;

    public CommonDatePicker ( final Context context , final LocalDate initialDate )
    {
        this.datePickerDialog =
                new DatePickerDialog(
                        context ,
                        new DatePickerDialog.OnDateSetListener()  // Implementing `DatePickerDialog.OnDateSetListener`.
                        {
                            @Override
                            public void onDateChanged ( DatePicker view , int year , int monthOfYear , int dayOfMonth )
                            {
                                this.chosenDate = LocalDate.of( year , monthOfYear , dayOfMonth );
                            }
                        } ,
                        initialDate.getYear() ,
                        initialDate.getMonth() ,
                        initialDate.getDayOfMonth()
                );
        this.datePickerDialog.setTitle( "SELECT DATE" );
    }

    public Optional < LocalDate > show ( ) { 
        this.datePickerDialog.show() ;  // I assume code blocks here until user choses a date. (I don't know Android.)
        return Optional.ofNullable( this.chosenDate ); 
    }
}

用途:

LocalDate yesterday = LocalDate.now().minusDays( 1 ) ;
Optional < LocalDate > optionalChosenDate = new CommonDatePicker( context , yesterday ).show() ;
someOtherPlace.updateDate( optionalChosenDate.orElse( yesterday ) ) ;
textView.setText( optionalChosenDate.orElse( yesterday ).toString() ) ;

现在调用程序员不需要了解我们恰好在

DatePickerDialog
类中内部使用的
CommonDatePicker
。调用程序员只需要学习我们简单的API。该 API 由两部分组成:采用
Context
LocalDate
的构造函数,以及与用户交互以返回可选
show
对象的
LocalDate
方法。


0
投票

我所要做的就是这样:

String stDate = txt_data_collection_date.getText().toString();

在此处添加上面的代码

txt_data_collection_date.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        CommonDatePicker.datePicker(txt_data_collection_date, TofsilForm10Activity.this);
        String stDate = txt_data_collection_date.getText().toString(); //Problem Solved
    }
});
© www.soinside.com 2019 - 2024. All rights reserved.