3

Dans une méthode showAlret(String message, Context ctx) d'une classe d'alerte de dialogue, je suis en train de faire une référence à TextView dans le XML de mise en page de la boîte de dialogue:Quand est-ce que la conversion de contexte en activité est autorisée?

TextView tv = (TextView)((MyActivity)ctx).findViewById(R.id.tv_about); 

pas avant d'appeler gonflez() bien sûr:

LayoutInflater li = LayoutInflater.from(ctx); 
View view = li.inflate(R.layout.aboutdialog, null); 

Le problème est que cet appel renvoie tv comme null.

Étant donné que le code se compile sans aucun avertissement, je suppose que cela est dû à la conversion "illégale" de Context vers MyActivity.

J'ai rencontré un certain nombre de cas dans lesquels la conversion de contexte à activité est la seule chose qui fonctionne vraiment, alors pourquoi cela ne fonctionne-t-il pas dans ce cas?

Quand la conversion de contexte en activité est-elle logique? Quelles sont les "règles tacites" à cet égard?

+0

Vous devrez utiliser la méthode tv = showAlret.findViewById() –

+0

@Jaydeep Khamar Qu'entendez-vous par là? 'showAlret()' est le nom d'une méthode dans ma classe, pas un nom de classe. – ef2011

+0

Oh !! Je pensais que c'était le nom de AlertDialog ... désolé pour malentendu. –

Répondre

3
LayoutInflater li = LayoutInflater.from(ctx); 
View view = li.inflate(R.layout.aboutdialog, null); 
TextView tv = view.findViewById(R.id.tv_about); 

Je comprends que votre textview est une partie de la xml de dialogue, vous devez findViewById() sur la vue des dialogues au lieu de l'activité.

+0

vous avez posté la solution 36 secondes avant que je l'ai fait ... :) Accepté + 1. – ef2011

+0

@ ef2011 Merci. erreur stupide. Moi aussi je l'ai fait plus tôt :) – Varun

1

Non ce n'est pas autrement vous auriez une exception. Etes-vous sûr que votre activité hs a chargé TextView à partir de xml au moment où vous essayez de l'obtenir?

+0

En effet, j'ai une exception (c'est comme ça que je suis tombé dessus). Avant de faire l'appel décrit dans la publication, je fais 'callLayoutInflater.inflate()' (voir ci-dessus modifier). Est-ce pas assez? Merci. – ef2011

1

J'ai trouvé la solution. Mon erreur a été que je faisais:

TextView tv = (TextView)((MyActivity)ctx).findViewById(R.id.tv_about); 

Au lieu de:

TextView tv = (TextView)view.findViewById(R.id.tv_about); 
0

D'un côté non, vous pouvez lancer le contexte d'une activité lorsqu'elle est une activité. Le contexte est une classe de base pour l'activité.

Vous ne devez lancer vers une activité que lorsque votre méthode n'est pas disponible dans l'objet Contexte. Casting est juste un moyen de dire au compilateur que vous êtes sûr que c'est une activité, donc le compilateur vous dira ce que vous faites.

Questions connexes