Как вы получаете значения тегов «android:» в пользовательском представлении

#android #android-layout #android-custom-view

#Android #android-layout #android-custom-view

Вопрос:

Кажется, существует множество «похожих» вопросов и ответов на это, разбросанных по всему, которые все относятся к тому, как получить пользовательский атрибут из AttributeSet . До сих пор я не смог найти, как получить android: тег пространства имен:

     <com.custom.view.StatusThumbnail
        android:id="@ id/statusThumbnailContainer"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:layout_weight="1"/>
  

Я хотел бы вернуть layout_height атрибут из этого пользовательского компонента. К сожалению, из того, что я прочитал, я ближе всего к тому, как это сделать:

 public StatusThumbnail(Context context, AttributeSet attrs) {
    super(context, attrs);

    String height = attrs.getAttributeValue("android", "layout_height");
  

Но это возвращается null .

Конечно, это не редкость, что нужно попробовать и сделать?

Ответ №1:

Пространство имен должно быть « http://schemas.android.com/apk/res/android » android — это псевдоним, объявленный в вашем XML-файле

Комментарии:

1. Как насчет случая, когда нам нужно несколько пространств имен в одном XML-файле. Например, я создал пользовательское представление, а также некоторые новые атрибуты для этого пользовательского представления. Теперь я хочу установить атрибуты, используя мои собственные определенные и предопределенные для Android атрибуты. в таком случае ваш подход по-прежнему возвращает null. похоже, я не могу получить доступ к предопределенным атрибутам Android. Как я могу разрешить такой случай?

2. Превосходно! наконец-то это сработало : attrs.getAttributeIntValue("http://schemas.android.com/apk/res/android", "maxLength", 100)

3. Спасибо! Это сработало для меня!

Ответ №2:

Сначала объявите обязательные атрибуты в :

resattrs.xml

     <declare-styleable name="StatusThumbnail">
        <attr name="statusThumbnailattr" format="string"/>
    </declare-styleable>
  

затем в вашем объявлении XML-макета используйте тот же атрибут

 <com.custom.view.StatusThumbnail
        android:id="@ id/statusThumbnailContainer"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        statusThumbnailattr="some value"
        android:layout_weight="1"/>
  

Доступ с помощью

 public StatusThumbnail(Context context, AttributeSet attrs) {
    super(context, attrs);
TypedArray a=context.obtainStyledAttributes(attrs,R.styleable.StatusThumbnail);
this.mdColorDialogTitle=a.getString(R.styleable.StatusThumbnail_statusThumbnailattr);
}
  

Комментарии:

1. В частности, не нужны пользовательские теги — как указано в вопросе. Слишком много загрязнений по этому вопросу из-за подобных ответов.

2. Я пытался объяснить вам дополнительную реализацию, в любом случае, если вы хотите проголосовать, я не возражаю.

3. Не забудьте сделать try { ... } finally { a.recycle(); } , как описано в TypedArray