我在for循环中以编程方式添加TextViews,并将它们添加到数组列表中。

我如何使用TextView。setId (int id) ?我要用什么样的整数ID才能不与其他ID冲突?


当前回答

这对我来说很管用:

static int id = 1;

// Returns a valid id that isn't in use
public int findId(){  
    View v = findViewById(id);  
    while (v != null){  
        v = findViewById(++id);  
    }  
    return id++;  
}

其他回答

你也可以在res/values中定义ids.xml。你可以在android的示例代码中看到一个确切的例子。

samples/ApiDemos/src/com/example/android/apis/RadioGroup1.java
samples/ApiDemp/res/values/ids.xml

(这是对业余爱好者的回答的评论,但它太长了…呵呵)

Of course a static is not needed here. You could use SharedPreferences to save, instead of static. Either way, the reason is to save the current progress so that its not too slow for complicated layouts. Because, in fact, after its used once, it will be rather fast later. However, I dont feel this is a good way to do it because if you have to rebuild your screen again (say onCreate gets called again), then you probably want to start over from the beginning anyhow, eliminating the need for static. Therefore, just make it an instance variable instead of static.

下面是一个更小的版本,运行速度更快,可能更容易阅读:

int fID = 0;

public int findUnusedId() {
    while( findViewById(++fID) != null );
    return fID;
}

上述函数应该足够了。因为,据我所知,android生成的id有数十亿个,所以这可能会第一次返回1,而且总是很快。 因为,它实际上不会遍历已使用的id来查找未使用的id。但是,如果它确实找到了一个使用的ID,那么循环就在那里。

然而,如果你仍然希望在后续重新创建应用程序之间保存进度,并希望避免使用静态。这是SharedPreferences版本:

SharedPreferences sp = getSharedPreferences("your_pref_name", MODE_PRIVATE);

public int findUnusedId() {
    int fID = sp.getInt("find_unused_id", 0);
    while( findViewById(++fID) != null );
    SharedPreferences.Editor spe = sp.edit();
    spe.putInt("find_unused_id", fID);
    spe.commit();
    return fID;
}

这个类似问题的答案应该告诉你你需要知道的关于android id的一切:https://stackoverflow.com/a/13241629/693927

编辑/修复:刚刚意识到我完全搞砸了保存。我一定是喝醉了。

Compat库现在还支持API级别之前的generateViewId()方法。

只要确保使用27.1.0以上版本的Compat库即可

例如,在您的构建中。Gradle文件,放入:

实现“com.android.support: appcompat-v7:27.1.1

然后你可以简单地使用来自ViewCompat类的generateViewId()而不是View类,如下所示:

//将分配唯一的ID myView。id = ViewCompat.generateViewId()

编码愉快!

为了动态生成视图Id表单API 17使用

generateViewId ()

这将生成一个适合在setId(int)中使用的值。该值不会与aapt在构建时为r.d ID生成的ID值冲突。

从API 17开始,View类有一个静态方法generateViewId()

生成适合setId(int)的值