J'ai créé une vue personnalisée et il faut Référence d'activité pour effectuer certaines opérations liées au gestionnaire. J'ai une idée sur getContext () est un moyen d'obtenir du contexte mais existe-t-il un moyen d'obtenir une référence d'activité pour le même?
Cela devrait être correct de simplement transtyper le contexte en Activité:
MyActivity myActivity = (MyActivity) getContext();
La conversion de getContext () en activité (par exemple (Activité) getContext ();) peut ne pas toujours renvoyer un objet d'activité si votre vue n'est pas appelée à partir d'un contexte d'activité.
Donc pour ça,
public Activity getActivity() {
Context context = getContext();
while (context instanceof ContextWrapper) {
if (context instanceof Activity) {
return (Activity)context;
}
context = ((ContextWrapper)context).getBaseContext();
}
return null;
}
"while" est utilisé pour bouger dans tout le contexte de base, jusqu'à ce que l'activité soit trouvée, ou pour quitter la boucle lorsque le contexte racine est trouvé. Parce que le contexte racine aura un baseContext nul, menant à la fin de la boucle.
Passer le contexte dans la classe Constructor of View comme ceci
Voir la classe
public class DrawView extends View {
Context actContext;
public DrawView(Context context) {
super(context);
actContext=context;
}
}
et dans votre classe d'activité
DrawView drawView=new DrawView(this);
Vous pouvez obtenir votre référence d'activité en envoyant le contexte de votre activité dans le constructeur de votre gestionnaire lors de la définition de ses objets. La définition du constructeur dans la classe de gestionnaire est définie ci-dessous:
private Context mContext;
public MyHandler(Context context) {
mContext=context;
}
et dans votre classe d’activité principale, vous pouvez créer son objet comme suit:
MyHandler ca=new MyHandler(MainActivity.this);
Je suggère de travailler avec «l'activité» au lieu d'utiliser le «contexte» (avoir une activité à partir d'un contexte n'est pas toujours possible alors que l'inverse n'a pas de problème).
Dans votre classe personnelle, demandez simplement l’activité dans son constructeur en tant que paramètre obligatoire => public void constructorOfTheClass (Activité d’activité) {...}.
Lorsque vous appelez le constructeur dans votre activité, indiquez simplement ce paramètre et vous pourrez le manipuler directement dans la classe.