0

첫 번째 탭에는 실제 데이터 (목록보기)가 있고 나머지 2 개는 비어있는 탭이 있습니다. 탭 탐색 기능을 구현하려고했습니다.ActionBar 및 뷰 페이지를 사용하여 탭 탐색 구현

mViewPager = new ViewPager(this); 
mViewPager.setId(R.id.pager); 
setContentView(mViewPager); 
actionBar = getSupportActionBar(); 
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
PagerAdapter adapter = new PagerAdapter((SlidingFragmentActivity) this, 
      mViewPager); 

adapter.addTab(actionBar.newTab().setText("Tab-1"), 
      Fragment1.class, null); 
adapter.addTab(actionBar.newTab().setText("Tab-2"), 
      Fragment2.class, null); 
adapter.addTab(actionBar.newTab().setText("Tab-3"), 
      Fragment2.class, null); 

을하고 PagerAdapter은 다음과 같습니다 : 활동의에서 onCreate에서

는 내가 가지고

public static class PagerAdapter extends FragmentPagerAdapter implements 
     ActionBar.TabListener, ViewPager.OnPageChangeListener { 
    private final Context mContext; 
    private final ActionBar mActionBar; 
    private final ViewPager mViewPager; 
    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); 

    static final class TabInfo { 
     private final Class<?> clss; 
     private final Bundle args; 

     TabInfo(Class<?> _class, Bundle _args) { 
      clss = _class; 
      args = _args; 
     } 
    } 

    public PagerAdapter(SlidingFragmentActivity activity, ViewPager pager) { 
     super(activity.getSupportFragmentManager()); 
     mContext = activity; 
     mActionBar = activity.getSupportActionBar(); 
     mViewPager = pager; 
     mViewPager.setAdapter(this); 
     mViewPager.setOnPageChangeListener(this); 
    } 

    public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) { 
     TabInfo info = new TabInfo(clss, args); 
     tab.setTag(info); 
     tab.setTabListener(this); 
     mTabs.add(info); 
     mActionBar.addTab(tab); 
     notifyDataSetChanged(); 
    } 

    public int getCount() { 
     return mTabs.size(); 
    } 

    public SherlockFragment getItem(int position) { 
     TabInfo info = mTabs.get(position); 
     return (SherlockFragment) Fragment.instantiate(mContext, 
       info.clss.getName(), info.args); 
    } 

    public void onPageSelected(int position) { 
     mActionBar.setSelectedNavigationItem(position); 
    } 

    public void onPageScrollStateChanged(int state) { 
    } 

    public void onPageScrolled(int position, float positionOffset, 
      int positionOffsetPixels) { 
    } 

    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     mViewPager.setCurrentItem(tab.getPosition()); 
    } 

    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 

    } 

    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
    } 
} 

여기 Fragment1은 AsyncTask를을 사용하여 웹 서버에서 데이터를 가져리스트 뷰가 있습니다.

Fragment2 단지 빈 단편

public class Fragment2 extends SherlockFragment { 

} 

문제점 :

제가 선택하면 탭 -2- 다음 탭 -3- 및 복귀에 탭 -2-, 단편 1의 onCreateView이 호출 중입니다. Tab-2이 흰색 화면으로 표시되어 있지만 Fragment1의 onCreateView이 호출되고 있는데 logcat을 사용하여 확인했습니다.

올바른 방법으로 PagerAdapter을 구현하지 않았습니까?

+0

그건 정상입니다. 'ViewPager'가 세 번째 프래그먼트로 갈 때 첫 번째 프래그먼트의 뷰를 파괴하지 않게하려면'ViewPager'에'setOffscreenPageLimit (2)'메소드를 사용하십시오. – Luksprog

+0

하지만 ** Fragment1 (Tab-1에서 사용됨) **은 ** Tab-2 (Fragment2 사용)를 클릭 할 때 호출됩니다 ** ** Tab-3 **에 갔을 때 * * Tab-1 **이 파괴되고 ** Tab-2로 돌아갑니다 ** ** Tab-1 **을 다시 만듭니다. –

+0

보기를 화면 한계에 도달하면보기를 생성하여 탭을 화면에 스 와이프하기위한보기를 갖습니다. – Janusz

답변

3

이 동작에는 아무런 문제가 없습니다.

ViewPager는 조각에있는 메모리 영향을 최소화하려고 시도합니다. FragmentPagerAdapter를 사용하면 조각이 화면을 벗어나면 조각의보기가 삭제 될 수 있습니다.

일반적으로 ViewPager는 빠른 탭 전환이 가능하도록 현재보기의 왼쪽과 오른쪽으로보기를 메모리에 유지합니다.

탭이 5 개인 경우이 탭의 모든보기를 메모리에 저장하려면 ViewPager.setOffscreenPageLimit으로 유지되는보기의 수를 수정할 수 있습니다. 이 메소드를 사용하면 각면에 보관되는 뷰 수를 지정할 수 있습니다. 탭이 5 개인 경우 4를 offScreenPageLimit으로 설정하여 사용자가 외부 탭 중 하나에 있어도 각보기가 메모리에 유지되도록 할 수 있습니다.

이유 때문에 뷰가 파괴된다는 점에 유의하십시오. 이것은 성능 최적화이며 offScreenPageLimit이 10 일 때도 더 적은 메모리로 장치를 손상시킬 수 있습니다. 한계를 적당한 수로 설정하고 조각의 onDestroyViewoncreateView 메소드를 올바르게 구현하십시오.