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?
- Nueve parches en un grupo de vistas personalizado
- Vista de notificaciones personalizadas
- Desarrollo de Android: los botones reaccionan lentamente
- Creación de una vista en forma de calendario con desplazamiento infinito en Android
- Dibujar un rectángulo detrás de ImageView personalizado que no anima
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); } }
- SurfaceView personalizado que causa NoSuchMethodException
- Pase Android NestedScrollView desplazamientos horizontales a un padre Ver
- El elemento de lista (una vista) cambia de orden sin que suceda mientras se desplaza (rápido) en un ListView
- Creación de CustomViews como un componente modular y reutilizable que se puede utilizar en todos los proyectos
- Cómo crear un pulldown personalizado en el Honeycomb ActionBar?
- Android: cambiar el tamaño de vistas personalizadas. Se cambia el tamaño del padre, pero los cambios de ancho / altura no se transmiten a la vista secundaria
- Cómo obtener el índice de una vista particular (personalizada) de ViewGroup (FrameLayout) después de hacer onLongClick en la vista
- Cómo obtener el contexto MainActivity en la clase CustomView
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 …
- Permitir que sólo mis aplicaciones Android ejecuten api de punto final en java
- TestUI (Jenkins) utilizando espresso