datepicker - 如果我们控制遥控器,如何在 Android TV 上的 DatePicker 中完成编辑
问题描述
我有一个包含两个标签、一个 DatePicker 和两个返回和应用按钮的对话框。默认情况下,焦点属于“应用”按钮。我们通过按下遥控器上的向上按钮开始编辑 DatePicker。我们已经设置了日期,并希望进入“应用”按钮。但这是不可能的,因为使用 DatePicker 您无法转到按钮,因为当您按下遥控器上的“向下”按钮时,日期会更改。我希望在设置日期后,我会按遥控器上的 Enter 按钮,然后将焦点放在“应用”按钮上。可能吗?
下面是对话框的代码:
public class DateSelector {
public static void showSubscriptionDateDialog(Context context, long expiredAt, DateSetListener listener) {
Dialog dialog = new Dialog(context, R.style.DialogTheme);
dialog.setContentView(R.layout.dialog_subscription_date);
DatePicker datePicker = dialog.findViewById(R.id.date_picker);
TextView dateLabel = dialog.findViewById(R.id.subscription_date);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(expiredAt);
AtomicInteger dayForSave = new AtomicInteger();
dayForSave.set(calendar.get(Calendar.DATE));
AtomicInteger monthForSave = new AtomicInteger();
monthForSave.set(calendar.get(Calendar.MONTH));
AtomicInteger yearForSave = new AtomicInteger();
yearForSave.set(calendar.get(Calendar.YEAR));
setDateLabel(yearForSave, monthForSave, dayForSave, dateLabel);
Button buttonBack = dialog.findViewById(R.id.button_back);
buttonBack.setOnClickListener(v -> {
dialog.dismiss();
});
Button buttonClear = dialog.findViewById(R.id.button_clear);
buttonClear.setOnClickListener(v -> {
calendar.set(yearForSave.get(), monthForSave.get(), dayForSave.get());
listener.onDateSelected(calendar.getTimeInMillis());
dialog.dismiss();
});
datePicker.init(yearForSave.get(), monthForSave.get(), dayForSave.get(),
(view, year1, monthOfYear, dayOfMonth) -> {
yearForSave.set(year1);
monthForSave.set(monthOfYear);
dayForSave.set(dayOfMonth);
setDateLabel(yearForSave, monthForSave, dayForSave, dateLabel);
});
buttonClear.requestFocus();
dialog.show();
}
private static void setDateLabel(AtomicInteger yearForSave, AtomicInteger monthForSave,
AtomicInteger dayForSave, TextView dateLabel) {
Calendar calendar = Calendar.getInstance();
Locale locale = Locale.getDefault();
SimpleDateFormat dateFormat = new SimpleDateFormat("EE, d MMMM, yyyy", locale);
calendar.set(yearForSave.get(), monthForSave.get(), dayForSave.get());
String expirationDate = dateFormat.format(calendar.getTime());
dateLabel.setText(expirationDate);
}
public interface DateSetListener {
void onDateSelected(long expiredAt);
}
}
解决方案
我找到了解决这个问题的方法。您可以将侦听器挂在对话框上并点击“应用”按钮。下面是解决这个问题的代码:
dialog.setOnKeyListener((dialog1, keyCode, event) -> {
if (buttonApply.hasFocus() || buttonBack.hasFocus()) return false;
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
buttonApply.requestFocus();
return true;
}
}
return false;
});
推荐阅读
- spring - spring 一对一注释异常
- apache-spark - 来自 Kafka 主题的 PySpark 结构化流的 Cassandra Sink
- javascript - ECMAScript 模块(导入/导出)@Node.js(当前@v13.0.1)
- json - 处理 json 响应中的 NULL 值
- javascript - 如何通过 JavaScript 制作按钮来控制时间轴上的步骤
- docusignapi - 编辑 DocuSign 签名登录页面
- typescript - 类中的可选字段
- scala - 为什么这个 Spark 代码在本地模式下工作,而不在集群模式下工作?
- html - 如何获得带有标记图像的地图封面背景图像并正确调整大小?
- c# - 使用左连接时使用实体框架错误生成的 SQL 代码