您的位置:首页技术文章
文章详情页

android - 为什么用new方法构造的Activity对象,其中的View成员变量是为空的?

【字号: 日期:2024-09-11 09:33:11浏览:67作者:猪猪

问题描述

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

错误类型是android - 为什么用new方法构造的Activity对象,其中的View成员变量是为空的?

错误提示是指向下面这句android - 为什么用new方法构造的Activity对象,其中的View成员变量是为空的?

然后,调试结果如下android - 为什么用new方法构造的Activity对象,其中的View成员变量是为空的?android - 为什么用new方法构造的Activity对象,其中的View成员变量是为空的?

发现这里的View对象是为空的。然后,我换成发送广播的方式,让MainActivity接收广播,这样是可以的,调试结果如下:android - 为什么用new方法构造的Activity对象,其中的View成员变量是为空的?发现mCityTextView不是空的。

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

问题解答

回答1:

路子有点野。new MainActivity()并没有走Activity的生命周期,比如你都是在onCreate()里初始化控件的,你直接调用select()当然空指针了。

回答2:

Activity, Service, ContentProvider三大组件都不能以new的方式获取实例(“不正常的实例”会更恰当),Activity, Service, BroadcastReceiver, ContentProvider四大组件都存在生命周期,不建议在组件外调用定义的静态变量或方法。

回答3:

不知道你说Activity是不是Android的Activity组件,其中Activity组件在构造的时候需要执行attach方法,传入Context,Window等对象;View为空的原因我猜测是因为没有attach Window对象;Window对象是所有View的容器

回答4:

这并不是你想要的activity。请传递该activity的引用。

回答5:

看代码里面其实你自己在前面已经写出来了getActivity()了,你把获取到的这个Activity强转成MainActivity就好了吧直接new一个Activity是没有走生命周期方法的,并且这也不是你之前的那个MainActivity

回答6:

我这里的问题是因为没有为变量设置static,所以new对象出来,变量会为空,要重新初始化。呃,基本知识没过关。。但还是要感谢各位的解答!!

回答7:

这种情况用接口回调的方式不是更简单吗?