Android如何通过编程创建ID

10

我希望在不使用XML声明的情况下创建代码中的ID。例如,我有一段代码,我通过编程方式创建视图,如下所示:

@Override
protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);
  setContentView(R.layout.new_layout);

  LinearLayout ll = (LinearLayout)findViewById(R.id.layout);
  View v = new View(this);
  v.setBackgroundColor(0xFFFF0000);
  ll.addView(v, 100, 100);

}

我可以添加v.setId(50),但我想要添加v.setId(R.id.some_id),并且不想将some_id添加到XML文件中,我知道这个选项。

我的问题是,如何在程序中创建R.id.some_id而不必在XML文件中设置它。谢谢。

1个回答

25

参考这个很棒的答案: https://dev59.com/NGoy5IYBdhLWcg3wkO-h#13241629

R.* 引用被显式地用于访问资源。你想做的事情实际上不太可能,但也许你可以使用上面答案中的以下部分:

保留XML android:id 以供代码使用

如果你的 ViewGroup 不能通过 XML 定义(或者你不想这样做),你可以通过 XML 保留 id 来确保它保持唯一性:

这里,values/ids.xml 定义了一个自定义的 id

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="reservedNamedId" type="id"/>
</resources>

然后,一旦创建了ViewGroup或View,您可以附加自定义id。
myViewGroup.setId(R.id.reservedNamedId);

1
我认为问题的提问者明确表示不想使用XML文件来创建R.id.some_id,请问该如何在程序中动态地创建它呢? - RvdK
@RvdK 没错。我明白这一点,但我指望原帖作者阅读我发布的链接以理解 R.* 明确是用于资源的。我发布的部分仅是一个参考解决方案,尽可能接近所需的内容。 - burmat
我的观点是,如果可以使用v.setId(int id)创建id,那么可能可以在没有XML声明的情况下创建R.*,也可能不行。我已经搜索了这个主题多次,但没有得到令人满意的结果。 - MarTic
2
@user1173536 不可能。把你的资源看作硬编码。你不能动态地创建它们,它们必须是唯一的。你只能引用和使用它们。 - burmat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接