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