首页 > 解决方案 > 如果我们控制遥控器,如何在 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);
    }
}

标签: datepickerfocusandroid-tv

解决方案


我找到了解决这个问题的方法。您可以将侦听器挂在对话框上并点击“应用”按钮。下面是解决这个问题的代码:

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;
        });

推荐阅读