우선 : 예,이 주제에 대한 다른 모든 스레드를 읽습니다. 그리고이 사이트의 사람들뿐만 아니라 … (알다시피 조금 실망합니다)
그들 대부분은 XML 파일 android:id
대신 사용하는 조언을 제공 id
합니다. 나는했다.
다른 사람들과 View.findViewById
는 다른 방식으로 작동합니다 Activity.findViewById
. 나도 그 일을 처리했다.
내 location_layout.xml
에서는 다음을 사용합니다.
<FrameLayout .... >
<some.package.MyCustomView ... />
<LinearLayout ... >
<TextView ...
android:id="@+id/txtLat" />
...
</LinearLayout>
</FrameLayout>
내 활동에서 나는 :
...
setContentView( R.layout.location_layout );
내 맞춤보기 수업에서 :
...
TextView tv = (TextView) findViewById( R.id.txtLat );
는을 반환합니다 null
. 이렇게하면 내 활동이 제대로 작동합니다. 그래서 어쩌면 때문에의의 Activity.findViewById
와 View.findViewById
차이. 그래서 컨텍스트를 세관 뷰 생성자에 로컬로 저장하고 시도했습니다.
...
TextView tv = (TextView) ((Activity) context).findViewById( R.id.txtLat );
또한 반환했습니다 null
.
그런 다음 사용자 정의보기를 ViewGroup
대신 확장하도록 View
변경하고 location_layout.xml
를 TextView
사용자 정의보기의 직접적인 자식으로 변경하여 View.findViewById
예상대로 작동하도록했습니다. Suprise : 아무것도 해결하지 못했습니다.
도대체 내가 뭘 잘못하고 있니?
의견을 보내 주셔서 감사합니다.
답변
null을 돌려주는
아마도 너무 일찍 전화했기 때문일 수 있습니다. 까지 기다 onFinishInflate()
립니다. 다음은View
컨텐츠에 액세스 하는 사용자 정의를 보여주는 샘플 프로젝트 입니다.
답변
아마도 전화 findViewById
하기 전에 전화하고 setContentView
있습니까? 그런 경우에는 전화 시도 findViewById
후에 호출setContentView
답변
다른 화면 밀도에 대해 여러 버전의 레이아웃이 없는지 확인하십시오. 기존 레이아웃에 새 ID를 추가 할 때이 문제가 발생했지만 hdpi 버전을 업데이트하는 것을 잊었습니다. 모든 버전의 레이아웃 파일을 업데이트하는 것을 잊어 버린 경우 일부 화면 밀도에서는 작동하지만 다른 버전에서는 작동하지 않습니다.
답변
사용자 정의보기에서 잘못된 수퍼 생성자를 호출하면 FindViewById가 널이 될 수 있습니다. ID 태그는 attr의 일부이므로 attr을 무시하면 ID가 삭제됩니다.
이것은 잘못 될 것입니다
public CameraSurfaceView(Context context, AttributeSet attrs) {
super(context);
}
맞습니다
public CameraSurfaceView(Context context, AttributeSet attrs) {
super(context,attrs);
}
답변
내 경우, 나는 내 프로젝트에이 명하는 행동이 있었다, main.xml
하고 main2.xml
. 처음부터 main2
의 복사본이었다 main
, 나는 새로운 추가 될 때까지 모든 것이 잘 작동 TextView
에 main2
(가) 때문에, R.id.textview1
응용 프로그램의 나머지 가능하게되었다. 그런 다음 표준 호출로 가져 오려고했습니다.
TextView tv = (TextView) findViewById( R.id.textview1 );
그리고 항상 null이었습니다. onCreate
생성자에서 인스턴스가 아닌 main2
다른 인스턴스를 인스턴스화 하고 있음이 밝혀졌습니다 . 나는했다 :
setContentView(R.layout.main);
대신에
setContentView(R.layout.main2);
나는 여기에 도착한 후에 사이트에서 이것을 알아 차렸다.
답변
다른 곳에서 언급 한 고전적인 원인과 함께 :
setContentView()
전에 전화했는지 확인하십시오findViewById()
id
원하는 뷰 또는 레이아웃이 원하는지 확인하십시오setContentView()
id
다른 레이아웃에서 실수로 복제되지 않도록하십시오
표준 레이아웃에서 사용자 정의보기에 대해 찾은 것이 있는데, 이는 문서와 반대입니다.
이론적으로 사용자 정의보기를 작성하여 레이아웃에 추가 할 수 있습니다 ( 여기 참조 ). 그러나 그러한 상황에서 때로는 id
속성이 사용자 정의 뷰를 제외한 레이아웃의 모든 뷰에서 작동 한다는 것을 알았습니다 . 내가 사용하는 솔루션은 다음과 같습니다.
- 각 사용자 정의보기를 사용자 정의보기에서
FrameLayout
원하는 것과 동일한 레이아웃 속성으로 바꿉니다 . 적절하게id
말해frame_for_custom_view
. -
에서
onCreate
:setContentView(R.layout.my_layout); FrameView fv = findViewById(R.id.frame_for_custom_layout); MyCustomView cv = new MyCustomView(context); fv.addView(cv);
프레임에 커스텀 뷰를 넣습니다.
답변
@Override
protected void onStart() {
// use findViewById() here instead of in onCreate()
}