标签:
这两天在写一个柱状图的自定义控件,用的直接继承ViewGroup的方式实现的,我们都知道,这是自定义控件里面最简单的一种了,有时间写个总结分享一下。这里我想说的重点是,在写这个自定义控件的时候遇到了个关于View.setId()小问题,在网上查了好多,有很多回答真是纯属扯淡,最后终于在stackoverflow上找到了零零碎碎的解决方案,stackoverflow真是一个好地方,几乎所有的问题都可以在上面找到解决方案。在此对这个问题整理记录下来,以便参考。
其实这个问题也应该是一个开发者必须提前知道的问题,因为我们在开发中,难免需要在代码中动态的添加View并且为其设置id,这种情况下,我们怎么避免与现有的控件id重复呢?试验后发现,将一个int类型的数直接作为setId()的参数在AndroidStudio里面会报错的,说警告可能更合适些,因为可以运行,而在eclipse中这样用不会提示错误,也没有警告。但别管报错与否,这样是不安全的,存在着控件中id冲突的隐患。
如图:
eclipse下没有报错,也无警告。
AndroidStudio下报错。
重新整理一下问题描述:在AndroidStudio中,用代码动态添加控件时,通过View.setId(int id)为控件添加id时直接赋值一个int类型的参数会“报错”,下面就说说View.setId()的正确使用姿势。
·方案一:通过调用View.generateViewId()作为setId的参数,但此方案不是最佳方案,因为View.generateViewId()方法必须为SDK版本17及以上才行,否则报错。(但也有可以通过自写一个Utils.generateViewId()解决,不过既然有方案二更好的方法,就不过多赘述此方法了)
my_view.setId(View.generateViewId());
·方案二:在res/values/下添加ids.xml(名字可随意)文件,代码如下:
<?xml version="1.0" encoding="utf-8"?> <resources> <item name="my_view" type="id" /> </resources>
然后在代码中做如下设置即可:
my_view.setId(R.id.my_view);
Android开发必知--使用View.setId的正确姿势
标签:
原文地址:http://www.cnblogs.com/codingblock/p/5090441.html