studio programacion herramientas fundamentos crear con avanzado aplicaciones android android-styles

programacion - manual android studio avanzado



Cómo pasar AttributeSet al crear programáticamente en Android (4)

Creo programáticamente como horizontalview entonces, cómo pasar AttributeSet en programmatically.

Mi constructor se ve así:

public HorizontalListView(Context context, AttributeSet attrs) { super(context, attrs); }

He intentado esto:

mHlvSimpleList= new HorizontalListView(mcontext,R.style.niceview);

Error:

El constructor HorizontalListView (Context, int) no está definido

en style.xml

<style name="niceview"> <item name="android:layout_width">wrap_content</item> <item name="android:layout_height">wrap_content</item> </style>

¿Cómo pasar AttributeSet en el parámetro coincidente constructor vista horizontal?


El constructor con Context y AttributeSet se usa cuando su vista se infla desde xml. No debes usarlo para crear objetos. Deberías usar el constructor con Context como param.

AttributeSet es una interfaz y puede crear una instancia de entonces e implementar todos los métodos como se muestra a continuación:

AttributeSet attrs = new AttributeSet(){ @Override public int getAttributeCount() { return 0; } @Override public String getAttributeName(int index) { return null; } @Override public String getAttributeValue(int index) { return null; } @Override public String getAttributeValue(String namespace, String name) { return null; } @Override public String getPositionDescription() { return null; } @Override public int getAttributeNameResource(int index) { return 0; } @Override public int getAttributeListValue(String namespace, String attribute, String[] options, int defaultValue) { return 0; } @Override public boolean getAttributeBooleanValue(String namespace, String attribute, boolean defaultValue) { return false; } @Override public int getAttributeResourceValue(String namespace, String attribute, int defaultValue) { return 0; } @Override public int getAttributeIntValue(String namespace, String attribute, int defaultValue) { return 0; } @Override public int getAttributeUnsignedIntValue(String namespace, String attribute, int defaultValue) { return 0; } @Override public float getAttributeFloatValue(String namespace, String attribute, float defaultValue) { return 0; } @Override public int getAttributeListValue(int index, String[] options, int defaultValue) { return 0; } @Override public boolean getAttributeBooleanValue(int index, boolean defaultValue) { return false; } @Override public int getAttributeResourceValue(int index, int defaultValue) { return 0; } @Override public int getAttributeIntValue(int index, int defaultValue) { return 0; } @Override public int getAttributeUnsignedIntValue(int index, int defaultValue) { return 0; } @Override public float getAttributeFloatValue(int index, float defaultValue) { return 0; } @Override public String getIdAttribute() { return null; } @Override public String getClassAttribute() { return null; } @Override public int getIdAttributeResourceValue(int defaultValue) { return 0; } @Override public int getStyleAttribute() { return 0; } };

Y usalo

TextView textView = new TextView(this, attrs);

Pero no es la manera correcta .

Debe usar métodos de su vista para establecer las propiedades de la vista.

Por ejemplo, para configurar LayoutParams hay dos formas de hacer esto

Primero por el método setLayoutParams()

view.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));

El segundo cuando agregaste tu vista a ViewGroup;

viewGroup.addView(yourView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));

Cuando tiene o desea agregar su vista a, por ejemplo, a RelativeLayout , debe usar LayoutParams relevantes para este ViewGroup. Es RelativeLayout.LayoutParams


Me encontré con esta pregunta mientras trabajaba con una vista que olvidó implementar el SomeView(Context) y solo tenía una con SomeView(Context, AttributeSet) disponible. Desde el código fuente de ViewGroup , parece que SomeView(context) sería equivalente a SomeView(context, null) , sin embargo.


Puede crear un atributo que haga referencia a un estilo personalizado. Entonces deberías poder instanciarlo usando

mHlvSimpleList= new HorizontalListView(mcontext, R.attr.niceview);

Un ejemplo completo está disponible allí https://gist.github.com/romannurik/7026222


Tengo una manera de obtener el AttributeSet de un archivo xml.

XmlPullParser parser = getResources().getXml(R.xml.test); try { parser.next(); parser.nextTag(); } catch (Exception e) { e.printStackTrace(); } AttributeSet attr = Xml.asAttributeSet(parser); int count = attr.getAttributeCount();

Si el valor de conteo es mayor que 0, significa que obtienes un AttributeSet correcto.

mi xml / test.xml es como estos:

<?xml version="1.0" encoding="utf-8"?> <com.galoisli.myapplication.MyListView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/listView" android:scrollbarThumbVertical="@drawable/scrollbar_vertical_thumb" android:layout_centerVertical="true" android:layout_centerHorizontal="true" />