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 ?

0voto

Abhinav Atul Points 457

Que diriez-vous d'un rappel de données en direct,

class ProfileView{
    private val _profileViewClicked = MutableLiveData<ProfileView>()
    val profileViewClicked: LiveData<ProfileView> = _profileViewClicked
}

class ProfileActivity{

  override fun onCreateView(...){

    profileViewClicked.observe(viewLifecycleOwner, Observer { 
       activityMethod()
    })
  }

}

0voto

Rajeev Points 68

Créez une fonction d'extension. Et appelez cette fonction d'extension avec votre contexte comme context.getActivity().

fun Context.getActivity(): AppCompatActivity? {
      var currentContext = this
      while (currentContext is ContextWrapper) {
           if (currentContext is AppCompatActivity) {
                return currentContext
           }
           currentContext = currentContext.baseContext
      }
      return null
}

0voto

Manti_Core Points 109

Version de l'extension abrégée Kotlin Android de Theo solution

private fun Context?.getParentActivity() : AppCompatActivity? = when {
    this is ContextWrapper -> if (this is AppCompatActivity) this else this.baseContext.getParentActivity()
    else -> null
}

Utilisation de l'explication ci-dessus aquí

0voto

ACLima Points 21

Une activité est une spécialisation du contexte. Ainsi, si vous disposez d'un contexte, vous savez déjà quelle activité vous avez l'intention d'utiliser et vous pouvez simplement lancer la fonction a en ca est une activité et c est un Contexte.

Activity a = (Activity) c;

7 votes

Ceci est dangereux car, comme mentionné dans un autre commentaire, le contexte n'est pas toujours une activité.

4 votes

Typecast only if(context instanceof Activity){ //typecast}

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