안드로이드 - "ActionBarTabsPager"자습서에서 getActivity는 null을 반환합니다.



fragment 안드로이드 (1)

튜토리얼을 성공적으로 구현했습니다 : http://developer.android.com/reference/android/support/v4/view/ViewPager.html , 각 탭의 단편을 포함하는 Tab''ve viewpager 활동. 각 단편은 다양한 UI TextField 등을 유지하며 모든 단편에서 호출 될 때 null을 반환하는 getActivity ()를 제외하고는 모든 것이 잘 작동합니다.

업데이트 : 이것을 읽은 다음이 오류의 원인과 관련된 범위를 넓히는 아래 내 대답을 참조하십시오. 계속되는:

하지만 잠시 후 null 상태가 나타납니다. 처음에는 fragment.onStart ()에서 getActivity ()가 작동하여 기본 UI 설정을 수행 할 수 있습니다. 그러나 처음 사용자가 변경 한 경우 getActivity ()는 이미 null을 반환합니다.

이상하게도 같은 순간에 Activity에서 프래그먼트 UI 필드를 변경하는 것이 가능합니다. 즉, context = activity가 setSomeText (this, ...)의 프래그먼트로 전달됨에 따라, 이것은 조각이 해당 변경을 수행 할 수있게합니다. 물론 디자인은 조각이 자신의 상세한 작업을 처리하도록해야합니다.

onStart ()에서 컨텍스트를 저장하는 것은 도움이되지 않습니다. 왜냐하면 해당 참조는 잠시 후에 null을 가리킬 것이기 때문입니다.

이 튜토리얼에서는이 기능이 초기 개발 단계에 있음을 명시 적으로 언급했지만이 "null"문제는 꽤 시간을 초월하게되었습니다. "getActivity가 null을 반환합니다"라는 것이 매우 일반적인 문제이므로 큰 소리로 숙고하고 싶었습니다. ViewAccess 및 / 또는 Tab과 결합 할 때 getActivity ()에 버그가있을 수 있습니까?

문제를 발견하는 데 너무 오래 걸린 이유는 조각이 그 활동에 대한 지식을 잃어 버리지 않았을 것이라고 추측하기 어렵 기 때문입니다. 어쨌든, 나는 다음 장애물에 서서 getActivity ()를 신뢰하지 않고 Get / Set 메서드 또는 다른 API의 매개 변수로 Activity에서 해당 Fragment로 컨텍스트를 전달합니다.


이것은 답변이 아니지만 설명 할 공간이 필요하며 문제를 둘러싸고 회전하고 있습니다.

그냥 getActivity ()보다 더 일반적인 문제가있는 것 같습니다. 왜냐하면 조각의 변수 선언도 null로 "사라집니다". 조각의 새로운 인스턴스가 "인계받습니다". 이것은 현재 탭이 둘 이상의 탭에서 양쪽으로 이동할 때 발생합니다.

예 : 5 개의 탭을 정의합니다. UI에서 조작 할 수있는 탭 2가 있습니다. 2 콘텐츠 변경 후, 나는 탭 클릭 또는 핑거 웨이브로 탭 사이를 이동합니다. 어느 쪽이든.

결과? 왼쪽 또는 오른쪽에있는 다음 탭을 방문한 다음 뒤로 이동하면 변경된 데이터가 탭 2에 계속 남아 있습니다. 탭 2에서 두 개 이상의 탭을 이동 한 다음 반환하면 조각 인스턴스가 탭 2는 항상 재설정됩니다. 얼마나 많은 탭이 있는지는 중요하지 않습니다. 이 과정에서 마지막 또는 첫 번째 탭을 눌렀는지 여부는 중요하지 않습니다. 코드? 참조 된 자습서와 동일하며 추가적으로 다음과 같습니다.

//add tabs (notice the once only saving of the fragment into profileViewer)

    mTabsAdapter.addTab(actionBar.newTab()
            //.setText(R.string.action_favorite)
            .setIcon(R.drawable.ic_action_favorite),
            TabFragmentDemo.class, null);

    mTabsAdapter.addTab(actionBar.newTab()
            //.setText(R.string.new_profile)
            .setIcon(R.drawable.ic_action_add_person),
            ProfileViewer.class, null); 
    profileViewer = (ProfileViewer) mTabsAdapter.getItem(NEW_PROFILE);

    mTabsAdapter.addTab(actionBar.newTab()
            //.setText(R.string.action_select)
            .setIcon(R.drawable.ic_action_view_as_list),
            TabFragmentDemo.class, null);

    mTabsAdapter.addTab(actionBar.newTab()
            //.setText(R.string.action_select)
            .setIcon(R.drawable.ic_action_view_as_list),
            TabFragmentDemo.class, null);

    mTabsAdapter.addTab(actionBar.newTab()
            //.setText(R.string.action_select)
            .setIcon(R.drawable.ic_action_view_as_list),
            TabFragmentDemo.class, null);

그런 다음 날짜를 선택하고이 날짜를 선택하는 간단한 dialogFragment가 설정됩니다 (날짜 피커를 생략하고 직접 날짜를 설정하는 데 도움이되지 않음)

 public void showDatePickerDialog(View v) {     

    dateOfBirthPicker = new DateOfBirthPicker();       
    dateOfBirthPicker.show(fragmentManager, datePickerTag); 

}

//the callback from datepicker:
@Override
public void onDateSet(DatePicker view, int year, int month, int day) {
    //update the fragment     
    profileViewer.setCardFromDate (this, day, month, year);

"this"는 프래그먼트에 강제 컨텍스트로 전달됩니다. 여기서 큰 질문은 내 코드에서 아무것도 요구하지 않는 한 탭이 ​​원래 조각을 잃어 버리는 이유입니다.