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" />