尝试将数据存储到字符串中。
这是我的实用工具。
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.
}
});
注意,我不是 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
方法。
我所要做的就是这样:
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
}
});