2011-12-30 3 views
4

필자는 3 개 이상의 프래그먼트가있는 ViewPager를 사용하여 CustomView를 필드로 표시하고 저장하고 있습니다.ViewPager의 invisible 프래그먼트 참조하기

FragmentActivity를 호스팅하는 과정에서 표시되는 방식을 변경하기 위해 CustomView의 특성 및 필드를 액세스하고 설정해야합니다.

문제는 아직 활동이 시작될 때 세 번째 단편과 같이 아직 인스턴스화되지 않은 단편에 액세스해야하는 경우 발생합니다 (첫 번째 단편은 기본적으로 선택되고 다음 단편 만 인스턴스화됩니다).

내 Acticity :

public class VectorProduct extends FragmentActivity { 
    ViewPager mViewPager; 
    TabsAdapter mTabsAdapter; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.pager); 

     final ActionBar bar = getSupportActionBar(); 
     bar.setSubtitle(R.string.bt_dashboard_vector_product); 
     bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
     mViewPager = (ViewPager) findViewById(R.id.viewpager); 
     mTabsAdapter = new TabsAdapter(this, bar, mViewPager); 
     mTabsAdapter.addTab(bar.newTab().setText("Vector 1"), VectorFragment.class); 
     mTabsAdapter.addTab(bar.newTab().setText("Vector 2"), VectorFragment.class); 
     mTabsAdapter.addTab(bar.newTab().setText("Vector 3"), VectorFragment.class); 
    } 

    public static class TabsAdapter extends FragmentPagerAdapter implements 
     ViewPager.OnPageChangeListener, ActionBar.TabListener { 
     private final FragmentManager mFragmentManager; 
     private final Context mContext; 
     private final ActionBar mActionBar; 
     private final ViewPager mViewPager; 
     private ArrayList<Class<? extends Fragment>> Fragments; 

     public TabsAdapter(FragmentActivity activity, ActionBar actionBar, 
      ViewPager pager) { 
      super(activity.getSupportFragmentManager()); 
      mFragmentManager = activity.getSupportFragmentManager(); 
      mContext = activity; 
      mActionBar = actionBar; 
      mViewPager = pager; 
      mViewPager.setAdapter(this); 
      mViewPager.setOnPageChangeListener(this); 
      setFragments(new ArrayList<Class<? extends Fragment>>()); 
     } 

     public void addTab(ActionBar.Tab tab, Class<? extends Fragment> clss) { 
      mActionBar.addTab(tab.setTabListener(this)); 
      getFragments().add(clss); 
      notifyDataSetChanged(); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      try { 
       return Fragments.get(position).newInstance(); 
      } catch (InstantiationException e) { 

      } catch (IllegalAccessException e) { 

      } 
      return null; 
     } 

     public Fragment findFragment(int position) { 
      String name = "android:switcher:" + mViewPager.getId() + ":" + position; 
      Fragment fragment = mFragmentManager.findFragmentByTag(name); 
      if (fragment == null) { 
       fragment = getItem(position); 
      } 
      return fragment; 
     } 
    } 
} 

답변

3

후 나는 ViewPager를 초기화 한 후, 당신의 onCreateView에, 오프 스크린 페이지 제한을 변경합니다 : 내가 넣어

mViewPager.setOffscreenPageLimit(2); 

당신은 3 개의 탭을 가지고 있기 때문에 지금은 2가됩니다. 4 개의 탭에 대해 3이 될 것입니다. Android API의 문서 : http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)

오프 스크린 한도를 탭 수에서 1을 뺀 값으로 설정하면 모든 탭에 인접한 모든 조각이로드되고 있음을 의미합니다. 이 값은 기본적으로 1이므로 가장 가까운 탭만로드되었습니다.

이 기능은 아주 최근에 추가 된 것을 알고 있어야합니다 (I 생각 지원 package v4 release 6), 그래서 당신은 최신 지원 패키지를 가지고 있어야한다.

0

문제는 당신이 (즉석에서 필요에 따라) 조각을 만들 수 있다는 것입니다 그러나 응용 프로그램 논리는 파편이 항상 존재한다고 가정합니다 (또는 활동이 존재하는 한) : user936414의 솔루션은 이미 액티비티를 인스턴스화 한 후에 파편이 이미 존재하는지 확인하기 때문에 작동합니다 ..

조각으로 작업하고 싶지 않을 수도있는 뷰 (가방)를 표시하려면내의 뷰를 직접 인스턴스화 할 수 있습니다. 10. 이것은 항상 모든 페이지 내용에 액세스하려는 경우에 특히 적합합니다. 전체 코드 예제는 https://stackoverflow.com/a/8685189/243165을 참조하십시오.

0

상위 조각 안에 조각을 포함하려면 중첩 된 조각을 사용해야합니다. 부모 조각에서 getChildFragmentManager() 대신 getFragmentManager()을 호출하여 작업 FragmentManager를 가져옵니다.