194 votes

Obtenir une activité à partir d'un contexte dans Android

Celui-ci me laisse perplexe.

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

ProfilView

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

ProfilActivité

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, j'instancie le profileView de manière programmatique et je passe le ActivityContext avec lui. 2 questions :

  1. Est-ce que je passe le bon contexte dans le Profileview ?
  2. Comment obtenir l'activité contenue dans le contexte ?

6voto

BladeCoder Points 679

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 en fait vous ne pouvez pas toujours le faire, car le contexte peut également être un ContextThemeWrapper dans ce cas.

ContextThemeWrapper est fortement utilisé dans les versions récentes d'AppCompat et d'Android (grâce à l'attribut Android:theme dans les layouts) donc je n'effectuerais personnellement jamais ce cast.

En bref, la réponse est la suivante : vous ne pouvez pas récupérer de manière fiable une activité à partir d'un contexte dans une vue. Passez l'activité à la vue en appelant une méthode qui prend l'activité comme paramètre.

3voto

lomza Points 1763

Ne jamais utiliser getApplicationContext() avec des vues.

Il doit toujours s'agir du contexte de l'activité, car la vue est attachée à l'activité. En outre, il se peut que vous ayez un thème personnalisé, et si vous utilisez le contexte de l'application, tous les thèmes seront perdus. En savoir plus sur les différentes versions des contextes aquí .

2voto

Samuel Ivan Points 1202

J'ai utilisé la conversion de l'activité

Activity activity = (Activity) context;

1voto

hasan Points 1

Pour l'utilisateur de kotlin -

val activity = context as Activity

0voto

Taslim Points 1085

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 vous aidera Joyeux codage !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X