Android: View.setID(int id) programmatically - how to avoid ID conflicts?

前端 未结 15 2514
眼角桃花
眼角桃花 2020-11-21 22:53

I\'m adding TextViews programmatically in a for-loop and add them to an ArrayList.

How do I use TextView.setId(int id)? What Integer ID do I come up wit

15条回答
  •  难免孤独
    2020-11-21 23:40

    Just an addition to the answer of @phantomlimb,

    while View.generateViewId() require API Level >= 17,
    this tool is compatibe with all API.

    according to current API Level,
    it decide weather using system API or not.

    so you can use ViewIdGenerator.generateViewId() and View.generateViewId() in the same time and don't worry about getting same id

    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
     * 

    * 自动判断当前API Level,并优先调用{@link View#generateViewId()},即使本工具类与{@link View#generateViewId()} * 混用,也能保证生成的Id唯一 *

    * ============= *

    * while {@link View#generateViewId()} require API Level >= 17, this tool is compatibe with all API. *

    * according to current API Level, it decide weather using system API or not.
    * so you can use {@link ViewIdGenerator#generateViewId()} and {@link View#generateViewId()} in the * same time and don't worry about getting same id * * @author fantouchx@gmail.com */ 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(); } } }

提交回复
热议问题