Android 同一活动中的多个 DatePicker
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3734981/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Multiple DatePickers in same activity
提问by Siddharth Lele
I am absolutely new to the Android platform and have been building an application while learning the development process.
我对 Android 平台完全陌生,在学习开发过程的同时一直在构建应用程序。
Currently, I am working on an activity in which i need to deploy 2 date pickers. One is a "Start Date" and the other is an "End date". I have been following the DatePicker tutorial on the android developers page here: http://developer.android.com/resources/tutorials/views/hello-datepicker.html
目前,我正在开展一项需要部署 2 个日期选择器的活动。一个是“开始日期”,另一个是“结束日期”。我一直在关注 android 开发人员页面上的 DatePicker 教程:http: //developer.android.com/resources/tutorials/views/hello-datepicker.html
For one DatePicker, it works just fine.
对于一个 DatePicker,它工作得很好。
Now my problem is, when I replicate the whole process for a second date picker, it shows up just fine on the emulator as well as on the handset. But when no matter which button I press to select the dates, only the first TextView is updated and the second TextView keeps showing the current date.
现在我的问题是,当我为第二个日期选择器复制整个过程时,它在模拟器和手机上都显示得很好。但是,无论我按下哪个按钮来选择日期,都只会更新第一个 TextView,而第二个 TextView 会继续显示当前日期。
Here is the code:
这是代码:
package com.datepicker;
import java.util.Calendar;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TextView;
public class datepicker extends Activity {
private TextView mDateDisplay;
private TextView endDateDisplay;
private Button mPickDate;
private Button endPickDate;
private int mYear;
private int mMonth;
private int mDay;
static final int START_DATE_DIALOG_ID = 0;
static final int END_DATE_DIALOG_ID = 0;
/** Called when the activity is first created. */
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/* capture our View elements for the start date function */
mDateDisplay = (TextView) findViewById(R.id.startdateDisplay);
mPickDate = (Button) findViewById(R.id.startpickDate);
/* add a click listener to the button */
mPickDate.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showDialog(START_DATE_DIALOG_ID);
}
});
/* get the current date */
final Calendar c = Calendar.getInstance();
mYear = c.get(Calendar.YEAR);
mMonth = c.get(Calendar.MONTH);
mDay = c.get(Calendar.DAY_OF_MONTH);
/* display the current date (this method is below) */
updateStartDisplay();
/* capture our View elements for the end date function */
endDateDisplay = (TextView) findViewById(R.id.enddateDisplay);
endPickDate = (Button) findViewById(R.id.endpickDate);
/* add a click listener to the button */
endPickDate.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showDialog(END_DATE_DIALOG_ID);
}
});
/* get the current date */
final Calendar c1 = Calendar.getInstance();
mYear = c1.get(Calendar.YEAR);
mMonth = c1.get(Calendar.MONTH);
mDay = c1.get(Calendar.DAY_OF_MONTH);
/* display the current date (this method is below) */
updateEndDisplay();
}
private void updateEndDisplay() {
endDateDisplay.setText(
new StringBuilder()
// Month is 0 based so add 1
.append(mMonth + 1).append("-")
.append(mDay).append("-")
.append(mYear).append(" "));
}
private void updateStartDisplay() {
mDateDisplay.setText(
new StringBuilder()
// Month is 0 based so add 1
.append(mMonth + 1).append("-")
.append(mDay).append("-")
.append(mYear).append(" "));
}
/* the callback received when the user "sets" the date in the dialog for the start date function */
/* 当用户在对话框中为开始日期函数“设置”日期时收到的回调 */
private DatePickerDialog.OnDateSetListener mDateSetListener =
new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
mYear = year;
mMonth = monthOfYear;
mDay = dayOfMonth;
updateStartDisplay();
}
};
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case START_DATE_DIALOG_ID:
return new DatePickerDialog(this,
mDateSetListener,
mYear, mMonth, mDay);
}
return null;
}
/* the callback received when the user "sets" the date in the dialog for the end date function */
private DatePickerDialog.OnDateSetListener endDateSetListener =
new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
mYear = year;
mMonth = monthOfYear;
mDay = dayOfMonth;
updateStartDisplay();
}
};
protected Dialog onCreateDialog1(int id) {
switch (id) {
case END_DATE_DIALOG_ID:
return new DatePickerDialog(this,
endDateSetListener,
mYear, mMonth, mDay);
}
return null;
}
}
}
Please advise on the changes required for the code.
请告知代码所需的更改。
回答by Adam L.
I have a solution that allows for an unlimited number of date fields without adding new dialog types. When the user clicks one of the buttons, I register which TextView and Calendar is currently being modified before launching the DatePickerDialog. The dialog's OnDateSetListener then updates the registered TextView and Calendar.
我有一个解决方案,允许无限数量的日期字段,而无需添加新的对话框类型。当用户单击其中一个按钮时,我会在启动 DatePickerDialog 之前注册当前正在修改的 TextView 和 Calendar。然后对话框的 OnDateSetListener 更新注册的 TextView 和 Calendar。
import java.util.Calendar;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.DatePickerDialog.OnDateSetListener;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TextView;
public class MultiDatePickerActivity extends Activity {
private TextView startDateDisplay;
private TextView endDateDisplay;
private Button startPickDate;
private Button endPickDate;
private Calendar startDate;
private Calendar endDate;
static final int DATE_DIALOG_ID = 0;
private TextView activeDateDisplay;
private Calendar activeDate;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.multidatepicker);
/* capture our View elements for the start date function */
startDateDisplay = (TextView) findViewById(R.id.startDateDisplay);
startPickDate = (Button) findViewById(R.id.startPickDate);
/* get the current date */
startDate = Calendar.getInstance();
/* add a click listener to the button */
startPickDate.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showDateDialog(startDateDisplay, startDate);
}
});
/* capture our View elements for the end date function */
endDateDisplay = (TextView) findViewById(R.id.endDateDisplay);
endPickDate = (Button) findViewById(R.id.endPickDate);
/* get the current date */
endDate = Calendar.getInstance();
/* add a click listener to the button */
endPickDate.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showDateDialog(endDateDisplay, endDate);
}
});
/* display the current date (this method is below) */
updateDisplay(startDateDisplay, startDate);
updateDisplay(endDateDisplay, endDate);
}
private void updateDisplay(TextView dateDisplay, Calendar date) {
dateDisplay.setText(
new StringBuilder()
// Month is 0 based so add 1
.append(date.get(Calendar.MONTH) + 1).append("-")
.append(date.get(Calendar.DAY_OF_MONTH)).append("-")
.append(date.get(Calendar.YEAR)).append(" "));
}
public void showDateDialog(TextView dateDisplay, Calendar date) {
activeDateDisplay = dateDisplay;
activeDate = date;
showDialog(DATE_DIALOG_ID);
}
private OnDateSetListener dateSetListener = new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
activeDate.set(Calendar.YEAR, year);
activeDate.set(Calendar.MONTH, monthOfYear);
activeDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);
updateDisplay(activeDateDisplay, activeDate);
unregisterDateDisplay();
}
};
private void unregisterDateDisplay() {
activeDateDisplay = null;
activeDate = null;
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DATE_DIALOG_ID:
return new DatePickerDialog(this, dateSetListener, activeDate.get(Calendar.YEAR), activeDate.get(Calendar.MONTH), activeDate.get(Calendar.DAY_OF_MONTH));
}
return null;
}
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
super.onPrepareDialog(id, dialog);
switch (id) {
case DATE_DIALOG_ID:
((DatePickerDialog) dialog).updateDate(activeDate.get(Calendar.YEAR), activeDate.get(Calendar.MONTH), activeDate.get(Calendar.DAY_OF_MONTH));
break;
}
}
}
This kind of flexibility is useful in an application where you don't know how many date pickers you will need until runtime.
这种灵活性在应用程序中很有用,在该应用程序中,您直到运行时才知道需要多少个日期选择器。
回答by st0le
You need to make 2 separate DatePicker Dialogs
您需要制作 2 个单独的 DatePicker 对话框
Make 2 Listeners
制作 2 个听众
int from_year, from_month, from_day,to_year, to_month, to_day; //initialize them to current date in onStart()/onCreate()
DatePickerDialog.OnDateSetListener from_dateListener,to_dateListener;
Implement them...
实施它们...
from_dateListener = new OnDateSetListener(){
public void onDateSet(DatePicker arg0, int arg1, int arg2, int arg3) {
...
}
}
};
to_dateListener = new OnDateSetListener(){
public void onDateSet(DatePicker arg0, int arg1, int arg2, int arg3) {
.....
}
};
Create Seperate Dialogs for both of them
为它们创建单独的对话框
int DATE_PICKER_TO = 0;
int DATE_PICKER_FROM = 1;
@Override
protected Dialog onCreateDialog(int id) {
switch(id){
case DATE_PICKER_FROM:
return new DatePickerDialog(this, from_dateListener, from_year, from_month, from_day);
case DATE_PICKER_TO:
return new DatePickerDialog(this, to_dateListener, to_year, to_month, to_day);
}
return null;
}
回答by SandWyrm
Expanding Adam's option into an slightly lighter weight interpretation and potentially more useful, I decided to maintain an int reference for the element ID that instantiated the dialog request and then just referenced that in the final event handler. This has the added benefit of fitting nicely into a switch statement in this method in case you have multiple date inputs but want specific formatting for each or groups of each. All snippets below are in my Activity class directly
将 Adam 的选项扩展为更轻量级的解释并且可能更有用,我决定为元素 ID 维护一个 int 引用,该元素 ID 实例化对话框请求,然后在最终的事件处理程序中引用它。如果您有多个日期输入但需要为每个或每个组提供特定格式,则这有一个额外的好处,可以很好地适应这种方法中的 switch 语句。下面的所有片段都直接在我的 Activity 类中
Instance variables
实例变量
private static final int DIALOG_DATE_PICKER = 100;
private int datePickerInput;
Dialog Handler
对话处理程序
@Override
public Dialog onCreateDialog(int id)
{
switch(id) {
case DIALOG_DATE_PICKER:
final Calendar c = Calendar.getInstance();
DatePickerDialog dialog = new DatePickerDialog(this, dateSetListener, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH));
return dialog;
}
return null;
}
Click Listener
单击侦听器
private OnClickListener datePickerListener =
new OnClickListener()
{
@Override
public void onClick(View v)
{
datePickerInput = v.getId();
showDialog(DIALOG_DATE_PICKER);
}
};
Date Selection Handler
日期选择处理程序
private DatePickerDialog.OnDateSetListener dateSetListener =
new DatePickerDialog.OnDateSetListener()
{
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth)
{
switch( datePickerInput ) {
case R.id.datePicker1:
((EditText) findViewById( datePickerInput ))
.setText(...);
...
break;
case R.id.datePicker2:
...
break;
default:
...
break;
}
}
};
回答by Stanislasdrg Reinstate Monica
I think I've found a cleaner solution. It's a mix between what's advised by Google and the comments I read here. In my case, It's even working when called from a Viewpager's fragment. Basically, I pass a bundle of arguments to the dialog fragment when calling the picker dialog from my fragment, as defined here : Android: Pass data(extras) to a fragmentThen I get back the bundle value in my DialogFragment class, and switch on its value.
我想我找到了一个更清洁的解决方案。这是谷歌建议和我在这里阅读的评论之间的混合。在我的情况下,它甚至在从 Viewpager 的片段中调用时也能工作。基本上,当从我的片段调用选择器对话框时,我将一组参数传递给对话框片段,如下定义:Android:将数据(额外)传递给片段然后我在我的 DialogFragment 类中取回包值,然后打开它的价值。
Here are the two listeners of both my startDate and endDate buttons, from my Fragment code :
以下是我的片段代码中 startDate 和 endDate 按钮的两个侦听器:
mWylStartDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Bundle bundle = new Bundle();
bundle.putInt("DATE",1);
DialogFragment newFragment = new DatePickerFragment();
newFragment.setArguments(bundle);
newFragment.show(getFragmentManager(), "datePicker");
}
});
mWylEndDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Bundle bundle = new Bundle();
bundle.putInt("DATE",2);
DialogFragment newFragment = new DatePickerFragment();
newFragment.setArguments(bundle);
newFragment.show(getFragmentManager(), "datePicker");
}
});
Here's my DatePickerFragment class
这是我的 DatePickerFragment 类
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener
{
static final int START_DATE = 1;
static final int END_DATE = 2;
private int mChosenDate;
int cur = 0;
@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);
Bundle bundle = this.getArguments();
if (bundle != null)
{
mChosenDate = bundle.getInt("DATE", 1);
}
switch (mChosenDate)
{
case START_DATE:
cur = START_DATE;
return new DatePickerDialog(getActivity(), this, year, month, day);
case END_DATE:
cur = END_DATE;
return new DatePickerDialog(getActivity(), this, year, month, day);
}
return null;
}
@Override
public void onDateSet(DatePicker datePicker, int year, int month, int day)
{
if (cur == START_DATE)
{
// set selected date into textview
Log.v("Date Début", "Date1 : " + new StringBuilder().append(month + 1)
.append("-").append(day).append("-").append(year)
.append(" "));
} else
{
Log.v("Date fin", "Date2 : " + new StringBuilder().append(month + 1)
.append("-").append(day).append("-").append(year)
.append(" "));
}
}
}
回答by abdlmjeed al-king
simply make boolean variable in mainActivity like this ::
只需像这样在 mainActivity 中创建布尔变量 ::
private boolean startDateOrEndDAte = true;
then make the listeners for the buttons like this like this and make the value of the variable change for evrey button::
然后像这样为按钮设置监听器,并为 evrey 按钮更改变量的值:
DialogFragment datePicker = new DatePickerFragment();
attendDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
datePicker.show(getSupportFragmentManager(),"Date Picker");
startOrEnd = true ;
}
});
leaveDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
datePicker.show(getSupportFragmentManager(),"Date Picker");
startOrEnd = false ;
}
});
then in onDateSet methode just add if statment like this ::
然后在 onDateSet 方法中只需添加这样的 if 语句 ::
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, dayOfMonth);
String date = DateFormat.getDateInstance().format(c.getTime());
attendDate = findViewById(R.id.attend_date);
leaveDate = findViewById(R.id.leave_date);
if (startOrEnd) {
attendDate.setText(date);
} else {
leaveDate.setText(date);
}
}
回答by anupam sharma
you can use simply this type
你可以简单地使用这种类型
public class MainActivity extends Activity {
private TextView startDateDisplay;
private TextView endDateDisplay;
private Button startPickDate;
private Button endPickDate;
private Calendar startDate;
private Calendar endDate;
static final int DATE_DIALOG_ID = 0;
private TextView activeDateDisplay;
private Calendar activeDate;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/* capture our View elements for the start date function */
startDateDisplay = (TextView) findViewById(R.id.startDateDisplay);
startPickDate = (Button) findViewById(R.id.startPickDate);
/* get the current date */
startDate = Calendar.getInstance();
/* add a click listener to the button */
startPickDate.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showDateDialog(startDateDisplay, startDate);
}
});
/* capture our View elements for the end date function */
endDateDisplay = (TextView) findViewById(R.id.endDateDisplay);
endPickDate = (Button) findViewById(R.id.endPickDate);
/* get the current date */
endDate = Calendar.getInstance();
/* add a click listener to the button */
endPickDate.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showDateDialog(endDateDisplay, endDate);
}
});
/* display the current date (this method is below) */
updateDisplay(startDateDisplay, startDate);
updateDisplay(endDateDisplay, endDate);
}
private void updateDisplay(TextView dateDisplay, Calendar date) {
dateDisplay.setText(
new StringBuilder()
// Month is 0 based so add 1
.append(date.get(Calendar.MONTH) + 1).append("-")
.append(date.get(Calendar.DAY_OF_MONTH)).append("-")
.append(date.get(Calendar.YEAR)).append(" "));
}
public void showDateDialog(TextView dateDisplay, Calendar date) {
activeDateDisplay = dateDisplay;
activeDate = date;
showDialog(DATE_DIALOG_ID);
}
private OnDateSetListener dateSetListener = new OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
activeDate.set(Calendar.YEAR, year);
activeDate.set(Calendar.MONTH, monthOfYear);
activeDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);
updateDisplay(activeDateDisplay, activeDate);
unregisterDateDisplay();
}
};
private void unregisterDateDisplay() {
activeDateDisplay = null;
activeDate = null;
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DATE_DIALOG_ID:
return new DatePickerDialog(this, dateSetListener, activeDate.get(Calendar.YEAR), activeDate.get(Calendar.MONTH), activeDate.get(Calendar.DAY_OF_MONTH));
}
return null;
}
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
super.onPrepareDialog(id, dialog);
switch (id) {
case DATE_DIALOG_ID:
((DatePickerDialog) dialog).updateDate(activeDate.get(Calendar.YEAR), activeDate.get(Calendar.MONTH), activeDate.get(Calendar.DAY_OF_MONTH));
break;
}
}
}
回答by IHeartAndroid
I was not satisfied with any of the aforementioned solutions so I made my own as follows: https://gist.github.com/JoachimR/f82b2b371b1ced4a09918c970e045d4f
我对上述任何解决方案都不满意,所以我自己做了如下:https: //gist.github.com/JoachimR/f82b2b371b1ced4a09918c970e045d4f
import android.app.DatePickerDialog
import android.app.Dialog
import android.os.Bundle
import android.support.v4.app.DialogFragment
import java.util.*
class ChooseDayDialog : DialogFragment() {
companion object {
private val KEY_INITIAL_TIMESTAMP = "KEY_INITIAL_TIMESTAMP"
private val KEY_REQUEST_CODE = "KEY_REQUEST_CODE"
private val DEFAULT_REQUEST_CODE = 20
fun createInstance(initialTimestamp: Long,
requestCode: Int = DEFAULT_REQUEST_CODE) =
ChooseDayDialog().apply {
arguments = Bundle().apply {
putLong(KEY_INITIAL_TIMESTAMP, initialTimestamp)
putInt(KEY_REQUEST_CODE, requestCode)
}
}
}
interface OnDayChosenListener {
fun onDayChosen(requestCode: Int, year: Int, month: Int, dayOfMonth: Int)
}
private lateinit var listener: OnDayChosenListener
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val activity = activity
if (activity is OnDayChosenListener) {
listener = activity
} else {
throw IllegalStateException("Activity must implement OnDayChosenListener")
}
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val timestamp = arguments?.getLong(KEY_INITIAL_TIMESTAMP, -1L) ?: -1L
if (timestamp == -1L) {
throw IllegalStateException("no initial time given")
}
val requestCode = arguments?.getInt(KEY_REQUEST_CODE, DEFAULT_REQUEST_CODE)
?: DEFAULT_REQUEST_CODE
val calendar = Calendar.getInstance().apply {
timeInMillis = timestamp
}
return DatePickerDialog(activity,
DatePickerDialog.OnDateSetListener { _, year, month, dayOfMonth ->
listener.onDayChosen(requestCode, year, month, dayOfMonth)
},
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH))
}
}
回答by Justice Bringer
I had to implement 2 date pickers for the starting date of a trip and an ending date of it. I used a boolean flag to know which text view to fill with the picked date from the date picker dialog. Below, a visual representation of the code.
我必须为旅行的开始日期和结束日期实施 2 个日期选择器。我使用了一个布尔标志来知道用日期选择器对话框中选择的日期填充哪个文本视图。下面是代码的可视化表示。
public class AddTrip extends AppCompatActivity implements DatePickerDialog.OnDateSetListener {
private boolean startOrEnd = true;
private Button startDateBtn;
private Button endDateBtn;
private TextView startDateText;
private TextView endDateText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_trip);
initAll();
startDateBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDatePickerDialog();
startOrEnd = true;
}
});
endDateBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDatePickerDialog();
startOrEnd = false;
}
});
}
public void initAll(){
startDateBtn = findViewById(R.id.idstartDateBtn);
endDateBtn = findViewById(R.id.idendDateBtn);
startDateText = findViewById(R.id.startDateText);
endDateText = findViewById(R.id.endDateText);
}
private void showDatePickerDialog() {
DatePickerDialog datePickerDialog = new DatePickerDialog(
this,
this,
Calendar.getInstance().get(Calendar.YEAR),
Calendar.getInstance().get(Calendar.MONTH),
Calendar.getInstance().get(Calendar.DAY_OF_MONTH));
datePickerDialog.show();
}
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
String date = "month/day/year: " + month + "/" + dayOfMonth + "/" + year;
if (startOrEnd) {
startDateText.setText(date);
} else {
endDateText.setText(date);
}
}
}
回答by Adarsh Sahu
issue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Bundle bundle = new Bundle();
bundle.putInt("DATE", 1);
DialogFragment newFragment = new MyDatePickerFragment();
newFragment.setArguments(bundle);
newFragment.show(getSupportFragmentManager(), "datePicker");
}
});
expiry.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Bundle bundle = new Bundle();
bundle.putInt("DATE", 2);
DialogFragment newFragment = new MyDatePickerFragment();
newFragment.setArguments(bundle);
newFragment.show(getSupportFragmentManager(), "datePicker");
}
});
}
@Override
public void sendInput(String input, int id) {
date = input;
switch (id) {
case 1:
issue.setText(date);
break;
case 2:
expiry.setText(date);
break;
}
public class MyDatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
static final int ISSUE_DATE = 1;
static final int EXPIRY_DATE = 2;
private int mChosenDate;
int cur = 0;
@Override
public void onDateSet(DatePicker datePicker, int year, int month, int day) {
String date;
if (cur == ISSUE_DATE) {
// set selected date into textview
Log.v("Date Issue", "Date1 : " + new StringBuilder().append(month + 1)
.append("-").append(day).append("-").append(year)
.append(" "));
date = day + "/0" + (month + 1) + "/" + year;
} else {
Log.v("Date expiry", "Date2 : " + new StringBuilder().append(month + 1)
.append("-").append(day).append("-").append(year)
.append(" "));
date = day + "/0" + (month + 1) + "/" + year;
}
listenerforActivity.sendInput(date, cur);
}
public interface OnDateSetListenerInterface {
void sendInput(String input, int id);
}
public OnDateSetListenerInterface listenerforActivity;
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
listenerforActivity = (OnDateSetListenerInterface) getActivity();
} catch (ClassCastException e) {
Toast.makeText(context, e.toString(), Toast.LENGTH_SHORT).show();
}
}
@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);
Bundle bundle = this.getArguments();
if (bundle != null) {
mChosenDate = bundle.getInt("DATE", 1);
}
switch (mChosenDate) {
case ISSUE_DATE:
cur = ISSUE_DATE;
return new DatePickerDialog(getActivity(), this, year, month, day);
case EXPIRY_DATE:
cur = EXPIRY_DATE;
return new DatePickerDialog(getActivity(), this, year, month, day);
}
return null;
}
}
回答by Diogo Silva
My solution for this was simply using a switch
我对此的解决方案只是使用开关
public class RegisterActivity extends AppCompatActivity implements DatePickerDialog.OnDateSetListener {
private TextView mDisplayBirthDay;
private TextView mDisplayExpDate;
private TextView mDisplayIssueDate;
private int sw;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Objects.requireNonNull(getSupportActionBar()).setDisplayShowTitleEnabled(false); // to get rid of the title of the activity
Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
mDisplayBirthDay = findViewById(R.id.birthDate);
findViewById(R.id.birthDate).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDatePickerDialog();
sw = 0;
}
});
mDisplayExpDate = findViewById(R.id.editText_expire);
findViewById(R.id.editText_expire).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDatePickerDialog();
sw = 1;
}
});
mDisplayIssueDate = findViewById(R.id.editText_issueDate);
findViewById(R.id.editText_issueDate).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDatePickerDialog();
sw = 2;
}
});
}
private void showDatePickerDialog(){
DatePickerDialog datePickerDialog = new DatePickerDialog(this,
this,
Calendar.getInstance().get(Calendar.YEAR),
Calendar.getInstance().get(Calendar.MONTH),
Calendar.getInstance().get(Calendar.DAY_OF_MONTH));
datePickerDialog.show();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.show_registrations:
getSupportFragmentManager().beginTransaction().replace(R.id.event_description,
//TODO: pass eventID as intend when clicked on event
EventRegistration.newInstance(69)).commit();
break;
case R.id.visibility_event:
break;
case android.R.id.home:
onBackPressed(); //handling the "back" button
break;
default:
}
return true;
}
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
month = month + 1; //because January is the month 0
String date = dayOfMonth + "/" + month + "/" + year;
switch (sw){
case 0:
mDisplayBirthDay.setText(date);
break;
case 1:
mDisplayExpDate.setText(date);
break;
case 2:
mDisplayIssueDate.setText(date);
break;
default:
}
}
}
}