Android TV DatePicker如何通过遥控器确认编辑并跳转焦点至Apply按钮
解决方案
该需求完全可以实现,核心逻辑是通过监听DatePicker的遥控器按键事件,在用户按下确认键时主动将焦点转移到Apply按钮即可。
问题根因
原生DatePicker默认会拦截遥控器上下方向键的事件,用于调整年/月/日的数值,所以你按下下键只会修改日期,无法直接切换到下方的按钮。
修改步骤
在你现有代码的datePicker.init逻辑执行完成后,为DatePicker添加按键监听即可,需要注意导入android.view.KeyEvent类避免编译报错,完整修改后代码如下:
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(); }); // 你代码中的buttonClear就是对应Apply按钮 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); }); // 新增代码:监听DatePicker的遥控器按键事件 datePicker.setOnKeyListener((v, keyCode, event) -> { if (event.getAction() == KeyEvent.ACTION_DOWN) { // 匹配遥控器确认键 if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER) { buttonClear.requestFocus(); return true; } // 如果需要同时支持下键切焦点,可以取消注释下面这段逻辑 /* if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) { buttonClear.requestFocus(); return true; } */ } return false; }); 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); } }
效果说明
修改完成后,当用户在DatePicker编辑状态按下遥控器确认键,焦点会直接切换到Apply按钮,再次按下确认即可触发Apply的点击逻辑。
内容的提问来源于stack exchange,提问作者kumaser
相关产品推荐
相关产品推荐

