Browse Source

generateViewId fix

Daniel Zlotin 8 years ago
parent
commit
166f540d5b

+ 19
- 1
android/app/src/main/java/com/reactnativenavigation/utils/ViewUtils.java View File

5
 import android.graphics.PorterDuff;
5
 import android.graphics.PorterDuff;
6
 import android.graphics.PorterDuffColorFilter;
6
 import android.graphics.PorterDuffColorFilter;
7
 import android.graphics.drawable.Drawable;
7
 import android.graphics.drawable.Drawable;
8
+import android.os.Build;
8
 import android.util.DisplayMetrics;
9
 import android.util.DisplayMetrics;
9
 import android.view.View;
10
 import android.view.View;
10
 import android.view.ViewTreeObserver;
11
 import android.view.ViewTreeObserver;
41
     }
42
     }
42
 
43
 
43
     public static int generateViewId() {
44
     public static int generateViewId() {
44
-        return viewId.incrementAndGet();
45
+        if (Build.VERSION.SDK_INT >= 17) {
46
+            return View.generateViewId();
47
+        } else {
48
+            return compatGenerateViewId();
49
+        }
45
     }
50
     }
46
 
51
 
47
     public static float getScreenHeight() {
52
     public static float getScreenHeight() {
50
         wm.getDefaultDisplay().getMetrics(metrics);
55
         wm.getDefaultDisplay().getMetrics(metrics);
51
         return metrics.heightPixels;
56
         return metrics.heightPixels;
52
     }
57
     }
58
+
59
+    private static int compatGenerateViewId() {
60
+        for (; ; ) {
61
+            final int result = viewId.get();
62
+            // aapt-generated IDs have the high byte nonzero; clamp to the range under that.
63
+            int newValue = result + 1;
64
+            if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0.
65
+            if (viewId.compareAndSet(result, newValue)) {
66
+                return result;
67
+            }
68
+        }
69
+    }
70
+
53
 }
71
 }
54
 
72