Android: cómo crear una instancia de mi vista personalizada con construtor de atributos

Mi vista personalizada tiene un atributo dinámico personalizado, por ejemplo, el atributo backgroundimage, asignado a través de la semana actual. Quiero usar construtor CalendarView (Context context, AttributeSet attrs) para pasar varios atributos, y trato de instanciar el conjunto de atributos con Xml.asAttributeSet, pero no puede funcionar. Alguien puede decirme cómo hacerlo.

Nota: mi vista personalizada tiene atributo dinámico, por lo que no quiero crear una instancia de la vista personalizada a través del diseño xml. Mi solución es incorrecta?

Aquí está la vista personalizada:

public class CalendarView extends View { int backgroundImage; public CalendarView(Context context, AttributeSet attrs) { super(context, attrs); backgroundImage = attrs.getAttributeResourceValue("http://www.mynamespace.com", "backgroundimage", 0); } } 

Aquí está la actividad:

 public class TestActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(createTestView(0)); } public CalendarView createTestView(int currentWeek) throws XmlPullParserException, IOException { String attributes = "<attribute xmlns:android=\"http://schemas.android.com/apk/res/android\" " + "xmlns:test=\"http://www.mynamespace.com\" " + "android:layout_width=\"fill_parent\" android:layout_height=\"30\" " + "test:backgroundimage=\"@drawable/"+ currentWeek +"_bg" + "\"/>"; XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); factory.setNamespaceAware(true); XmlPullParser parser = factory.newPullParser(); parser.setInput(new StringReader(attributes)); parser.next(); AttributeSet attrs = Xml.asAttributeSet(parser); return new CalendarView(this,attrs); } } 

Debe declarar el atributo como estilo en el archivo attr.xml ubicado en valores

por ejemplo:

 <declare-styleable name="yourView"> <attr name="aAttr" format="dimension" /> <attr name="bAttr" format="dimension" /> > 

Después de que usted tiene que utilizarlos como esto en su opinión de encargo, y usted debe declarar ambos constructores del defecto:

  public CalendarView(Context context) { super(context); } public CalendarView(Context context, AttributeSet attrs) { super(context, attrs); backgroundImage = attrs.getAttributeResourceValue("http://www.mynamespace.com", "backgroundimage", 0); int typefaceIndex = attrs.getAttributeIntValue("http://schemas.android.com/apk/res/android", "typeface", 0); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.yourView); } 

Esto debería funcionar, para obtener parámetros para su vista personalizada. Siéntase libre de preguntar si no entiende.

El tipoFaceindex es sólo un ejemplo que funciona.

Después de que usted tiene que utilizar su customView en el diseño como cualquier otro esto:

 <com.example.yourView> </com.example.yourView> 

Tal vez no entiendo lo que está haciendo o por qué lo está haciendo, pero creo que su intento con el AttributeSet bastante complicado.

Te sugiero que crees otro constructor como este

 public CalendarView(Context context, int backgroundRessourceID) { super(context); setBackgroundResource(backgroundRessourceID); } 

Y luego instancia de su CalendarView como este

 CalendarView cv = new CalendarView(this, R.drawable.0_bg); cv.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 30)); 

Esperemos que esto solucionó su problema …

  • ¿Cómo crear una vista personalizada simple?
  • Android onDraw () ejecutándose en todas las vistas?
  • Android Deslizante Vista
  • Vista personalizada de Android Vuelta de memoria de mapa de bits
  • Agregar un botón al elemento ExpandableListView Group
  • No se puede emitir a la clase ViewPager personalizada
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.