如何在Android中从DatePickerDialog返回日期值?
我是android新手。我使用以下指南在android中创建了一个日期选择器 我需要将此日期值(date=sb.toString())返回到我的MainActivity。既然onDateSet方法无效,我该怎么办 其他信息-DatePickerDialog在MainActivity类中触发,但不使用单键单击。有几个过程发生在一个单一的按钮,日期选择器将触发只有当某些条件得到满足。我也不想显示日期值。只是想把它退回做进一步处理 感谢任何形式的指导 更改了onDataset方法和justshow() //对用户选择的日期执行某些操作如何在Android中从DatePickerDialog返回日期值?,android,datepicker,Android,Datepicker,我是android新手。我使用以下指南在android中创建了一个日期选择器 我需要将此日期值(date=sb.toString())返回到我的MainActivity。既然onDateSet方法无效,我该怎么办 其他信息-DatePickerDialog在MainActivity类中触发,但不使用单键单击。有几个过程发生在一个单一的按钮,日期选择器将触发只有当某些条件得到满足。我也不想显示日期值。只是想把它退回做进一步处理 感谢任何形式的指导 更改了onDataset方法和justshow()
sb.append(year);
sb.append('-');
sb.append(month+1);
sb.append('-');
sb.append(day);
date = sb.toString();
MainActivity.newdate=sb.toString();
System.out.println("The date is "+MainActivity.newdate);
}
公演{
}
这是Main中的相关部分(在做出第一次回复中建议的更改后)
newdate是静态字符串,但仍然输出null。在MainActivity和justShow方法中。但在onDataSet方法中,日期输出正确- 您可以在DatePickerFragment中创建一个公共方法来返回字符串
- 您可以在MainActivity中有一个此类写入的静态变量
- 您可以使用SharedReferences来存储字符串
最后一种方法是浪费时间的,也是最不推荐的,但是没有静态的“魔法”在执行。使用下面的代码在onDateSet()方法中以日期类型返回日期
以下是如何从DatePickerDialog获取日期:
private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {
// onDateSet method
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
myday = dayOfMonth;
mymonth = monthOfYear + 1;
myyear = year;
date = String.valueOf(myday) + getString(R.string.iphan) + String.valueOf(mymonth) + getString(R.string.iphan) + String.valueOf(myyear);
Log.i(TAG,"Date: "+date);
}
}; // DatePickerDialog.OnDateSetListener close
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DATE_DIALOG_IDdob:
// Current Calendar Date
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);
return new DatePickerDialog(this, mDateSetListener, year, month, day);
}
return null;
} // onCreateDialog() close
在活动中实现侦听器接口并将其传递给DatePickerFragment。 然后通过调用侦听器的方法触发侦听器。 这里描述的是:
在从DatePickerDialog类派生的类上声明一个公共字符串变量,并在onDataSet方法中将所选日期设置为该公共字符串变量,这样您就可以通过您创建的DatePickerDialog实例从主活动进行访问,尽管这是在4年前提出的,上次激活是在1年前(如我的回答)我希望下面的内容能有所帮助
package com.example.fragments;
import java.util.Calendar;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.widget.DatePicker;
/**
* Date picker fragment bit 18/03/2017.
*/
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
private OnDateSetListener callbackListener;
/**
* An interface containing onDateSet() method signature.
* Container Activity must implement this interface.
*/
public interface OnDateSetListener {
void onDateSet(DatePicker view, int year, int month, int dayOfMonth);
}
/* (non-Javadoc)
* @see android.app.DialogFragment#onAttach(android.app.Activity)
*/
@Override
public void onAttach(Context activity) {
super.onAttach(activity);
try {
callbackListener = (OnDateSetListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnDateSetListener.");
}
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current date as the default date in the picker
final Calendar calendar = Calendar.getInstance(getResources().getConfiguration().locale);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
// Create a new instance of DatePickerDialog and return it
return new DatePickerDialog(getActivity(), this, year, month, day);
}
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
if (callbackListener != null) {
callbackListener.onDateSet(view, year, month, dayOfMonth);
}
}
}
然后在MainActivity中执行下一步
public class MainActivity extends AppCompatActivity implements View.OnClickListener, DatePickerFragment.OnDateSetListener {
private EditText edittextDate;
private Locale locale;
private DialogFragment datePicker;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
locale = getResources().getConfiguration().locale;
datePicker = new DatePickerFragment();
edittextDate = (EditText) findViewById(R.id.edittextDate);
edittextDate.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.edittextDate: {
datePicker.show(getSupportFragmentManager(), "datePicker");
break;
}
}
}
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
final Calendar calendar = Calendar.getInstance(locale);
final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, locale);
if (getCurrentFocus() != null) {
switch (getCurrentFocus().getId()) {
case R.id.edittextDate:
calendar.set(year, month, dayOfMonth);
edittextDate.setText(dateFormat.format(calendar.getTime()));
break;
}
}
}
}
}
}感谢您的回复。我必须在onDataSet方法中构建字符串,该方法应为void。我如何将生成的值传递给另一个方法?我尝试了遵循public void justShow(){System.out.println(“日期为“+date”);}但在调用justShow()时方法它将日期设置为null,并且它在onDataset方法之前执行(我不知道为什么)。因此我将尝试您的第二个选项,因为Reply onDataset()方法必须是无效的(它不允许我更改).因此,我不能从您的it@user1855222在主活动类中声明一个具有公共作用域的变量。在onDateSet()中指定值。我这样做了。但是当我调用它时,仍然给出NULL。在进行更改后,我在问题中包含了来自MainActivity的相关代码。根据logcat onDateSet()在之后执行,我对公共变量的调用。我不知道原因是您需要的确切引用。我们如何使用实现
DatePickerDialog.OnDateSetListener
的对象,而不是使用相同的活动?@JCarlos,该活动或片段仍然需要实现此对象(已实现DatePickerDialog.OnDateSetListener)。尝试在uDatePickerFragment_uuuuuuuuu和上面的主要活动中显示此内容。请不要教年轻人使用过时且臭名昭著的SimpleDateFormat
类。至少不要将其作为第一选项。而且没有任何保留。今天,我们的DateTimeFormat
及其有很多更好的功能。是的,您可以请在Android上使用它。对于较旧的Android,请参阅。
DateToken mydate=new DateToken();
String test=dayvals.get(0);
DialogFragment df=new DatePickerFragment();
if(test.equalsIgnoreCase("day")){
df.show(getSupportFragmentManager(), "DatePik");
}
System.out.println("Date is on Main"+newdate);
DatePickerFragment dpf=new DatePickerFragment();
dpf.justShow();
Date date = new Date(int year, int month, int day);
private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {
// onDateSet method
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
myday = dayOfMonth;
mymonth = monthOfYear + 1;
myyear = year;
date = String.valueOf(myday) + getString(R.string.iphan) + String.valueOf(mymonth) + getString(R.string.iphan) + String.valueOf(myyear);
Log.i(TAG,"Date: "+date);
}
}; // DatePickerDialog.OnDateSetListener close
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DATE_DIALOG_IDdob:
// Current Calendar Date
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);
return new DatePickerDialog(this, mDateSetListener, year, month, day);
}
return null;
} // onCreateDialog() close
package com.example.fragments;
import java.util.Calendar;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.widget.DatePicker;
/**
* Date picker fragment bit 18/03/2017.
*/
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
private OnDateSetListener callbackListener;
/**
* An interface containing onDateSet() method signature.
* Container Activity must implement this interface.
*/
public interface OnDateSetListener {
void onDateSet(DatePicker view, int year, int month, int dayOfMonth);
}
/* (non-Javadoc)
* @see android.app.DialogFragment#onAttach(android.app.Activity)
*/
@Override
public void onAttach(Context activity) {
super.onAttach(activity);
try {
callbackListener = (OnDateSetListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnDateSetListener.");
}
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current date as the default date in the picker
final Calendar calendar = Calendar.getInstance(getResources().getConfiguration().locale);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
// Create a new instance of DatePickerDialog and return it
return new DatePickerDialog(getActivity(), this, year, month, day);
}
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
if (callbackListener != null) {
callbackListener.onDateSet(view, year, month, dayOfMonth);
}
}
}
public class MainActivity extends AppCompatActivity implements View.OnClickListener, DatePickerFragment.OnDateSetListener {
private EditText edittextDate;
private Locale locale;
private DialogFragment datePicker;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
locale = getResources().getConfiguration().locale;
datePicker = new DatePickerFragment();
edittextDate = (EditText) findViewById(R.id.edittextDate);
edittextDate.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.edittextDate: {
datePicker.show(getSupportFragmentManager(), "datePicker");
break;
}
}
}
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
final Calendar calendar = Calendar.getInstance(locale);
final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, locale);
if (getCurrentFocus() != null) {
switch (getCurrentFocus().getId()) {
case R.id.edittextDate:
calendar.set(year, month, dayOfMonth);
edittextDate.setText(dateFormat.format(calendar.getTime()));
break;
}
}
}
}
private void openCalendar() {
DatePickerDialog dialog = new DatePickerDialog(getContext(), (view, year, month, dayOfMonth) -> {
date = getDateString(year, month, dayOfMonth);
}, mYear, mMonth, mDay);
dialog.show();
private String getDateString(int year, int mMonth, int mDay) {
Calendar calendar = Calendar.getInstance();
calendar.set(year, mMonth, mDay);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
return dateFormat.format(calendar.getTime());