findViewByID는 null을 반환 스레드를 읽습니다. 그리고이 사이트의 사람들뿐만

우선 : 예,이 주제에 대한 다른 모든 스레드를 읽습니다. 그리고이 사이트의 사람들뿐만 아니라 … (알다시피 조금 실망합니다)

그들 대부분은 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.findViewByIdView.findViewById차이. 그래서 컨텍스트를 세관 뷰 생성자에 로컬로 저장하고 시도했습니다.

...
TextView tv = (TextView) ((Activity) context).findViewById( R.id.txtLat );

또한 반환했습니다 null.

그런 다음 사용자 정의보기를 ViewGroup대신 확장하도록 View변경하고 location_layout.xmlTextView사용자 정의보기의 직접적인 자식으로 변경하여 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, 나는 새로운 추가 될 때까지 모든 것이 잘 작동 TextViewmain2(가) 때문에, 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속성이 사용자 정의 뷰를 제외한 레이아웃의 모든 뷰에서 작동 한다는 것을 알았습니다 . 내가 사용하는 솔루션은 다음과 같습니다.

  1. 각 사용자 정의보기를 사용자 정의보기에서 FrameLayout원하는 것과 동일한 레이아웃 속성으로 바꿉니다 . 적절하게 id말해frame_for_custom_view .
  2. 에서 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()
    }