From 5ce63f376c31ed7baf7b061978d232ae5f7b8f6c Mon Sep 17 00:00:00 2001 From: okjack Date: Sat, 17 Feb 2024 11:25:07 +0800 Subject: [PATCH] fix View.generateViewId --- .../java/com/fongmi/android/tv/bean/Func.java | 4 +-- .../com/fongmi/android/tv/utils/ViewUtil.java | 29 +++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/fongmi/android/tv/utils/ViewUtil.java diff --git a/app/src/leanback/java/com/fongmi/android/tv/bean/Func.java b/app/src/leanback/java/com/fongmi/android/tv/bean/Func.java index bc7fa88fc..bf05616c6 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/bean/Func.java +++ b/app/src/leanback/java/com/fongmi/android/tv/bean/Func.java @@ -1,10 +1,10 @@ package com.fongmi.android.tv.bean; import android.annotation.SuppressLint; -import android.view.View; import com.fongmi.android.tv.R; import com.fongmi.android.tv.utils.ResUtil; +import com.fongmi.android.tv.utils.ViewUtil; public class Func { @@ -20,7 +20,7 @@ public class Func { public Func(int resId) { this.resId = resId; - this.id = View.generateViewId(); + this.id = ViewUtil.generateViewId(); this.setDrawable(); } diff --git a/app/src/main/java/com/fongmi/android/tv/utils/ViewUtil.java b/app/src/main/java/com/fongmi/android/tv/utils/ViewUtil.java new file mode 100644 index 000000000..e79afea81 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/utils/ViewUtil.java @@ -0,0 +1,29 @@ +package com.fongmi.android.tv.utils; + +import android.os.Build; +import android.view.View; + +import java.util.concurrent.atomic.AtomicInteger; + +public class ViewUtil { + + private static final AtomicInteger viewIdGenerator = new AtomicInteger(1); + + public static int generateViewId() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) return View.generateViewId(); + else return generateUniqueViewId(); + } + + private static int generateUniqueViewId() { + while (true) { + final int result = viewIdGenerator.get(); + // aapt-generated IDs have the high byte nonzero; clamp to the range under that. + int newValue = result + 1; + if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0. + if (viewIdGenerator.compareAndSet(result, newValue)) { + return result; + } + } + } + +}