Android DatePicker.OnDateChangedListener 调用了两次
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/12436073/
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
DatePicker.OnDateChangedListener called twice
提问by tomor
I'm trying to create an app where the user selects a date from a DatePicker, and then a list is updated with some values.
我正在尝试创建一个应用程序,用户从 DatePicker 中选择一个日期,然后用一些值更新一个列表。
My GUI looks like this:
我的 GUI 看起来像这样:
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" >
<DatePicker
android:id="@+id/datePicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" >
</ListView>
</LinearLayout>
Whereas my DatePicker initialization and handling look as follows:
而我的 DatePicker 初始化和处理如下所示:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
datePicker = (DatePicker) findViewById(R.id.datePicker);
Calendar c = Calendar.getInstance();
year = c.get(Calendar.YEAR);
month = c.get(Calendar.MONTH);
day = c.get(Calendar.DAY_OF_MONTH);
datePicker.init(year, month, day, dateSetListener);
}
private DatePicker.OnDateChangedListener dateSetListener = new DatePicker.OnDateChangedListener() {
public void onDateChanged(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
Calendar c = Calendar.getInstance();
c.set(year, monthOfYear, dayOfMonth);
System.out.println ("TEST");
}
};
In CatLog I see that "TEST" string is output twice, each time I play with the +/- buttons on the widget. What could be the problem?
在 CatLog 中,我看到“TEST”字符串输出两次,每次我玩小部件上的 +/- 按钮时。可能是什么问题呢?
Note: I've "disabled" the list-updating code on purpose, in order to make sure that the problem is not related to the ListView, as in here
注:我“已禁用”的列表更新的用途代码,以确保该问题不涉及到ListView,在这里
回答by Cesardl
When I test my application, method onDateSet called twice after accept the date selection and once when I canceled.
当我测试我的应用程序时,方法 onDateSet 在接受日期选择后调用了两次,在我取消时调用了一次。
I added a validation in the method onDateSet with parameter view, something like this
我在带有参数视图的方法 onDateSet 中添加了一个验证,就像这样
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth){
if (view.isShown()) {
updateDate(year, monthOfYear, dayOfMonth);
}
}
I hope you serve
我希望你服务
回答by tomor
I still haven't managed to find a neat fix. I've rather found a workaround, so the event does not fire twice. The workaround is as follows:
我仍然没有设法找到一个巧妙的解决办法。我宁愿找到一种解决方法,因此该事件不会触发两次。解决方法如下:
int timesCalled = 1;
private DatePicker.OnDateChangedListener dateSetListener = new DatePicker.OnDateChangedListener() {
public void onDateChanged(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
Calendar c = Calendar.getInstance();
c.set(year, monthOfYear, dayOfMonth);
timesCalled += 1;
if ((timesCalled % 2) == 0) {
System.out.println ("TEST");
}
}};
回答by evgeny.myasishchev
Instead of the onDateSet callback I've overridden onClick method of the DatePickerDialog dialog and handle BUTTON_POSITIVE clicks only.
我覆盖了 DatePickerDialog 对话框的 onClick 方法,而不是 onDateSet 回调,并且只处理 BUTTON_POSITIVE 点击。
public static class DatePickerFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Calendar c = Calendar.getInstance();
int initialYear = c.get(Calendar.YEAR);
int initialMonth = c.get(Calendar.MONTH);
int initialDay = c.get(Calendar.DAY_OF_MONTH);
return new DatePickerDialog(getActivity(), null, initialYear, initialMonth, initialDay) {
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == BUTTON_POSITIVE) {
int year = getDatePicker().getYear();
int month = getDatePicker().getMonth();
int day = getDatePicker().getDayOfMonth();
//TODO: Do your logic here
}
super.onClick(dialog, which);
}
};
}
}
The code stays clear but still it's not clear why onDateSet is called twice.
代码保持清晰,但仍然不清楚为什么 onDateSet 被调用两次。
回答by Graeme
Perhaps modify the listener by adding instance variables, that way you can check to see if they are different from the last time the method was called:
也许通过添加实例变量来修改侦听器,这样您就可以检查它们是否与上次调用该方法时不同:
final DatePickerDialog datePickerDialog = new DatePickerDialog (this, new DatePickerDialog.OnDateSetListener()
{
private int year;
private int month;
private int day;
@Override
public void onDateSet (DatePicker view, int year, int monthOfYear, int dayOfMonth)
{
if (this.year == year && this.month == monthOfYear && this.day == dayOfMonth)
return;
this.year = year;
this.month = monthOfYear;
this.day = dayOfMonth;
calendar.set (year, month, day);
int index = officeCalendar.indexOfKey (calendar.getTimeInMillis ());
if (index > -1)
viewPager.setCurrentItem (index);
}
}, calendar.get (Calendar.YEAR), calendar.get (Calendar.MONTH), calendar.get (Calendar.DATE));
回答by user1640247
private DatePicker.OnDateChangedListener dateSetListener = new DatePicker.OnDateChangedListener() {
public void onDateChanged(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
Calendar c = Calendar.getInstance();
c.set(year, monthOfYear, dayOfMonth);
updateDisplay();
}
};
TextView datetext;
datetext = (TextView) findViewById(R.id.selected_date);
private void updateDisplay() {
this.datetext.setText(new StringBuilder()
// Month is 0 based so add 1
.append(mMonth + 1).append("-").append(mDay).append("-")
.append(mYear).append(" "));
}
回答by Nguy?n V?n ???c
private DatePicker.OnDateChangedListener dateSetListener = new DatePicker.OnDateChangedListener() {
boolean fired = false;
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
if (fired == true){
//Twince
}
else{
Calendar c = Calendar.getInstance();
c.set(year, monthOfYear, dayOfMonth);
System.out.println ("TEST");
}
}
};
回答by iamronak
Please check my answer over here. It is for TimePickerDialog but also applicable for DatePickerDialog. You can create a custom dialog, it's almost equally as fast and simple and just works.
请检查我的答案在这里。它适用于 TimePickerDialog 但也适用于 DatePickerDialog。您可以创建一个自定义对话框,它几乎同样快速、简单且有效。
回答by user3922209
Not necessary to add this code under Jelly beans
无需在果冻豆下添加此代码
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth){
if (view.isShown()) {
updateDate(year, monthOfYear, dayOfMonth);
}
}