android-获取自定义视图的xml ID

android-获取自定义视图的xml ID,第1张

概述我有一个自定义视图ZoneSwitchItem(扩展了LinearLayout),该片段在片段布局xml中使用.从定制视图内部,我需要获取在片段xml中分配给它的ID.所以我用attrs.getIdAttribute();但它返回null而不是预期的idzone1.我可以添加自定义属性ZoneSwitchItemId,但如果可以使用默认的id属性,则

我有一个自定义视图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/androi‌d.

这意味着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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1081057.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存