Sobes.tech
Middle

Чӣ гуна ба тамошои фармоишӣ дар Android хусусиятҳои фармоишӣ илова кардан мумкин аст؟

sobes.tech AI

Ҷавоб аз AI

  1. Тафтиши атрибутҳо дар attrs.xml: Файл res/values/attrs.xml (ё ба файли мавҷуда илова кардан) эҷод мешавад. Дар он <declare-styleable> бо номи View-и махсуси худ муайян карда мешавад ва <attr> барои ҳар як атрибути истифодашаванда рӯйхат мешавад, ки формати онҳо (format) нишон дода мешавад.

    <?xml version="1.0" encoding="utf-8"?>  
    <resources>  
        <declare-styleable name="MyCustomView">  
            <attr name="customText" format="string"/>  
            <attr name="customColor" format="color"/>  
            <attr name="customEnabled" format="boolean"/>  
        </declare-styleable>  
    </resources>  
    
  2. Истифодаи атрибутҳо дар XML: Дар лоиҳаи XML, ки дар он View-и махсус истифода мешавад, атрибутҳои муайяншуда бо истифода аз фазои номҳои app илова карда мешаванд.

    <com.example.MyCustomView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        xmlns:app="http://schemas.android.com/apk/res-auto"  
        app:customText="Hello Custom View"  
        app:customColor="@color/colorPrimary"  
        app:customEnabled="true"/>  
    
  3. Хондани атрибутҳо дар коди View: Дар конструктори View-и махсус (одатан дар он, ки Context ва AttributeSet мегирад), аз классҳои TypedArray ва obtainStyledAttributes барои хондани арзишҳои атрибутҳо, ки дар XML нишон дода шудаанд, истифода мешавад.

    class MyCustomView @JvmOverloads constructor(  
        context: Context,  
        attrs: AttributeSet? = null,  
        defStyleAttr: Int = 0  
    ) : View(context, attrs, defStyleAttr) {  
    
        // Мисолҳо барои нигоҳ доштани арзишҳои атрибутҳо
        private var customText: String? = null  
        private var customColor: Int = 0  
        private var customEnabled: Boolean = false  
    
        init {  
            // Гирифтани TypedArray бо атрибутҳо
            val typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView, defStyleAttr, 0)  
    
            try {  
                // Хондани арзишҳои атрибутҳо
                customText = typedArray.getString(R.styleable.MyCustomView_customText)  
                customColor = typedArray.getColor(R.styleable.MyCustomView_customColor, 0) // Арзиши пешфарз
                customEnabled = typedArray.getBoolean(R.styleable.MyCustomView_customEnabled, false) // Арзиши пешфарз
    
                // Ҳоло метавонед customText, customColor ва customEnabled-ро барои танзим кардани View истифода баред
                // Масалан:
                // if (customEnabled) { /* ... */ }
    
            } finally {  
                // Муҳим! Рециклинг кардани TypedArray барои озод кардани захираҳо
                typedArray.recycle()  
            }  
        }  
    
        // ... дигар логикаи View ...  
    }  
    

Методи obtainStyledAttributes TypedArray-ро бармегардонад, ки аз он метавон арзишҳои атрибутҳоро бароварда, истифода кард. Пас аз истифода, бояд recycle()-ро барои озод кардани захираҳо фаро гирифт.