2014-09-30 2 views
0

TabsPagerAdapterFragmentPagerAdapter까지 확장되는 클래스가 있습니다. 나는 그것을 사용하여 3 개의 탭을 채 웁니다. 세 가지보기 모두 조각입니다.조각 onCreateView가 호출되지 않았습니다.

이 그들이 (탭으로)

public class DonorSearchFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     ... 
    } 
} 

public class DonorResultsFragment extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     ... 
    } 
} 

public class CampDonorResultsFragment extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     ... 
    } 
} 

이 조각을 정의하는 방법이다는 클래스

public class TabsPagerAdapter extends FragmentPagerAdapter { 

    private ArrayList<Fragment> fragments; 

    public TabsPagerAdapter(FragmentManager fm) { 
     super(fm); 
     fragments = new ArrayList<Fragment>(); 
     fragments.add(Constants.SEARCH_TAB_POSITION, new DonorSearchFragment()); 
     fragments.add(Constants.DONORS_TAB_POSITION, new DonorResultsFragment()); 
     fragments.add(Constants.CAMP_DONORS_TAB_POSITION, new CampDonorResultsFragment()); 
    } 
    ... 
} 

및 MainActivity에서

, 내가 TabsPagerAdapter 클래스의 인스턴스를 아래처럼 TabsPagerAdapter에서 인스턴스화 위의 그림은

public class MainActivity extends ActionBarActivity implements ActionBar.TabListener, DonorSearchFragment.ResultsChangedListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 
     tabsPagerAdapter = new TabsPagerAdapter(getSupportFragmentManager()); 
     viewPager.setAdapter(tabsPagerAdapter); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
     for (String tab_name : tabs) { 
      actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this)); 
     } 
     .. 
    } 
} 

놀랍게도 위와 같이 세 번째 탭 (예 : CampDonorResultsFragment) onCreateView()이 인스턴스화 후에도 호출되지 않습니다. 결과적으로 해당 단편에 대한 메소드를 호출하면 onCreateView()에 인스턴스화 된 모든 변수가 널 (NULL)이되어 널 포인터 예외가 발생합니다.

여기 정확히 무슨 일이 발생합니까? onCreateView()은 해당 조각에 대한 메소드가 수동으로 호출되기 전에 호출되지 않습니다. 또한, 왜 두 번째 탭 (DonorResultsFragment) 위의 발생하지 않습니다.

+0

'TabsPagerAdapter' 게시 완료! – mmlooloo

답변

2

보기 호출기은 현재 페이지 플러스되는 기본값 1

off-screen page limit에 의해 지정된 이전/다음 페이지 수를 유지 그것에서 살아 당신의 조각을 가정하지 않도록 코드를 재 설계 고려 항상. 프래그먼트에서 메소드를 호출하는 대신, 프래그먼트를 사용할 수있는 곳이라면 어디에서나 필요한 데이터를 가져와야합니다.

빠른 해결 방법으로 페이지 제한을 2와 같이 더 높은 숫자로 설정할 수는 있지만 결국 다른 곳에서 당신을 물릴 수있는 기본 디자인 문제는 해결되지 않습니다.

+0

올바른지, setOffscreenPageLimit()가 작동합니다. 그러나 MainActivity의 프래그먼트에 대한 메소드 호출은 피해야합니다. 내 시나리오에서, 나는 여전히 같은 것을 이해하려고 노력하고있다. 일반적으로 프래그먼트가 일부 데이터를 생성하고 MainActivity로 전달되는 방식이 다음 MainActivity로 전달되어 다른 프래그먼트로 전달됩니다. – Jatin

+0

이를 위해 데이터 생산자와 소비자를 분리하기 위해 일종의 이벤트 버스 (예 : 오토)를 사용할 수 있습니다. – laalto

관련 문제