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ó.

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?

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.

  • Vista personalizada de Android Vuelta de memoria de mapa de bits
  • Cómo obtener el índice de una vista particular (personalizada) de ViewGroup (FrameLayout) después de hacer onLongClick en la vista
  • Nueve parches en un grupo de vistas personalizado
  • Creación de CustomViews como un componente modular y reutilizable que se puede utilizar en todos los proyectos
  • Agregar un botón al elemento ExpandableListView Group
  • Desarrollo de Android: los botones reaccionan lentamente
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.