GregorianCalendar在android api 26中失去了焦点

GregorianCalendar在android api 26中失去了焦点,android,calendar,lostfocus,android-8.0-oreo,Android,Calendar,Lostfocus,Android 8.0 Oreo,我有一个带有日历的Android TV应用程序,可以通过d-pad进行控制。它在AndroidAPI25中运行良好,当我将其更新为AndroidAPI26时,它无法正常工作。 当日历第一次打开时,它聚焦于当天,我点击d-pad,它就失去了焦点。我再也不能用d-pad控制了 任何人知道为什么请告诉我原因和如何解决它 这是我的代码: 我的日历适配器: 公共类RecyclerAdapter扩展了RecyclerView。适配器实现了View.OnClickListener{ private stati

我有一个带有日历的Android TV应用程序,可以通过d-pad进行控制。它在AndroidAPI25中运行良好,当我将其更新为AndroidAPI26时,它无法正常工作。 当日历第一次打开时,它聚焦于当天,我点击d-pad,它就失去了焦点。我再也不能用d-pad控制了

任何人知道为什么请告诉我原因和如何解决它

这是我的代码:

我的日历适配器: 公共类RecyclerAdapter扩展了RecyclerView。适配器实现了View.OnClickListener{

private static final int DAY_OFFSET = 1;
private final String[] months = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
private final int[] daysOfMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
String date_month_year;
private Activity activity;
private List<String> list;
private int daysInMonth;
private int currentDayOfMonth;
private int currentWeekDay;
private CalendarAdapter.IChangeMonth iChangeMonth;
private int currentMonth;
private Calendar calendar;

public RecyclerAdapter(Context context, int textViewResourceId, int month, int year, CalendarAdapter.IChangeMonth iChangeMonth) {
    super();
    this.activity = (Activity) context;
    this.list = new ArrayList<String>();
    calendar = Calendar.getInstance();
    setCurrentDayOfMonth(calendar.get(Calendar.DAY_OF_MONTH));
    setCurrentWeekDay(calendar.get(Calendar.DAY_OF_WEEK));
    this.iChangeMonth = iChangeMonth;

    // Print Month
    printMonth(month, year);
}

private String getMonthAsString(int i) {
    return months[i];
}

private int getNumberOfDaysOfMonth(int i) {
    return daysOfMonth[i];
}

private void printMonth(int mm, int yy) {
    int trailingSpaces = -1;
    int daysInPrevMonth = 0;
    int prevMonth = 0;
    int prevYear = 0;
    int nextMonth = 0;
    int nextYear = 0;

    currentMonth = mm - 1;
    daysInMonth = getNumberOfDaysOfMonth(currentMonth);


    // Gregorian GridCalendar : MINUS 1, set to FIRST OF MONTH
    GregorianCalendar cal = new GregorianCalendar(yy, currentMonth, 1);

    if (currentMonth == 11) {
        prevMonth = currentMonth - 1;
        daysInPrevMonth = getNumberOfDaysOfMonth(prevMonth);
        nextMonth = 0;
        prevYear = yy;
        nextYear = yy + 1;
    } else if (currentMonth == 0) {
        prevMonth = 11;
        prevYear = yy - 1;
        nextYear = yy;
        daysInPrevMonth = getNumberOfDaysOfMonth(prevMonth);
        nextMonth = 1;
    } else {
        prevMonth = currentMonth - 1;
        nextMonth = currentMonth + 1;
        nextYear = yy;
        prevYear = yy;
        daysInPrevMonth = getNumberOfDaysOfMonth(prevMonth);
    }

    int currentWeekDay = cal.get(Calendar.DAY_OF_WEEK) - 1;
    trailingSpaces = currentWeekDay;

    if (cal.isLeapYear(cal.get(Calendar.YEAR)) && mm == 1) {
        ++daysInMonth;
    }

    // Trailing Month days
    for (int i = 0; i < trailingSpaces; i++) {
        list.add(String.valueOf((daysInPrevMonth - trailingSpaces + DAY_OFFSET) + i) + "-GREY" + "-" + getMonthAsString(prevMonth) + "-" + prevYear + "-" + (prevMonth + 1));
    }

    // Current Month Days
    for (int i = 1; i <= daysInMonth; i++) {
        if (i == getCurrentDayOfMonth())
            list.add(String.valueOf(i) + "-DARKRED" + "-" + getMonthAsString(currentMonth) + "-" + yy + "-" + (currentMonth + 1));
        else
            list.add(String.valueOf(i) + "-WHITE" + "-" + getMonthAsString(currentMonth) + "-" + yy + "-" + (currentMonth + 1));
    }

    // Leading Month days
    for (int i = 0; i < list.size() % 7; i++) {
        list.add(String.valueOf(i + 1) + "-GREY" + "-" + getMonthAsString(nextMonth) + "-" + nextYear + "-" + (nextMonth + 1));
    }
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new ViewHolder(LayoutInflater.from(activity).inflate(R.layout.calendar_item, parent, false));
}

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
    final String[] day_color = list.get(position).split("-");
    String theDay = day_color[0];
    String theYear = day_color[3];
    String monthNumber = day_color[4];

    // Set the Day GridCell
    holder.btnGridCell.setText(theDay);
    holder.btnGridCell.setTag(theDay + "/" + monthNumber + "/" + theYear);

    if (day_color[1].equals("GREY")) {
        holder.btnGridCell.setTextColor(0xffe95451);
    }

    if (day_color[1].equals("DARKRED") && currentMonth == calendar.get(Calendar.MONTH)) {
        holder.btnGridCell.requestFocus();
      holder.btnGridCell.setTextColor(activity.getResources().getColor(R.color.current_day));
    } else if (day_color[1].equals("WHITE") && holder.btnGridCell.getText().equals("1") && currentMonth != calendar.get(Calendar.MONTH)) {
        holder.btnGridCell.requestFocus();
    }

    holder.btnGridCell.setOnClickListener(this);
    holder.itemView.setOnClickListener(this);
    holder.btnGridCell.setOnLongClickListener(v -> {
        if ((position % 7) == 0) {
            iChangeMonth.changePrevMonth();
        }
        if ((position % 7) == 6) {
            iChangeMonth.changeNextMonth();
        }
        return false;
    });
    holder.btnGridCell.setOnKeyListener((v, keyCode, event) -> {
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            switch (keyCode) {
                case KeyEvent.KEYCODE_ENTER:
                case KeyEvent.KEYCODE_DPAD_CENTER:
                    date_month_year = (String) v.getTag();
                    try {
                        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault());
                        Date date = formatter.parse(date_month_year);
                        iChangeMonth.choseDate(date.getTime());
                    } catch (ParseException e) {
                        e.printStackTrace();
                        Toast.makeText(activity, e.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                    break;
                case KeyEvent.KEYCODE_DPAD_LEFT:
                    if ((position % 7) == 0) {
                        iChangeMonth.changePrevMonth();
                    }
                    break;
                case KeyEvent.KEYCODE_DPAD_RIGHT:
                    if ((position % 7) == 6) {
                        iChangeMonth.changeNextMonth();
                    }
                    break;
            }
            return false;
        }
        if (event.getAction() == KeyEvent.ACTION_UP) {
            Log.e("eee", "action up: " + holder.getAdapterPosition());
            return false;
        }
        return false;
    });
}

@Override
public int getItemCount() {
    return list.size();
}

@Override
public void onClick(View view) {
    date_month_year = (String) view.getTag();
    try {
        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault());
        Date date = formatter.parse(date_month_year);
        iChangeMonth.choseDate(date.getTime());
    } catch (ParseException e) {
        e.printStackTrace();
        Toast.makeText(activity, e.getMessage(), Toast.LENGTH_SHORT).show();
    }
}

