android - 为什么用new方法构造的Activity对象,其中的View成员变量是为空的?
巴扎黑
巴扎黑 2017-04-17 17:24:36
0
7
609

正如标题所言,View成员变量已经在Activity的onCreate方法中,通过findViewById方法初始化了。但在另一个类中,用通过new方法构造的Activity对象来执行封装好的公有方法时,发现其中的View成员变量是空的。具体代码如下(new MainActivity().select(selectCity)这句调用Activity的方法):

错误类型是

错误提示是指向下面这句

然后,调试结果如下

发现这里的View对象是为空的。然后,我换成发送广播的方式,让MainActivity接收广播,这样是可以的,调试结果如下:

发现mCityTextView不是空的。

对比上面的情况,我觉得通过findViewById方法初始化的View对象,只属于Activity这个类本身,所以由它使用是没问题的。但是通过new方法构造的Activity对象,得到的是没有初始化的View对象。所以究竟是怎么回事呢???

巴扎黑
巴扎黑

répondre à tous(7)
刘奇

La route est un peu sauvage. new MainActivity() ne suit pas le cycle de vie de l'activité. Par exemple, si vous initialisez le contrôle dans onCreate(), si vous appelez directement select(), ce sera bien sûr un pointeur nul.

伊谢尔伦

Activity, Service et ContentProvider ne peuvent pas obtenir d'instances dans la nouvelle méthode ("des instances anormales" seraient plus appropriées). Activity, Service, BroadcastReceiver et ContentProvider ont tous des cycles de vie. Il n'est pas recommandé de les ajouter au composant. . Variables statiques ou méthodes définies par des appels externes.

伊谢尔伦

Je ne sais pas si vous avez dit que Activity est le composant Activity d'Android. Lors de la construction du composant Activity, vous devez exécuter la méthode d'attachement et transmettre des objets tels que Context, Window, etc. est vide, c'est parce qu'il n'y a pas d'objet Window attaché ;
L'objet Window est le conteneur de toutes les vues

PHPzhong

Ce n'est pas l'activité que vous souhaitez.
Veuillez transmettre une référence à l'activité.

巴扎黑

En regardant le code, vous avez déjà écrit getActivity() vous-même. Convertissez simplement l'activité obtenue en MainActivity
Il n'y a pas de méthode de cycle de vie pour créer directement une activité. Et ce n'est pas votre MainActivity précédente

阿神

Mon problème ici est que static n'est pas défini pour la variable, donc lorsque le nouvel objet sortira, la variable sera vide et devra être réinitialisée. Euh, je n'ai pas réussi les connaissances de base. . Mais je tiens quand même à vous remercier pour vos réponses ! !

黄舟

Ne serait-il pas plus simple d'utiliser le rappel d'interface dans ce cas ?

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal