14

ActionBarActivity를 사용하여 5 개의 탭을 만듭니다. FragmentPagerAdapter를 확장 한 SectionsPagerAdapter를 사용하여 5 개의 탭 사이를 스 와이프하기 위해 ViewPager를 사용했습니다. 각 탭에는 oncreateview 메소드에서 호출되는 asynctask가있는 조각이 있습니다. 내가 한 조각에있을 때, 다른 조각에 asynctask가 호출되고있다.ViewPager를 사용할 때 ActionBarActivity 조각에서 AsyncTask를 처리하는 방법은 무엇입니까?

oncreateview 메서드에서 토스트 메시지를 사용하여 시도한 결과 asynctask 대신 각 조각이 사용되었습니다. 그러나 잘못된 토스트 메시지가 잘못된 부분에서 해고되고 있습니다.

에서 OnCreate 메소드 코드 :

 mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 


     mViewPager = (ViewPager) findViewById(R.id.pager_exp); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 


     mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
        @Override 
        public void onPageSelected(int position) 
        { 
         actionBar.setSelectedNavigationItem(position); 
         actionBar.setTitle(getHomePageTitle(position)); 
        } 
       }); 


     for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) 
     { 
      // Create a tab with text corresponding to the page title defined by 
      // the adapter. Also specify this Activity object, which implements 
      // the TabListener interface, as the callback (listener) for when 
      // this tab is selected. 
      actionBar.addTab(actionBar.newTab() 
        .setIcon(getPagedrawable(i)) 
        .setTabListener(this)); 

     } 

// 어댑터 클래스 코드 :

public class SectionsPagerAdapter extends FragmentPagerAdapter { 

    public SectionsPagerAdapter(FragmentManager fm) 
    { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 


    switch (position) 
    { 
     case 0: 
      Fragment1 f1 = new Fragment1(); 
      return f1; 

     case 1: 
      Fragment2 f2 = new Fragment2(); 
      return f2; 

     case 2: 
      Fragment3 f3 = new Fragment3(); 
      return f3; 

     case 3: 
      Fragment4 f4 = new Fragment4(); 
      return f4; 


     case 4: 
      Fragment5 f5 = new Fragment5(); 
      return f5; 

     } 

     return null; 

    } 

    @Override 
    public int getCount() { 
     // Show 5 total pages. 
     return 5; 
    } 


} 

Fragemnt 클래스 코드 :

public class F1 extends Fragment 
{ 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

} 

@SuppressLint("NewApi") 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) 
{ 
    View view  = inflater.inflate(R.layout.f1,container, false); 

    Toast.makeText(getActivity(), "F1", Toast.LENGTH_SHORT).show(); 
    return view; 
} 
} 

답변

12

FragmentPagerAdapter은 표시된 것 외에 추가 조각을 재개 된 상태로 유지합니다. 해결책은 사용자 정의 OnPageChangeListener을 구현하고 조각이 표시 될 때 새로운 방법을 만드는 것입니다.

1) 작성 LifecycleManager 인터페이스 인터페이스에는 두 가지 메소드가 있으며 각 ViewPager’s 조각이이를 구현합니다. 다음과 같이이 방법은 다음과 같습니다

public class FragmentBlue extends Fragment implements FragmentLifecycle 
public class FragmentGreen extends Fragment implements FragmentLifecycle 
public class FragmentPink extends Fragment implements FragmentLifecycle 

3)를 확인하기 위해 각 조각 의 인터페이스 메소드를 구현 :

public interface FragmentLifecycle { 

    public void onPauseFragment(); 
    public void onResumeFragment(); 

} 

2) 각 클래스 선언 iplements 문을 추가 인터페이스 를 구현하는 각 Fragment하자 그것이 실제로 예상대로 작동한다면, 나는 그냥 메서드 호출을 기록하고 토스트를 보여줄 것입니다 :

@Override 
public void onPauseFragment() { 
    Log.i(TAG, "onPauseFragment()"); 
    Toast.makeText(getActivity(), "onPauseFragment():" + TAG, Toast.LENGTH_SHORT).show(); 
} 

@Override 
public void onResumeFragment() { 
    Log.i(TAG, "onResumeFragment()"); 
    Toast.makeText(getActivity(), "onResumeFragment():" + TAG, Toast.LENGTH_SHORT).show(); 
} 

리스너가 알고있는 사용자 정의 라이프 사이클 메소드 호출

pager.setOnPageChangeListener(pageChangeListener); 