public int getCurrentDayOfMonth() {
    return currentDayOfMonth;
}

private void setCurrentDayOfMonth(int currentDayOfMonth) {
    this.currentDayOfMonth = currentDayOfMonth;
}

public int getCurrentWeekDay() {
    return currentWeekDay;
}

public void setCurrentWeekDay(int currentWeekDay) {
    this.currentWeekDay = currentWeekDay;
}

public class ViewHolder extends RecyclerView.ViewHolder {
    private Button btnGridCell;
    private View itemView;

    public ViewHolder(View itemView) {
        super(itemView);
        this.itemView = itemView;
        btnGridCell = (Button) itemView.findViewById(R.id.calendar_day_gridcell);
    }
}
private static final int DAY_OFFSET=1;
私人最终字符串[]个月={“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”};
私人期末整数[]天每月={31,28,31,30,31,30,31,31,30,31,30,31,31};
字符串日期\月\年;
私人活动;
私人名单;
私人国际日每月;
私人int currentDayOfMonth;
工作日内的私人时间;
private CalendarAdapter.IChangeMonth IChangeMonth;
私人月;
私人日历;
public RecyclerAdapter(上下文上下文、int-textViewResourceId、int-month、int-year、CalendarAdapter.IChangeMonth-IChangeMonth){
超级();
this.activity=(activity)上下文;
this.list=new ArrayList();
calendar=calendar.getInstance();
setCurrentDayOfMonth(calendar.get(calendar.DAY/u/u MONTH));
setCurrentWeekDay(calendar.get(calendar.DAY OF the u WEEK));
this.iChangeMonth=iChangeMonth;
//打印月份
打印月份(月、年);
}
私有字符串getMontHaString(int i){
返回月份[i];
}
private int getNumberOfDaysOfMonth(int i){
每月返回日[i];
}
私人月(整数毫米,整数年){
int trailingSpaces=-1;
int daysInPrevMonth=0;
int prevMonth=0;
整年=0;
int nextMonth=0;
int-nextYear=0;
当前月份=毫米-1;
daysInMonth=getNumberOfDaysOfMonth(当前月);
//公历:减1,设置为月初
GregorianCalendar cal=新的GregorianCalendar(yy,当前月份,1);
如果(当前月份==11){
prevMonth=currentMonth-1;
daysInPrevMonth=getNumberOfDaysOfMonth(prevMonth);
下一个月=0;
上一年=yy;
nextYear=yy+1;
}else if(当前月==0){
前一个月=11;
上一年=yy-1;
nextYear=yy;
daysInPrevMonth=getNumberOfDaysOfMonth(prevMonth);
下个月=1;
}否则{
prevMonth=currentMonth-1;
下一个月=当前月+1;
nextYear=yy;
上一年=yy;
daysInPrevMonth=getNumberOfDaysOfMonth(prevMonth);
}
int currentWeekDay=cal.get(Calendar.DAY\u OF_WEEK)-1;
trailingSpaces=当前工作日;
if(cal.isLeapYear(cal.get(Calendar.YEAR))&&mm==1){
++日/月;
}
//后续月份天数
for(int i=0;i{
if(event.getAction()==KeyEvent.ACTION\u向下){
开关(钥匙代码){
case KeyEvent.KEYCODE\u输入:
case KeyEvent.KEYCODE\u DPAD\u中心:
date_month_year=(字符串)v.getTag();
试一试{
SimpleDataFormat格式化程序=新的SimpleDataFormat(“dd/MM/yyyy”,Locale.getDefault());
Date-Date=formatter.parse(日期、月份、年份);
i更改month.chostate(date.getTime());
}捕获(解析异常){
e、 printStackTrace();
Toast.makeText(活动,例如getMessage(),Toast.LENGTH_SHORT).show();
}
打破
case KeyEvent.KEYCODE_DPAD_左:
如果((位置%7)=0){
iChangeMonth.changePrevMonth();
}
打破
case KeyEvent.KEYCODE\u DPAD\u右侧:
如果((位置%7)==6){
i更改月份。更改下一个月();
}
打破
}
返回false;
}
if(event.getAction()==KeyEvent.ACTION\u UP){
Log.e(“eee”,“action up:+holder.getAdapterPosition());
返回false;
}
返回false;
});
}
@凌驾
public int getItemCount(){
返回list.size();
}
@凌驾
公共void onClick(视图){
date_month_year=(字符串)view.getTag();
试一试{
SimpleDataFormat格式化程序=新的SimpleDataFormat(“dd/MM/yyyy”,Locale.getDefault());
Date-Date=formatter.parse(日期、月份、年份);
i更改month.chostate(date.getTime());
}捕获(解析异常){
e、 printStackTrace();
Toast.makeText(活动,例如getMessage(),Toast.LENGTH_SHORT).show();
}
}
public int getCurrentDayOfMonth(){
返回currentDayOfMonth;
}
私有无效设置currentDayOfMonth(int currentDayOfMonth){
this.currentDayOfMonth=currentDayOfMonth;
}
public int getCurrentWeekDay(){
返回当前工作日;
}
公共无效setCurrentWeekDay(int currentWeekDay){
this.currentWeekDay=currentWeekDay;
}
公共类ViewHolder扩展了RecyclerView.ViewHolder{
专用按钮btnGridCell;
私有视图项目视图;
公共视图持有者(视图项视图){
超级(项目视图);
this.itemView=itemView;
btnGridCell=(按钮)itemviewbyd(R.id.calendar\u day\u gridcell