Cómo obtener actividad desde el contexto en android

Éste me tiene desconcertado.

Necesito llamar a un método de actividad desde dentro de una clase de diseño personalizado. El problema con esto es que no sé cómo acceder a la actividad desde el diseño.

ProfileView

public class ProfileView extends LinearLayout { TextView profileTitleTextView; ImageView profileScreenImageButton; boolean isEmpty; ProfileData data; String name; public ProfileView(Context context, AttributeSet attrs, String name, final ProfileData profileData) { super(context, attrs); ...... ...... } //Heres where things get complicated public void onClick(View v) { //Need to get the parent activity and call its method. ProfileActivity x = (ProfileActivity) context; x.activityMethod(); } } 

PerfilActividad

 public class ProfileActivityActivity extends Activity { //In here I am creating multiple ProfileViews and adding them to the activity dynamically. public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.profile_activity_main); } public void addProfilesToThisView() { ProfileData tempPd = new tempPd(.....) Context actvitiyContext = this.getApplicationContext(); //Profile view needs context, null, name and a profileData ProfileView pv = new ProfileView(actvitiyContext, null, temp, tempPd); profileLayout.addView(pv); } } 

Como se puede ver arriba, estoy instanciando el profileView programatically y pasando el activityContext con él. 2 preguntas:

  1. ¿Estoy pasando el contexto correcto a Profileview?
  2. ¿Cómo puedo obtener la actividad que contiene desde el contexto?

    7 Solutions collect form web for “Cómo obtener actividad desde el contexto en android”

    De su Activity , simplemente pasar en this como el Context para su diseño:

     ProfileView pv = new ProfileView(this, null, temp, tempPd); 

    Después tendrás un Context en el diseño, pero sabrás que es realmente tu Activity y puedes lanzarlo para que tengas lo que necesitas:

     Activity activity = (Activity) context; 
    1. No
    2. No puedes

    Hay dos contextos diferentes en Android. Uno para su aplicación (llamémosla BIG uno) y uno para cada vista (llamémosla el contexto de la actividad).

    Un linearLayout es una vista, por lo que debe llamar al contexto de la actividad. Para llamarla de una actividad, simplemente llame a "this". ¿Tan fácil no es?

    Cuando usas

     this.getApplicationContext(); 

    Llamas al contexto BIG, el que describe tu aplicación y no puedes administrar tu vista.

    Un gran problema con Android es que un contexto no puede llamar a su actividad. Eso es un gran problema para evitar esto cuando alguien comienza con el desarrollo de Android. Debes encontrar una mejor manera de codificar tu clase (o reemplazar "Contexto contextual" por "Actividad actividad" y arrojarla a "Contexto" cuando sea necesario).

    Saludos.


    Sólo para actualizar mi respuesta. La forma más fácil de obtener su Activity context es definir una instancia static en su Activity . Por ejemplo

     public class DummyActivity extends Activity { public static DummyActivity instance = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Do some operations here } @Override public void onResume() { super.onResume(); instance = this; } @Override public void onPause() { super.onPause(); instance = null; } } 

    Y luego, en su Task , Dialog , View , puede usar ese tipo de código para obtener su Activity context :

     if (DummyActivity.instance != null) { // Do your operations with DummyActivity.instance } 

    Si desea llamar a un método de actividad desde dentro de una clase de diseño personalizado (clase sin actividad). Debe crear un delegado mediante la interfaz.

    No se ha probado y lo codifiqué correctamente. Pero estoy transmitiendo una manera de lograr lo que quieres.

    En primer lugar crear e interfaz

     interface TaskCompleteListener<T> { public void onProfileClicked(T result); } public class ProfileView extends LinearLayout { private TaskCompleteListener<String> callback; TextView profileTitleTextView; ImageView profileScreenImageButton; boolean isEmpty; ProfileData data; String name; public ProfileView(Context context, AttributeSet attrs, String name, final ProfileData profileData) { super(context, attrs); ...... ...... } public setCallBack( TaskCompleteListener<String> cb) { this.callback = cb; } //Heres where things get complicated public void onClick(View v) { callback.onProfileClicked("Pass your result or any type"); } } 

    Y aplicar esto a cualquier actividad.

    Y lo llaman como

     ProfileView pv = new ProfileView(actvitiyContext, null, temp, tempPd); pv.setCallBack(new TaskCompleteListener { public void onProfileClicked(String resultStringFromProfileView){} }); 

    El contexto puede ser una aplicación, un servicio, una actividad y más.

    Normalmente, el contexto de las vistas de una actividad es la actividad en sí, por lo que puede pensar que sólo puede emitir este contexto a la actividad, pero en realidad no siempre se puede hacer, porque el contexto también puede ser un ContextThemeWrapper en este caso.

    ContextThemeWrapper se utiliza mucho en las versiones recientes de AppCompat y Android (gracias al atributo android: theme en layouts) por lo que personalmente nunca realizaría este reparto.

    Tan breve respuesta es: no se puede recuperar de forma fiable una actividad de un contexto en una vista. Pase la actividad a la vista llamando a un método en ella que toma el parámetro Actividad como.

    He utilizado convert Actividad

     Activity activity = (Activity) context; 

    Nunca use getApplicationContext () con vistas.

    Siempre debe ser el contexto de la actividad, ya que la vista está unida a la actividad. Además, es posible que tenga un conjunto de temas personalizado y, al utilizar el contexto de la aplicación, todos los temas se perderán. Lea más sobre diferentes versiones de contextos aquí .

    Una Actividad es una especialización de Contexto así que si tienes un Contexto ya sabes qué actividad quieres utilizar y simplemente puedes lanzar un en c ; Donde a es una Actividad yc es un Contexto.

     Activity a = (Activity) c; 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.