正如标题所言,View成员变量已经在Activity的onCreate方法中,通过findViewById方法初始化了。但在另一个类中,用通过new方法构造的Activity对象来执行封装好的公有方法时,发现其中的View成员变量是空的。具体代码如下(new MainActivity().select(selectCity)
这句调用Activity的方法):
错误类型是
错误提示是指向下面这句
然后,调试结果如下
发现这里的View对象是为空的。然后,我换成发送广播的方式,让MainActivity接收广播,这样是可以的,调试结果如下:
发现mCityTextView不是空的。
对比上面的情况,我觉得通过findViewById方法初始化的View对象,只属于Activity这个类本身,所以由它使用是没问题的。但是通过new方法构造的Activity对象,得到的是没有初始化的View对象。所以究竟是怎么回事呢???
怪我咯2017-04-17 17:26:36
길이 좀 험해요. new MainActivity()는 Activity 수명 주기를 따르지 않습니다. 예를 들어 onCreate()에서 컨트롤을 초기화하는 경우 select()를 직접 호출하면 당연히 null 포인터가 됩니다.
伊谢尔伦2017-04-17 17:26:36
Activity, Service 및 ContentProvider는 새 메서드에서 인스턴스를 얻을 수 없습니다("비정상적인 인스턴스"가 더 적절함). Activity, Service, BroadcastReceiver 및 ContentProvider는 모두 수명 주기를 가지므로 구성 요소에서 사용하지 않는 것이 좋습니다. 외부 호출에 의해 정의된 정적 변수 또는 메서드.
伊谢尔伦2017-04-17 17:26:36
Activity가 Android의 Activity 구성 요소라고 말씀하셨는지 모르겠습니다. Activity 구성 요소를 구성할 때 연결 메서드를 실행하고 Context, Window 등과 같은 개체를 전달해야 하는 이유가 무엇인지 추측합니다. 비어 있는 것은 첨부된 Window 객체가 없기 때문입니다.
Window 객체는 모든 뷰의 컨테이너입니다
巴扎黑2017-04-17 17:26:36
코드를 보면 이미 getActivity()를 작성했습니다. 획득한 Activity를 MainActivity로 변환하면 됩니다.
Activity를 직접 생성하는 라이프사이클 방법은 없습니다
阿神2017-04-17 17:26:36
여기서 문제는 변수에 static이 설정되지 않았기 때문에 새 개체가 나오면 변수가 비어 있어 다시 초기화해야 한다는 것입니다. 아, 기초지식을 통과하지 못했어요. . 하지만 여전히 귀하의 답변에 감사드립니다! !