2014-03-07 2 views
0

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

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

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

이상한 말처럼, 액티비티에서 조각 UI 필드를 변경하는 것은 여전히 ​​가능합니다. 즉, context = activity가 setSomeText (this,. ..), 이것은 조각이 해당 변경을 할 수있게합니다. 물론 디자인은 조각이 자신의 상세한 작업을 처리하도록해야합니다.

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

이 튜토리얼에서는이 기능이 초기 개발 단계에 있음을 명시 적으로 언급했지만 "null"문제는 여기에 매우 시시각각 변하기 때문에 "getActivity가 null을 반환한다"는 것이 매우 일반적인 문제인 것을 알 수 있습니다. ViewPager 및/또는 Tab과 결합 할 때 getActivity()에 버그가있을 수 있는지 여부를 소리내어보고 싶습니까?

문제를 탐지하는 데 오랜 시간이 걸렸던 이유는 조각이 그 활동에 대한 지식을 잃어 버렸다는 것을 추측하기 어렵다는 것이 었습니다. 어쨌든, 나는 다음 장애물에 서서 getActivity()를 신뢰하지 않고 Get/Set 메서드 또는 다른 API의 매개 변수로 Activity에서 해당 Fragment로 컨텍스트를 전달합니다.

+0

조각을 정확하게 처리해야합니다. 설명서가 오래되었고 초기 개발 단계 * (몇 년간 사용 후) 인 * 클래스와 관련하여 업데이트되지 않은 것 같습니다. 프래그먼트의'getActivity()'가 null을 반환하는 특정 시나리오가있는 경우 문제에 대한 코드 구현을 추가해야합니다. – Luksprog

답변

0

이 응답하지 않습니다,하지만 설명하기 위해 공간을 필요로하고 내가 문제에 circeling 오전 :

그것보다 더 일반적인 문제가있는 것처럼 보인다 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"는 조각에 강제 컨텍스트로 전달됩니다. 여기서 큰 질문은 내 코드에서 아무것도 요구하지 않는 한 탭이 ​​원래 조각을 잃어 버리는 이유입니다.

관련 문제