我有一个自定义视图ZoneswitchItem(扩展了linearLayout),该片段在片段布局xml中使用.
从定制视图内部,我需要获取在片段xml中分配给它的ID.所以我用attrs.getIDAttribute();但它返回null而不是预期的ID zone1.
我可以添加自定义属性ZoneswitchItemID,但如果可以使用默认的ID属性,则可以避免这种情况.
片段xml中的用法:
<relativeLayout androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:background="@color/white"> <com.androID.common.ZoneswitchItem androID:ID="@+ID/zone1" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:layout_margintop="@dimen/cardpadding4x" androID:gravity="center_horizontal" app:zoneItemStyle="ArmourFont_headlineBig" /> ...
自定义视图:
public class ZoneswitchItem extends linearLayout { private TextVIEw itemValue; private TextVIEw item@R_502_5979@; public ZoneswitchItem(Context context) { super(context); init(context, null); } public ZoneswitchItem(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs); } public ZoneswitchItem(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context, attrs); } public voID onStart() { EventBus.getDefault().register(this); } public voID onStop() { EventBus.getDefault().unregister(this); } private voID init(final Context context, AttributeSet attrs) { inflate(getContext(), R.layout.zone_switch_item, this); itemValue = findVIEwByID(R.ID.itemValue); item@R_502_5979@ = findVIEwByID(R.ID.item@R_502_5979@); if (attrs != null) { TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ZoneswitchItem, 0, 0); try { if (typedArray.getString(R.styleable.ZoneswitchItem_zoneItemStyle) != null && typedArray.getString(R.styleable.ZoneswitchType_zoneItemImage).equals("ArmourFont_headlineBig")) { itemValue.setTextAppearance(context, R.style.ArmourFont_headlineBig); } } finally { typedArray.recycle(); } } final String ID = attrs.getIDAttribute(); // <<== returns null itemValue.setonClickListener(new VIEw.OnClickListener() { @OverrIDe public voID onClick(VIEw v) { EventBus.getDefault().post(new OnZoneswitchItemClickedEvent(ID)); } }); } public voID setSelected(boolean selected) { float Alpha; if (selected) { Alpha = 1.0f; } else { Alpha = 0.5f; } itemValue.setAlpha(Alpha); item@R_502_5979@.setAlpha(Alpha); }}
解决方法:
documentation for the AttributeSet#getIdAttribute()
method指出:
Return the value of the “ID” attribute or null if there is not one. Equivalent to getAttributeValue(null, “ID”).
the getAttributeValue()
method中的第一个参数是属性的名称空间.这就是问题所在,因为null表示没有命名空间,但是androID:ID属性位于androID前缀代表的命名空间中– http://schemas.androID.com/apk/res/android.
这意味着getIDAttribute()方法将仅返回没有前缀的ID属性的值.那是:
<com.androID.common.ZoneswitchItem ID="@+ID/zone1" ... />
我不确定这个方法有多有用,因为在上面的示例中,它实际上将返回完整的字符串(@ ID / zone1),您仍然必须具有单独的androID:ID属性才能获取VIEw正确分配了ID,AndroID Studio肯定会抱怨该属性缺少名称空间前缀.
想到的第一个解决方案是直接调用getAttributeValue()并传递正确的名称空间.
String ID = attrs.getAttributeValue("http://schemas.androID.com/apk/res/androID", "ID");
但是,这将以字符串形式返回以@开头的整数ID值,因为aapt似乎在处理XML时直接将其替换为XML中的该值.
实际的简单资源名称可以从Resources,其getResourceEntryname()方法和VIEw的getID()方法获得,因为ID将在超级调用期间在VIEw的构造函数中设置.例如:
String ID = getResources().getResourceEntryname(getID());
总结 以上是内存溢出为你收集整理的android-获取自定义视图的xml ID全部内容,希望文章能够帮你解决android-获取自定义视图的xml ID所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)