Cómo obtener el contexto MainActivity en la clase CustomView
Sé que es una pregunta simple, pero me falta algo.
Tengo 2 clases: MainActivity y CustomView. Tengo un diseño XML con este CustomView.
Quiero tener acceso a todas mis variables de MainActivity de mi clase de CustomView y también modificarlas, intenté conseguir el contexto pero no trabajó.
- Android Deslizante Vista
- 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
- Dibujar un rectángulo detrás de ImageView personalizado que no anima
- No se puede emitir a la clase ViewPager personalizada
- El elemento de lista (una vista) cambia de orden sin que suceda mientras se desplaza (rápido) en un ListView
Clase MainActivity:
MyCustomView customV; int myVar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.start_page); customV = (MyCustomView) findViewById(R.id.view2); myVar = 5; }
Clase MyCustomView:
public class MyCustomView extends TextView { public MyCustomView(Context context) { super(context); init(); } public MyCustomView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public MyCustomView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } context.myVar = 7 //this is what I'm trying to do...
También intenté getContext que no trabajó. ¿Podrías ayudarme?
- Vista de notificaciones personalizadas
- Pase Android NestedScrollView desplazamientos horizontales a un padre Ver
- Android: cómo crear una instancia de mi vista personalizada con construtor de atributos
- Creación de una vista en forma de calendario con desplazamiento infinito en Android
- Cómo crear un pulldown personalizado en el Honeycomb ActionBar?
- ¿Cómo crear una vista personalizada simple?
- Android onDraw () ejecutándose en todas las vistas?
- SurfaceView personalizado que causa NoSuchMethodException
Al intentar acceder a las variables de su Activity
directamente en su subclase TextView
, introduce un acoplamiento estrecho entre su subclase Actity
y su TextView
personalizado, lo que esencialmente dificulta la reutilización de su TextView
personalizado, ya que sólo puede utilizarse en ese tipo de Activity
, usarlo en otro diseño rompería todo. Básicamente, yo diría que es mal diseño y no recomendaría ese enfoque.
Simplemente puede agregar un método a su TextView
personalizado y usar la variable allí:
public class MyCustomView extends TextView { // your code public void setVariable(int myInt){ //use the int here, either set a member variable //or use directly in the method } }
y en su Activity
customV = (MyCustomView) findViewById(R.id.view2); customV.setVariable(5);
La mejor manera de hacerlo es,
public class MyCustomView extends TextView { private MainActivity mActivity; public void setActivity(MainActivity activity) { mActivity = activity; } public MyCustomView(Context context) { super(context); init(); } public MyCustomView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public MyCustomView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } }
Instantiate,
customView = (MyCustomView) findViewById(R.id.view2); customView.setActivity(this);
Variable de acceso dentro de funciones en MyCustomView
,
mActivity.myVar = 10;
Si no te importa el hecho de que estás estrechamente uniendo tus dos clases, entonces lo único que tienes que hacer es encasillar tu variable de "contexto" a MainActivity. Algo como:
((MainActivity) context).myVar = 5;
trabajará. Pero usted realmente debe considerar un diseño alternativo que sólo suelta parejas de sus clases.
o hacer la variable estática y usarla así.
MainActivity.myVar=7;
o si desea inicializar en la vista personalizada dependen de una variable de la MainActivity y luego hacerlo como en la vista personalizada.
private int myVar; public void init(int myVar) { this.myVar = myVar; invalidate();
en MainActivity.
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.start_page); customV = (MyCustomView) findViewById(R.id.view2); myVar = 5; customV.init(myVar); }
Espero que esto te ayude.