- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有an unfinished Android app主要 Activity 包含一个 TimePicker
(@+id/tyme
),一个 DatePicker
(@+id/date
),以及一个 TextView
(@+id/dropTime
),用于显示类似“DateTime”的数据,出于某种原因我需要两个 View 来指定。
因为 Javadocs 反对所有从 Date
实例中提取 DateTime 字段类型值的尝试,我想使用 Calendar
类来表示用户选择的组合年、月、日、时、分、秒。我发现我经常(但不总是)不能在不同时递增日期字段的情况下递减小时或分钟字段。这是我的 DatePicker
事件处理程序:
date = (DatePicker) findViewById(R.id.date);
// h/t O'one https://stackoverflow.com/a/34952495/948073
date.init(
calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH),
new DatePicker.OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker datePicker, int y, int m, int d) {
System.out.println("onDateChanged(tp,"+y+","+m+","+d+")");
calendar.set(Calendar.YEAR, y);
calendar.set(Calendar.MONTH, m);
calendar.set(Calendar.DAY_OF_MONTH, d);
updateDropTime();
}
}
);
还有 TimePicker
。请注意 y/m/d 字段的显式备份和恢复,以徒劳地尝试消除 h:m:s 更改期间 y:m:d 的可疑交叉污染:
private TimePicker time;
dropTime = (TextView) findViewById(R.id.dropTime);
updateDropTime();
time = (TimePicker) findViewById(R.id.tyme);
time.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
public void onTimeChanged(TimePicker tp, int h, int m) {
System.out.println("onTimeChanged(tp,"+h+","+m+")");
// Save state of y/m/d portion of calendar
int y = calendar.get(Calendar.YEAR);
int mo = calendar.get(Calendar.MONTH);
int d = calendar.get(Calendar.DAY_OF_MONTH);
// Set h and m fields of calendar based on user input
calendar.set(Calendar.HOUR, h);
calendar.set(Calendar.MINUTE, m);
// Restore state of y/m/d fields
calendar.set(Calendar.YEAR, y);
calendar.set(Calendar.MONTH, mo);
calendar.set(Calendar.DAY_OF_MONTH, d);
// In theory y/m/d portion of datetime should be unchanged
updateDropTime();
}
});
这两个事件处理程序都调用了 updateDropTime()
,如下所示:
private void updateDropTime() {
String disp = DateFormat.getDateTimeInstance().format(calendar.getTimeInMillis());
dropTime.setText(disp);
}
我怀疑导致 disp
值的方法链中的某些东西是看似困惑的行为发生的地方,因为我认为我已经系统地消除了对日期字段的任何更改可以想象,时间字段变化的副作用。
最佳答案
这一行是错误的:
calendar.set(Calendar.HOUR, h);
相反,你想要:
calendar.set(Calendar.HOUR_OF_DAY, h);
您在 onTimeChanged()
中获得的 h
是 24 小时制的一天中的小时。 Calendar.HOUR
表示 AM 或 PM 中的小时,即 12 小时制。
这怎么会导致您的问题?示例:原始时间是 20:25(如果您愿意,也可以是晚上 8:25)。用户将其更改为 13:28(下午 1:28)。您将 Calendar.HOUR
设置为 13。由于原始时间是下午并且您没有更改它,您实际上是将时间设置为下午 13:28。这是无稽之谈,但 Calendar
并不关心,它只是将其解释为 1:28
AM 第二天。设置日期没有帮助,因为在你这样做的时候,字段还没有计算,所以内部时间仍然是正确日期的下午 13:28。只有当您最后调用 getTimeInMillis()
时,才会计算所有字段、检测到溢出并增加日期。
Calendar
默认宽松如果您想收到有关此类错误的通知(我们都会不时发生),请在创建后对 Calendar
对象调用 setLenient(false)
它。这将导致它不接受超出范围的值,例如 HOUR
的 13。
如果您根本不想为 Calendar
类操心,那么您肯定不是第一个,还有一个更好、对程序员更友好的替代方案。现代 Java 日期和时间 API 内置于 Java 8 及更高版本中,在 Android 上,您可以在 ThreeTenABP 中找到它。 , 请参阅 How to use ThreeTenABP in Android Project .我建议将日期保存在 LocalDate
对象中,将一天中的时间保存在 LocalTime
中,这样用户就可以独立更新每个对象而没有交叉污染的风险。只有在 updateDropTime()
中,您才会使用 LocalDate.atTime()
将两者组合成一个 LocalDateTime
,然后将其格式化为您想要的显示格式使用 DateTimeFormatter
。
public void onTimeChanged(TimePicker tp, int h, int m) {
System.out.println("onTimeChanged(tp," + h + "," + m + ")");
time = LocalTime.of(h, m);
updateDropTime();
}
更新可能是这样的:
private void updateDropTime() {
String disp = date.atTime(time)
.format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT));
dropTime.setText(disp);
}
关于Java Calendar 实例递增 DAY_OF_MONTH 作为递减(仅)HOUR 或 MINUTE 的副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45260922/
这2个有什么区别?一个使用 SideEffect,另一个不使用。 “每次成功重组都会调用 SideEffect”,但如果没有 SideEffect,它也会在每次重组时运行。 @Composable f
我在 DOM 元素引用方面遇到了一些问题,我想我已经追踪到它与更新 innerHTML 有关。 在这个例子中,在第一次警告时,两个变量引用同一个元素,正如预期的那样。奇怪的是,在更新父元素(body)
如果有人问过这个问题,请原谅我,但我似乎找不到它。 我正在尝试创建一个数组并反转它(不使用反转)这段代码完美运行: function reverseArrayInPlace(array) { fo
如果 reflector 是正确的(我倾向于相信它是正确的),这就是 Any() 的实现: public static bool Any(this IEnumerable source) {
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
是否可以用 LINQ 中的 lambda 表达式替换 foreach 循环 (.Select))? List l = {1, 2, 3, 4, 5}; foreach (int i in l)
我在一本书上读到以下说法: n = ((i++) > (j)?(i++):(j)); 书上说假设i>j,n有一个意想不到的值,i增加了两次。 我不明白为什么n在这句话之后有一个期望值。 我读了很多关于
我对更改 LD_LIBRARY_PATH 有奇怪的副作用。 当我附加一个包含库的路径时,例如: LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_path/lib 然后,一切都
有人能告诉我下面一行中“副作用”的含义吗? If you're calling an EL function that doesn't return anything, then you're cal
是否有为包含副作用的 Java/JVM 语言方法编写 javadoc 的标准或最佳实践? 我定义了一个 void 方法,它修改了方法参数之一,但不知道如何记录实际返回值(因为没有实际返回)。 /**
我正在学习副作用和纯函数。我知道纯函数没有副作用,对于相同的参数,它们的返回值是相同的。我想知道 C 函数 strcmp() 是否是纯函数。我相信它是纯粹的,因为给定相同的两个字符串作为参数,结果将始
我正在尝试创建佛罗里达州的点密度图。虽然我知道 Highmaps 不支持带有 map 点的颜色轴。我扩展了它并且它有效,但它带来了副作用。当我单击图例中的某一类别时,不会发生隐藏。例如,如果我单击“>
我在 CS50 中研究 PSET 4,似乎遇到了 sprintf 更改不相关变量的问题。我只给出了没有揭示我的解决方案的代码...... #include #include #include t
我已经实现了这样的 UnaryOperation struct Converter { Converter( std::size_t value ): value_( valu
使用点符号调用自定义 getter 是否有副作用? 我一直在通过点符号在 Objective-C 中使用合成的 getter,即 tree.fruitnumber 返回树中果实的数量。我必须自定义 s
我无法理解页面 https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special/void 中的这一段: This ope
我有一个在 IIS7 下运行的 Web 应用程序。我将全局变量存储在一个带有静态变量的类中。该类称为 SessionVariables 并且在其中例如我有以下内容: public class Sess
运行命令时 ng-packagr -p ng-package.json 我得到以下输出 Building Angular library - - - skipped 8 lines - - - Sid
我想模拟一个 OverflowError 因为我想在引发异常之后测试变量的值。但是,我不知道如何使用我正在使用的库复制 OverflowError。我在此特定测试中使用的库是 pysolar.sola
当我尝试在可变 Map 中插入一个元素时,我希望这个元素插入到我的 Map 而不是返回 Map(如 PF,不可变对象(immutable对象) ecc ...)出于这个原因,我使用了可变集合,但在我的
我是一名优秀的程序员,十分优秀!