Created
July 3, 2014 01:55
-
-
Save code4lifevn/7855c00ce7569824d2f8 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.concurrent.atomic.AtomicInteger; | |
import android.annotation.SuppressLint; | |
import android.os.Build; | |
import android.view.View; | |
/** | |
* {@link View#generateViewId()}要求API Level >= 17,而本工具类可兼容所有API Level | |
* <p> | |
* 自动判断当前API Level,并优先调用{@link View#generateViewId()},即使本工具类与{@link View#generateViewId()} | |
* 混用,也能保证生成的Id唯一 | |
* <p> | |
* ============= | |
* <p> | |
* while {@link View#generateViewId()} require API Level >= 17, this tool is compatibe with all API. | |
* <p> | |
* according to current API Level, it decide weather using system API or not.<br> | |
* so you can use {@link ViewIdGenerator#generateViewId()} and {@link View#generateViewId()} in the | |
* same time and don't worry about getting same id | |
* | |
* @author [email protected] | |
*/ | |
public class ViewIdGenerator { | |
private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1); | |
@SuppressLint("NewApi") | |
public static int generateViewId() { | |
if (Build.VERSION.SDK_INT < 17) { | |
for (;;) { | |
final int result = sNextGeneratedId.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 (sNextGeneratedId.compareAndSet(result, newValue)) { | |
return result; | |
} | |
} | |
} else { | |
return View.generateViewId(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment