2

아래의 코드에 문제가 있습니다. 애플리케이션에 5 개의 탭이 있는데, 전환 할 때 onCreateView가 여러 번 호출 된 것으로 나타났습니다. 지금은 처음에 여러 번 onCreateView가 호출 된 유사한 문제에 대한 여러 게시물을 보았습니다.하지만 내 응용 프로그램에서 onCreateView는 전환되는 탭의 수를 기반으로 호출되었습니다. 예를 들어 내가 다운로드 탭이고 FAVORITE로 전환하면 onCreateView가 3 번 호출됩니다. 설정에서 동일한 작업을 수행하면 4 번 호출됩니다. CANDIDATE 및 다른 탭에서도 같은 일이 발생합니다.ViewPager Fragement OnCreateView는 전환 된 탭의 수를 기반으로 여러 번 호출되었습니다.

유사 게시물 -

1-OnCreateView called multiple times/Working with ActionBar and Fragments

2-Android fragment OnCreateView called twice

enter image description here

public class MainActivity extends AppCompatActivity { 
private Toolbar toolbar; 
private TabLayout tabLayout; 
private ViewPager viewPager; 
private Boolean exit = false; 
private static final int REQUEST = 112; 
private Context mContext; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    TextView mTitle = (TextView) toolbar.findViewById(R.id.toolbar_title); 
    setSupportActionBar(toolbar); 
    mTitle.setText(toolbar.getTitle()); 
    getSupportActionBar().setDisplayShowTitleEnabled(false); 
    viewPager = (ViewPager) findViewById(R.id.viewpager); 
    setupViewPager(viewPager); 
    tabLayout = (TabLayout) findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(viewPager); 
    mContext = MainActivity.this; 
    setupTabIcons(); 

} 
@Override 
protected void onResume() 
{ 
    super.onResume(); 

} 
private void setupTabIcons() { 
    tabLayout.getTabAt(0).setIcon(getResources().getDrawable(R.drawable.settings)); 
    tabLayout.getTabAt(1).setIcon(getResources().getDrawable(R.drawable.download)); 
    tabLayout.getTabAt(2).setIcon(getResources().getDrawable(R.drawable.register)); 
    tabLayout.getTabAt(3).setIcon(getResources().getDrawable(R.drawable.profile)); 
    tabLayout.getTabAt(4).setIcon(getResources().getDrawable(R.drawable.favwhite)); 





} 
private void setupViewPager(ViewPager viewPager) { 
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    adapter.addFragment(new SettingsFragment(), getResources().getString(R.string.settings_tab)); 
    adapter.addFragment(new DownloadFragment(), getResources().getString(R.string.download_tab)); 
    adapter.addFragment(new RegisterFragment(), getResources().getString(R.string.register_tab)); 
    adapter.addFragment(new ProfileFragment(), getResources().getString(R.string.profile_tab)); 
    adapter.addFragment(new ProfileFragment(), getResources().getString(R.string.favorites_tab)); 
    viewPager.setAdapter(adapter); 
    viewPager.setOffscreenPageLimit(0); 
} 
class ViewPagerAdapter extends FragmentPagerAdapter { 
    private final List<Fragment> mFragmentList = new ArrayList<>(); 
    private final List<String> mFragmentTitleList = new ArrayList<>(); 

    public ViewPagerAdapter(FragmentManager manager) { 
     super(manager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragmentList.get(position); 
    } 

    @Override 
    public int getCount() { 
     return mFragmentList.size(); 
    } 

    public void addFragment(Fragment fragment, String title) { 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return mFragmentTitleList.get(position); 
    } 
} 
} 

업데이트 - 화면이에 4 배의 데이터를 실행할 때 더 추가하려면 중복되는 4 번. 의 fragment 코드 - 기본보기 호출기으로

public class RegisterFragment extends Fragment{ 

    public RegisterFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 

     return inflater.inflate(R.layout.fragment_register, container, false); 
    } 
    @Override 
    public void setUserVisibleHint(boolean isVisibleToUser) { 
     super.setUserVisibleHint(isVisibleToUser); 
     if (isVisibleToUser) { 
      getFragmentManager().beginTransaction().detach(this).attach(this).commit(); 
     } 
    } 

} 
+0

'viewPager.setOffscreenPageLimit (0);을 제거한 후에 시도하십시오. 기본값이 동일하거나 다른 값은 1입니다. – ADM

+0

@ADM 제거한 후에도 동일한 동작을합니다. 다른 사용자의 문제를 읽은 후에 추가했지만, 도와주세요. – Akshay

답변

1

는 다음과 같은 순서로 조각을로드합니다.

  1. 현재 선택된 위치 조각입니다. 표시
  2. (선택된 위치 - 1) 조각이있는 경우 캐시합니다. 보이지 않음
  3. (선택된 위치 + 1) 조각이있는 경우 캐시합니다. 보이지 않음

이유는 지연없이 하나의 조각에서 다른 조각으로 부드러운 애니메이션을 만들기 위해 페이저가 이전 조각과 다음 조각을 캐시합니다. 이것을 확인하려면 뷰 페이지 어댑터에서 getItem() 메서드의 위치를 ​​기록하십시오.

위의 결과. 활동을 시작할 때 viewpager가 위치 0과 1을로드하고 있습니다. 즉, 2 조각을로드 중입니다. -1 위치에 조각이 없습니다.

+0

감사합니다. @Anbarasu Chinna, 예를 들려주세요. 어떻게 도움이 될지 명확하지 않다. 이것은 처음으로 뷰 페이지 어댑터를 사용하고있다. – Akshay

+0

내가 getItem에서 아래 옵션을 시도했지만, 그 중 하나도 도움이되지 않았다 언급 깜빡. 스위치 케이스 0 : 다운로드 파편 tab1 = 새로운 DownloadFragment(); return tab1; – Akshay

+0

당신은 귀하의 단편으로 질문을 게시하거나 업데이트 할 수 있습니까 –