Hice mi componente personalizado sólo poner unos TextViews juntos. Ahora quiero ser capaz de init mi control personalizado directamente desde el código, pasando a los tamaños de texto de forma independiente para cada uno de de TV

Mi atributos de definición:

<resources>
    <declare-styleable name="BasicGauge">
        <attr name="valueTextSize" format="dimension" />
        <attr name="titleTextSize" format="dimension" />
        <attr name="unitsTextSize" format="dimension" />
    </declare-styleable>
</resources>

Ejemplo de inicialización de componente:

<pl.com.digita.BikeComputerUi.customviews.BasicGauge
    android:id="@+id/basicGauge1"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:padding="10dp"
    valueTextSize="40sp">

</pl.com.digita.BikeComputerUi.customviews.BasicGauge>

Cómo yo trato de leer los atributos de componente del constructor:

final int N = typedArray.getIndexCount();
for (int i = 0; i < N; i++) {
    int attribute = typedArray.getIndex(i);
    switch (attribute) {
        case R.styleable.BasicGauge_valueTextSize:
            valueTextSize = typedArray.getString(attribute);
            break;
        case R.styleable.BasicGauge_titleTextSize:
            titleTextSize = typedArray.getString(attribute);
            break;
        case R.styleable.BasicGauge_unitsTextSize:
            unitsTextSize = typedArray.getString(attribute);
            break;
    }
    typedArray.recycle();
}

Problema:
Después de la creación de todos mis valores null. 40sp es exactamente mi valor deseado.

InformationsquelleAutor piotrpo | 2013-05-16

2 Comentarios

  1. 60

    Un par de cosas que decir :

    • primer lugar, necesitamos un nombre xml espacio declaración línea en la parte superior de tu xml, exactamente en la misma manera como lo hace con android xmlns : xmlns:foo=»http://schemas.android.com/apk/res-auto»
    • entonces usted necesita para prefijo valueTextSize con su xmlns : foo:valueTextSize=»40sp»

    Después de eso, no es una muy buena idea para obtener una cadena, android ofrece más potente solución para tratar con dimensiones :

    int unitsTextSize = typedArray.getDimensionPixelSize(R.styleable.BasicGauge_unitsTextSize, textSize);

    luego hay algunos subtilities :

    • para una pintura, o una textpaint, puede que este valor es : paint.setTextSize(unitTextSize):
    • para un textview, el enfoque anterior produciría un error, y usted tiene que utilizar una sobrecarga de setText para obtener el resultado correcto : textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, unitTextSize);

    La diferencia proviene de lo que se llama «píxeles crudos» (sin escala de acuerdo a su densidad, simplemente raw) y la «escala de píxeles» (el opuesto).

    • primero de todo gracias por resolver mi problema. ¿Cuál es la mejor manera de pasar el valor de la dimensión a TextView en el interior de un compuesto de componentes?
    • La forma de hacerlo : el uso de un atributo personalizado, recuperar durante la construcción de los compuestos a ver, a continuación, pasar a las vistas cuando se crea o se inflan.
  2. 24

    Para un poco más de contexto a la aceptación de respuesta:

    attrs.xml

    Establecer el atributo personalizado con el dimensión formato.

    <resources>
        <declare-styleable name="CustomView">
            <attr name="valueTextSize" format="dimension" />
            <attr name="titleTextSize" format="dimension" />
            <attr name="unitsTextSize" format="dimension" />
        </declare-styleable>
    </resources>

    activity.xml

    Hacer referencia a sus atributos con xmlns:app=... y los puso en su xml con app:....

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                    xmlns:app="http://schemas.android.com/apk/res-auto"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">
    
        <com.example.myproject.CustomView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:valueTextSize="40sp"
            app:titleTextSize="20sp"
            app:unitsTextSize="24sp" /> 
    
    </RelativeLayout>

    CustomView.java

    Obtener los valores de la TypedArray utilizando getDimensionPixelSize. Dentro de la vista personalizada trabajar con píxeles. Ver esta respuesta si usted necesita para convertir a una dimensión diferente.

    public class CustomView extends View {
    
        private float mValueTextSize; //pixels
        private float mTitleTextSize; //pixels
        private float mUnitsTextSize; //pixels
    
        public CustomView(Context context, AttributeSet attrs) {
            super(context, attrs);
            TypedArray a = context.getTheme().obtainStyledAttributes(
                    attrs, R.styleable.CustomView, 0, 0);
            try {
                mValueTextSize = a.getDimensionPixelSize(R.styleable.CustomView_valueTextSize, 0);
                mTitleTextSize = a.getDimensionPixelSize(R.styleable.CustomView_titleTextSize, 0);
                mUnitsTextSize = a.getDimensionPixelSize(R.styleable.CustomView_unitsTextSize, 0);
            } finally {
                a.recycle();
            }
        }
    
        //...
    }
    • Puede alguien explicar por qué debemos establecer el valor por defecto a 0 en la llamada a getDimensionPixelSize()?
    • No estoy seguro de por qué me puse a 0. Tienes razón, sin embargo. Sería mejor elegir un más razonable predeterminada. Recuerda hacer la sp a px conversión en tiempo de ejecución, cualquiera sea el valor por defecto que usted elija.

Dejar respuesta

Please enter your comment!
Please enter your name here