보기 찾기 기준ID가 null을 반환합니다.
우선: 네, 이 주제에 대한 다른 모든 쓰레드를 읽었습니다.그리고 이 사이트의 사람들뿐만 아니라...(알다시피, 나는 약간 좌절했습니다)
대부분은 사용할 수 있는 조언과 함께 제공됩니다.android:id
단순한 의대에 id
XML 파일에 있습니다.했다.
는 다른다른사람배터운것은부로들,은,것,▁learned▁from,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 );
▁returned도 반환했습니다.null
.
그런 다음 사용자 지정 보기를 확장하도록 변경했습니다.ViewGroup
에 신대View
그리고 그것을 바꿨습니다.location_layout.xml
을 허락하는 것은TextView
나의 커스텀 뷰의 직접적인 아이가 되어라, 그래서.View.findViewById
예상대로 작동해야 합니다.서프라이즈: 그것은 아무것도 해결하지 못했습니다.
그럼 내가 뭘 잘못하고 있는 거지?
어떤 의견이든 감사하겠습니다.
null을 반환합니다.
아마도 당신이 그것을 너무 일찍 부르고 있기 때문일 것입니다.다음 시간까지 기다립니다.onFinishInflate()
다음은 사용자 정의를 시연하는 샘플 프로젝트입니다.View
내용에 액세스할 수 있습니다.
아마도, 당신은 전화하고 있을 것입니다.findViewById
전화하기 setContentView
그런 경우에는 전화를 걸어보세요.findViewById
전화한 후setContentView
화면 밀도가 다른 레이아웃의 여러 버전이 없는지 확인합니다.기존 레이아웃에 새 ID를 추가할 때 이 문제가 발생했지만 hdpi 버전을 업데이트하는 것을 잊었습니다.레이아웃 파일의 모든 버전을 업데이트하는 것을 잊으면 일부 화면 밀도에서는 작동하지만 다른 화면 밀도에서는 작동하지 않습니다.
사용자 지정 보기에서 잘못된 슈퍼 생성자를 호출하는 경우 FindViewById가 null일 수 있습니다.ID 태그는 attrs의 일부이므로 attrs를 무시하면 ID를 삭제합니다.
이것은 잘못된 것입니다.
public CameraSurfaceView(Context context, AttributeSet attrs) {
super(context);
}
맞는 말입니다.
public CameraSurfaceView(Context context, AttributeSet attrs) {
super(context,attrs);
}
다른 곳에서 언급된 고전적인 원인과 함께:
- 전화했는지 확인합니다.
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);
사용자 정의 보기를 프레임에 넣습니다.
의 경우,는 프로젝트에서 두.main.xml
그리고.main2.xml
처부터.main2
의 복사본이었습니다.main
그리고 내가 새로운 것을 추가하기 전까지는 모든 것이 잘 작동했습니다.TextView
main2
그 래서그서R.id.textview1
앱의 나머지 부분에서 사용할 수 있게 되었습니다.그런 다음 표준 호출을 통해 가져오려고 했습니다.
TextView tv = (TextView) findViewById( R.id.textview1 );
그리고 그것은 항상 무효였습니다.알고 보니, 그것은.onCreate
인스턴스화를 하고 있었습니다.main2
하지만 다른 하나.제가 가지고 있던 것:
setContentView(R.layout.main);
대신에
setContentView(R.layout.main2);
저는 이곳에 도착해서 현장에서 이것을 알아차렸습니다.
@Override
protected void onStart() {
// use findViewById() here instead of in onCreate()
}
Expandable ListView를 사용하는 사용자를 위한 답변으로, 제목에 따라 이 질문에 답합니다.
확장 가능한 목록 보기 구현의 일부로 자식 및 그룹 보기에서 TextView로 작업하려고 시도하는 동안 이 오류가 발생했습니다.
getChildView() 및 getGroupView() 메서드를 구현할 때 다음과 같은 방법을 사용할 수 있습니다.
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.child_layout, null);
}
여기서 이걸 찾았어요.
FWIW, 저는 누군가가 제가 필요로 했던 것과 같은 방식으로 이 문제를 해결했다고 보지 않습니다.컴파일할 때는 불만 사항이 없었지만, 런타임에 null 뷰를 얻고 적절한 순서로 호출했습니다.즉, setContentView() 뒤에 ViewById()를 찾습니다.문제는 내 보기가 content_main.xml에 정의되어 있지만, 나의 활동_main.xml에는 다음과 같은 문장이 없다는 것입니다.
<include layout="@layout/content_main" />
activity_main.xml에 추가했을 때 NullPointer는 더 이상 없습니다.
나는 안드로이드/이클립스에 꽤 익숙하지, 실수로 UI 항목을 추가했습니다.activity_main.xml
에 fragment_main.xml
그걸 알아내는데 몇 시간이 걸렸습니다...
저도 같은 문제가 있었습니다.저는 그리드 보기에 대한 어댑터를 재정의하고 각 그리드 보기 셀에 대한 레이아웃을 지정할 수 있는 타사 라이브러리를 사용하고 있었습니다.
저는 마침내 무슨 일이 일어나고 있는지 깨달았습니다.Eclipse는 그리드 보기의 각 셀에 대해 라이브러리의 레이아웃 xml 파일을 사용하고 있었지만 이에 대한 표시는 없었습니다.내 커스텀 어댑터에서는 런타임에 내 프로젝트의 xml 리소스를 사용하고 있다고 표시했지만 그렇지 않았습니다.
그래서 제가 한 일은 제 맞춤형 xml 레이아웃과 ID가 아직 라이브러리에 있는 것과 다른지 확인하는 것이었습니다. 프로젝트를 청소하고 나서 프로젝트에 있는 맞춤형 레이아웃을 읽기 시작했습니다.
즉, 타사 라이브러리의 어댑터를 재정의하고 어댑터가 사용할 레이아웃 xml을 지정하는 경우 주의해야 합니다.프로젝트 내부의 레이아웃이 라이브러리의 레이아웃과 동일한 파일 이름을 가진 경우, 정말 찾기 어려운 버그가 발생할 수 있습니다!
저의 경우에는 목록 보기에 바닥글을 추가하려고 했습니다.Create()에 대한 다음 호출에서 null을 반환했습니다.
TextView footerView = (TextView) placesListView.findViewById(R.id.footer);
바닥글 보기를 ID로 찾는 대신 부풀리기로 변경하면 이 문제가 해결되었습니다.
View footerView = ((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.footer_view, null, false);
그냥 내 사건을 여기에 던져두고 싶었어요누군가를 도와줄 수도 있습니다.
Android UI XML에서 지침을 다음과 같이 사용했습니다.
상위 보기:
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:tag="home_phone"
android:background="@color/colorPrimary">
...
<include
layout="@layout/retry_button"
android:visibility="gone" />
하위 보기(retry_button):
<com.foo.RetryButton
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/retry"
android:layout_gravity="center"
android:orientation="vertical"
android:layout_width="100dp"
android:layout_height="140dp">
.findViewById(R.id .retry)는 항상 null을 반환합니다.그런데 아이뷰에서 아이디를 인크루드 태그로 옮겼더니 작동하기 시작했습니다.
고정 상위 항목:
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:tag="home_phone"
android:background="@color/colorPrimary">
...
<include
layout="@layout/retry_button"
android:id="@+id/retry"
android:visibility="gone" />
고정 자식:
<com.foo.RetryButton
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_gravity="center"
android:orientation="vertical"
android:layout_width="100dp"
android:layout_height="140dp">
경우 Expandable 하다가 "Expandable ListView"를 했습니다.android:transcriptMode="normal"
이로 인해 확장 가능한 그룹의 어린이가 거의 사라졌고 목록을 스크롤할 때마다 NULL 예외가 발생하곤 했습니다.
저는 동일한 활동을 위한 두 개의 xml 레이아웃을 가지고 있었습니다. 하나는 세로 모드이고 다른 하나는 가로 모드입니다.물론 가로 xml에서 개체의 ID를 변경했지만 세로 버전에서 동일한 변경을 수행하는 것을 잊었습니다.하나를 변경할 경우 다른 xml과 동일하게 변경하거나 실행/디버깅하여 변경하지 않은 ID를 찾을 수 없을 때까지 오류가 발생하지 않습니다.오, 바보 같은 실수들이여, 당신은 왜 나를 그렇게 벌해야 합니까?
레이아웃 리소스에서 활동 내용을 설정합니다.즉,setContentView(R.layout.basicXml)
;
위의 해결책 외에도 당신은 다음을 확인합니다.
tools:context=".TakeMultipleImages"
. mainfest.xml 파일의 값은 다음과 같습니다.
android:name=".TakeMultipleImages"
동일한 활동 요소에 대해.복사 및 붙여넣기를 사용하여 새 활동을 만들 때 발생합니다.
저도 같은 문제가 있지만, 저는 여러분과 공유할 가치가 있다고 생각합니다.사용자 지정 레이아웃에서 ViewById를 찾아야 하는 경우, 예를 들어 다음과 같습니다.
public class MiniPlayerControllBar extends LinearLayout {
//code
}
생성자에서 뷰를 가져올 수 없습니다.보기가 부풀린 후 findViewById를 호출해야 합니다.이 메서드는 재정의할 수 있습니다.onFinishInflate
제 경우는 위와 달리 해결책이 없었습니다.저는 제 견해가 레이아웃 계층 구조에 너무 깊이 빠져 있었다고 생각합니다.나는 그것을 한 단계 위로 옮겼고 그것은 더 이상 무효가 아니었습니다.
레이아웃 부풀리기!! (ID 포함)
내 경우 findViewById()가 null을 반환했습니다. 요소가 작성된 레이아웃이 부풀려지지 않았기 때문입니다.
예: fragment_layout.xml
<ListView
android:id="@+id/listview">
findViewById(R.id .listview)가 null을 반환했습니다. 그 전에 plater.plate(R.layout.fragment_layout, ...)를 수행하지 않았기 때문입니다.
이 답변이 여러분 중 일부에게 도움이 되기를 바랍니다.
저의 경우 레이아웃을 부풀렸지만 하위 보기가 null로 반환되었습니다.원래 나는 이것을 가지고 있었습니다.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_history);
footerView = ((LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.listview_footer, null, false);
pbSpinner = (ProgressBar) findViewById(R.id.pbListviewFooter);
tvText = (TextView) findViewById(R.id.tvListviewFooter);
...
}
그러나 다음과 같이 변경했을 때 작동했습니다.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_history);
footerView = ((LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.listview_footer, null, false);
pbSpinner = (ProgressBar) footerView.findViewById(R.id.pbListviewFooter);
tvText = (TextView) footerView.findViewById(R.id.tvListviewFooter);
...
}
핵심은 하위 뷰를 얻기 위해 이미 부풀려진 레이아웃을 구체적으로 참조하는 것이었습니다.즉, 추가하는 것은footerView
:
- 바닥글 보기.ViewById 찾기
활동 ID의 필드 중 하나가 다른 활동의 ID와 일치하기 때문에 충돌했습니다.저는 고유 아이디를 부여하여 고쳤습니다.
내 로그인 Activity.xml 비밀번호 필드 ID가 "비밀번호"였습니다.등록 활동에서 idr_password를 지정하여 수정하면 null 객체가 아닙니다.
password = (EditText)findViewById(R.id.r_password);
내 경험에 따르면, 이것은 당신의 코드가 OnDestroyView 뒤에 호출될 때(조각이 백스택에 있을 때)에도 발생할 수 있는 것 같습니다.BroadCastReceiver에서 입력할 때 UI를 업데이트하는 경우 이러한 경우가 있는지 확인해야 합니다.
findViewById도 fragment 안에 있으면 null을 반환할 수 있습니다.여기에 설명된 대로: findViewById in Fragment
fragment 내부의 최상위 뷰를 반환하려면 getView()를 호출해야 합니다.그런 다음 레이아웃 항목(버튼, 텍스트 보기 등)을 찾을 수 있습니다.
이 경우 부모 개체에서 부모가 인스턴스화한 어댑터 개체로 호출을 이동했을 때 findViewById가 null을 반환했습니다.여기에 나열된 트릭을 시도했지만 실패한 후 findViewById를 다시 상위 개체로 이동하고 어댑터 개체 인스턴스화 중에 매개 변수로 결과를 전달했습니다.예를 들어 상위 개체에서 이 작업을 수행했습니다.
Spinner hdSpinner = (Spinner)view.findViewById(R.id.accountsSpinner);
그런 다음 어댑터 개체를 만드는 동안 매개 변수로 hdSpinner를 전달했습니다.
mTransactionAdapter = new TransactionAdapter(getActivity(),
R.layout.transactions_list_item, null, from, to, 0, hdSpinner);
사용자 지정 보기를 수행하려고 할 때 비슷한 문제에 직면했습니다.ListView
.
이를 통해 간단히 해결했습니다.
public View getView(int i, View view, ViewGroup viewGroup) {
// Gets the inflater
LayoutInflater inflater = LayoutInflater.from(this.contexto);
// Inflates the layout
ConstraintLayout cl2 = (ConstraintLayout)
inflater.inflate(R.layout.custom_list_view, viewGroup, false);
//Insted of calling just findViewById, I call de cl2.findViewById method. cl2 is the layout I have just inflated.
TextView tv1 = (TextView)cl2.findViewById(cl2);
문제를 디버깅하고 찾는 방법:
- 활동에서 모든 findViewById를 주석 처리합니다.
- 내용 보기 만들기 및 설정을 제외한 모든 항목에 대해 주석 달기
- 프로젝트 실행 및 레이아웃 설정 여부 확인
저의 경우 앱 모듈과 라이브러리 모듈 모두에서 activity_main.xml을 사용했습니다.그래서 제가 위의 단계를 수행했을 때, 제가 도서관에서 디자인한 레이아웃 대신 앱 모듈 내부의 레이아웃이 부풀려졌습니다.
그래서 activity_main.xml 파일 이름을 activity_main_lib.xml로 변경했습니다.
따라서 전체 프로젝트에 중복된 레이아웃 이름이 없어야 합니다.
는 같은 이름을 두 .activity_main.xml
(에 (배열 중 했습니다.그 중 하나를 고유한 이름으로 변경하여 문제를 해결했습니다.
지정된 컨트롤이 (프로그래밍 방식으로) 숨겨졌기 때문에 저는 null을 반환했습니다.findViewBy를 호출하는 조건을 설정한 경우ID(id)는 컨트롤이 표시될 때만 다시 작동하기 시작했습니다.
나에게 있어 이는 표현식 평가 또는 IDE의 디버그 감시 보기를 사용할 때만 null이었습니다.
언급URL : https://stackoverflow.com/questions/3264610/findviewbyid-returns-null
'programing' 카테고리의 다른 글
process.env의 값을 변경하는 방법.node.js의 PORT? (0) | 2023.08.05 |
---|---|
SQL Server에서 특정 문자 뒤에 문자열을 분할하고 이 값을 특정 열로 업데이트하는 방법 (0) | 2023.08.05 |
jquery가 로드될 때까지 스크립트 실행을 대기시키는 방법 (0) | 2023.08.05 |
노드 패키지(Grunt)가 설치되었지만 사용할 수 없음 (0) | 2023.08.05 |
MariaDB - 사용자를 통해 로그인할 수 없음 - 암호 문자 인코딩 오류 (0) | 2023.08.05 |