Obtenir de l’activité du contexte dans Android

Celui-ci m’a déconcerté.

Je dois appeler une méthode d’activité à partir d’une classe de présentation personnalisée. Le problème est que je ne sais pas comment accéder à l’activité depuis la mise en page.

ProfileView

public class ProfileView extends LinearLayout { TextView profileTitleTextView; ImageView profileScreenImageButton; boolean isEmpty; ProfileData data; Ssortingng name; public ProfileView(Context context, AtsortingbuteSet attrs, Ssortingng 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(); } } 

ProfileActivity

 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); } } 

Comme vous pouvez le voir ci-dessus, je suis en train d’instancier le profileView et de le transmettre à activityContext. 2 questions:

  1. Est-ce que je passe le bon contexte dans la vue de profil?
  2. Comment puis-je obtenir l’activité contenant du contexte?

Dans votre Activity , transmettez simplement this comme Context de votre mise en page:

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

Ensuite, vous aurez un Context dans la mise en page, mais vous saurez que c’est en fait votre Activity et que vous pouvez la lancer pour que vous ayez ce dont vous avez besoin:

 Activity activity = (Activity) context; 
  1. Non
  2. Vous ne pouvez pas

Il existe deux contextes différents dans Android. Un pour votre application (appelons-le le GRAND) et un pour chaque vue (appelons-le le contexte d’activité).

Un linearLayout est une vue, vous devez donc appeler le contexte d’activité. Pour l’appeler d’une activité, appelez simplement “this”. Tellement facile n’est ce pas?

Lorsque vous utilisez

 this.getApplicationContext(); 

Vous appelez le contexte BIG, celui qui décrit votre application et ne peut pas gérer votre vue.

Un gros problème avec Android est qu’un contexte ne peut pas appeler votre activité. C’est un gros problème pour éviter cela lorsque quelqu’un commence avec le développement Android. Vous devez trouver un meilleur moyen de coder votre classe (ou remplacer “Contexte contextuel” par “Activité” et le convertir en “Contexte” si nécessaire).

Cordialement.


Juste pour mettre à jour ma réponse. La manière la plus simple d’obtenir votre Activity context consiste à définir une instance static dans votre Activity . Par exemple

 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; } } 

Et puis, dans votre Task , Dialog , View , vous pouvez utiliser ce type de code pour obtenir votre Activity context :

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

C’est quelque chose que j’ai utilisé avec succès pour convertir le Context en Activity lors de l’utilisation de l’interface utilisateur sous forme de fragments ou de vues personnalisées. Il décompressera ContextWrapper de manière récursive ou retournera null s’il échoue.

 public Activity getActivity(Context context) { if (context == null) { return null; } else if (context instanceof ContextWrapper) { if (context instanceof Activity) { return (Activity) context; } else { return getActivity(((ContextWrapper) context).getBaseContext()); } } return null; } 

Si vous souhaitez appeler une méthode d’activité depuis une classe de mise en page personnalisée (classe non-activité), vous devez créer un délégué à l’aide de l’interface.

Ce n’est pas testé et je l’ai codé correctement. mais je transmets un moyen de réaliser ce que vous voulez.

Tout d’abord créer et interface

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

Et implémentez ceci dans n’importe quelle activité.

et l’appeler comme

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

Le contexte peut être une application, un service, une activité, etc.

Normalement, le contexte des vues dans une activité est l’activité elle-même. Vous pouvez donc penser que vous pouvez simplement convertir ce contexte en activité, mais vous ne pouvez pas toujours le faire, car le contexte peut également être un contexte contextuel dans ce cas.

ContextThemeWrapper est largement utilisé dans les versions récentes d’AppCompat et d’Android (grâce à l’atsortingbut Android: theme dans les mises en page).

La réponse est si courte: vous ne pouvez pas récupérer de manière fiable une activité à partir d’un contexte dans une vue. Transmettez l’activité à la vue en appelant une méthode qui prend l’activité comme paramètre.

N’utilisez jamais getApplicationContext () avec des vues.

Cela devrait toujours être le contexte de l’activité, car la vue est attachée à l’activité. En outre, vous pouvez avoir un jeu de thèmes personnalisé et, lors de l’utilisation du contexte de l’application, tous les thèmes seront perdus. En savoir plus sur les différentes versions des contextes ici .

Cette méthode devrait être utile ..!

 public Activity getActivityByContext(Context context){ if(context == null){ return null; } else if((context instanceof ContextWrapper) && (context instanceof Activity)){ return (Activity) context; } else if(context instanceof ContextWrapper){ return getActivity(((ContextWrapper) context).getBaseContext()); } return null; } 

J’espère que cela aide .. Joyeux codage!

une activité est une spécialisation du contexte. Par conséquent, si vous avez un contexte, vous savez déjà quelle activité vous souhaitez utiliser et pouvez simplement insérer un dans c ; où a est une activité et c un contexte.

 Activity a = (Activity) c; 

J’ai utilisé l’activité de conversion

 Activity activity = (Activity) context;