developer tip

형식 속성 값 'android : drawable'이 유효하지 않습니다.

copycodes 2020. 11. 29. 11:52
반응형

형식 속성 값 'android : drawable'이 유효하지 않습니다.


내 버튼에 사용자 지정 속성을 만들려고하는데 속성 선언에서 이미지에 어떤 형식을 사용해야하는지 모르겠습니다.

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="TCButton">
        <attr name="Text" format="string"/>
        <attr name="BackgroundImage" format="android:drawable"  />
    </declare-styleable>


</resources>

error is in the format = "android : drawable"...


당신이 사용할 수있는 형식 = "정수"자원 ID 드로어 블, 그리고 AttributeSet.getDrawable (를 ...) .

여기에 예가 있습니다.

res / values ​​/ attrs.xml에서 속성을 정수로 선언합니다.

<resources>
    <declare-styleable name="MyLayout">
        <attr name="icon" format="integer" />
    </declare-styleable>
</resources>

레이아웃에서 속성을 드로어 블 ID로 설정합니다.

<se.jog.MyLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    myapp:icon="@drawable/myImage"
/>

사용자 정의 위젯 구성 요소 클래스의 속성에서 드로어 블을 가져옵니다.

ImageView myIcon;
//...
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyLayout);
Drawable drawable = a.getDrawable(R.styleable.MyLayout_icon);
if (drawable != null)
    myIcon.setBackgroundDrawable(drawable);

가능한 모든 옵션을 보려면 여기 에서 android src를 확인 하십시오.


나는 그것을 간단한 참조로 사용하는 것이 더 나을 것이라고 생각합니다.

<declare-styleable name="TCButton">
        <attr name="customText" format="string"/>
        <attr name="backgroundImage" format="reference"  />
</declare-styleable>

그리고 다음과 같이 xml에 설정하십시오.

<your.package.name.TCButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    custom:customText="Some custom text"
    custom:backgroundImage="@drawable/myImage"
/>

그리고 클래스에서 다음과 같은 속성을 설정하십시오.

public TCButton(Context context, AttributeSet attrs) {
    super(context, attrs);
    TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MembershipItemView, 0, 0);

    String customText;
    Drawable backgroundImage;
    try {
        customText = a.getString(R.styleable.TCButton_customText);
        backgroundImage = a.getDrawable(R.styleable.TCButton_backgroundImage);
    } finally {
        a.recycle();
    }

    if(!TextUtils.isEmpty(customText)) {
      ((TextView)findViewById(R.id.yourTextView)).setText(customText);
    }

    if(null != backgroundImage) {                    
        ((ImageView)findViewById(R.id.yourImageView)).setBackgroundDrawable(backgroundImage);
    }
}

PS: Don't forget to add this line for the root element of the layout you are using your custom view in

xmlns:custom="http://schemas.android.com/apk/res-auto"

If you don't set this, you won't be able to access your custom attributes.


From AOSP code, I found how google engineers declare ImageView#src attr.

<declare-styleable name="ImageView">
    <attr name="src" format="reference|color" />
    <attr name="scaleType">
        <enum name="matrix" value="0" />
        <enum name="fitXY" value="1" />
        <enum name="fitStart" value="2" />
        <enum name="fitCenter" value="3" />
        <enum name="fitEnd" value="4" />
        <enum name="center" value="5" />
        <enum name="centerCrop" value="6" />
        <enum name="centerInside" value="7" />
    </attr>
    <attr name="adjustViewBounds" format="boolean" />
    <attr name="maxWidth" format="dimension" />
    <attr name="maxHeight" format="dimension" />
    <attr name="tint" format="color" />
    <attr name="baselineAlignBottom" format="boolean" />
    <attr name="cropToPadding" format="boolean" />
    <attr name="baseline" format="dimension" />
    <attr name="drawableAlpha" format="integer" />
    <attr name="tintMode" />
</declare-styleable>

Above code is a sample and it can cover most case in our development.

참고URL : https://stackoverflow.com/questions/3487247/format-attribute-value-androiddrawable-not-valid

반응형