findViewById
을 사용하려하지만 경고가 나타납니다. 나는이 경고를 해결하는 데 사용 된 serveral 다른 방법을 보았지만 내 코드와 관련하여 어느 것이 옳은지 알지 못합니다. 이 상황에서이 경고를 제거하는 올바른 방법을 아는 사람 있습니까?조각에 findViewById를 선언 한 후 java.lang.NullpointerException이 발생했습니다.
메소드 호출 'findViewById를은'난 당신이 보풀이 경고에 대해 얘기하고 가정 'java.lang.NullPointerException이'
Page1Fragment.java
public class Page1Fragment extends android.support.v4.app.Fragment {
boolean squareState;
public Page1Fragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_page1, container, false);
}
@Override
public void onResume(){
super.onResume();
loadPreferences();
displaySettings();
}
public void loadPreferences(){
SharedPreferences pref = this.getActivity().getSharedPreferences("settings", AppCompatActivity.MODE_PRIVATE);
squareState = pref.getBoolean("square_state", true);
}
public void displaySettings() {
if (squareState) {
getView().findViewById(R.id.blue_square).setVisibility(View.VISIBLE);
} else {
getView().findViewById(R.id.blue_square).setVisibility(View.GONE);
}
}
}
을 방지하기 위해, 또는 onCreateView 아직라는 있었하지 않을 수도 있습니다. 프래그먼트의 뷰가 아직 작성되지 않은 경우 getView()를 호출하면 null이 리턴됩니다. 따라서 null을 확인해야합니다. –
getView 메소드를 호출하는 위치를 아는 경우 (onCreateView 이후와 onDestroyView 전)에는 이러한 경고를 무시할 수 있습니다. – AnixPasBesoin
@AnixPasBesoin 사실이지만,이 가정을하면 과거에 나에게 놀랄만 한 놀라움이 생겼습니다. 프래그먼트가 액티비티에 첨부 된 시점과 뷰가 생성 된 시점을 아는 것은 항상 쉬운 일은 아닙니다. 예를 들어 백그라운드 스레드에서 일부 데이터를 검색하기 위해 AsyncTask를 시작한 다음 UI를 업데이트하려고하면 사용자가 조각을 탐색했을 수 있으며 getView()는이 경우 null을 반환합니다. –