5) OnPageChangeListener 구현 : 당신은 ViewPager에 OnPageChangeListener 설정 때마다 콜백 얻을 ViewPager 다른 페이지를 표시 할 때 수 ViewPager 페이지 변화에 대한 4) 전화 인터페이스 방법 새 위치 및 PagerAdapter의 도움으로 새 Fragment에서 인터페이스 메소드를 호출 할 수 있습니다. 여기서 새 조각에 대해서는 onResumeFragment()를 호출하고 현재 조각에 대해서는 onPauseFragment()를 호출 할 수 있습니다.

사용자가 왼쪽에서 오른쪽으로 또는 오른쪽에서 왼쪽으로 스크롤했는지 여부를 알 수 없기 때문에 현재 조각의 위치 (처음에는 현재 위치가 0 임)도 저장해야합니다. 코드에서 의미하는 바를 참조하십시오.

private OnPageChangeListener pageChangeListener = new OnPageChangeListener() { 

    int currentPosition = 0; 

    @Override 
    public void onPageSelected(int newPosition) { 

     FragmentLifecycle fragmentToShow = (FragmentLifecycle)pageAdapter.getItem(newPosition); 
     fragmentToShow.onResumeFragment(); 

     FragmentLifecycle fragmentToHide = (FragmentLifecycle)pageAdapter.getItem(currentPosition); 
     fragmentToHide.onPauseFragment(); 

     currentPosition = newPosition; 
    } 

    @Override 
    public void onPageScrolled(int arg0, float arg1, int arg2) { } 

    public void onPageScrollStateChanged(int arg0) { } 
}; 

코드를 작성하지 않았습니다.전체 자습서 : http://looksok.wordpress.com/2013/11/02/viewpager-with-detailed-fragment-lifecycle-onresumefragment-including-source-code/

+1

감사합니다 dude..this worked – Anirudh

+0

@Someone 어딘가에서 인접한 조각을 다시 시작해야하기 때문에 두 조각 사이를 스크롤 할 수 있습니다. – LordRaydenMK

+1

저는 그것을 알아 냈습니다. 어댑터가 정말로 중요합니다. 모든 조각을 인스턴스화하고 참조를 유지해야합니다. getItem()은 객체를 반환합니다. 불행히도 getItem()은 매번 새로운 Fragment1, Fragment2 등을 생성했습니다. 그러나 여전히 ViewPager 내부의 단편을 사용하는 것은 너무 복잡합니다. 현재 구현은 실제로 몇 조각에서만 작동합니다. 그렇지 않으면 힙 사용이 급격하게 늘어납니다. –

1

사용이

viewPager.setOffscreenPageLimit(1); // the number of pages you want to load in background 

ProgressDialogue도 있습니다.

+0

에 이건 내 문제가 해결되지 않는 – Anirudh

+0

이것은 실행 가능한 대답이 아닙니다 –

1

ViewPager은 현재 페이지에 인접한 조각에 대한보기를 만듭니다. 또한 인접한 조각에 필요한 모든 데이터를로드 할 수 있습니다. AsyncTasks를 사용하여 데이터를로드하는 경우이 기능을 사용하면 사용자 환경이 향상됩니다. 그러나 특정 페이지가 뷰 페이지에 의해 열릴 때 이벤트가 필요하면 LordRaydenMK의 솔루션이 작동합니다.

는 ViewPager에 AsyncTasks를 사용하기위한 다음과 같은 스레드에서 내 게시물을 참조 :

AsyncTask runs on each page of the ViewPager

1

안녕 당신은

mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
        @Override 
        public void onPageSelected(int position) { 
         actionBar.setSelectedNavigationItem(position); 
         actionBar.setTitle(getHomePageTitle(position)); 
         Fragment f = getFragrmentManager().findFragmentByTag(
           "" + position); 
         if (f != null) 
          f.refresh(); 
        } 
       }); 

을 변경 페이지에서 각 조각의 각 조각 및 호출 방법의 태그를 사용하여 시도 할 수 있습니다

  @Override 
     public Fragment getItem(int position) { 
      Fragment f=null; 

     switch (position) 
     { 
      case 0: 
       f = new Fragment1(); 
       break; 

      case 1: 
       f = new Fragment2(); 
       break; 

      case 2: 
       f = new Fragment3(); 
       break; 

      case 3: 
       f = new Fragment4(); 
       break; 


      case 4: 
       f = new Fragment5(); 
       break; 

      } 
      f.setTag(""+position); 
      return f; 

     } 
관련 문제