2

I am having trouble with below code, i have 5 tabs in my application and when i am trying to switch through them i just noticed that onCreateView is called multiple times. Now first i did saw multiple post about similar issue where multiple times onCreateView is called, but mine is lit bit different, in my application onCreateView is called based on number of tabs i am switching. For example if i am DOWNLOAD tab and i switch to FAVORITE, onCreateView will be called 3 times. If i do same action from settings it will be called 4 times. Same thing happens with CANDIDATE and other tab.

Similar Posts -

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);
    }
}
}

Update - To add more when it is run 4 times the data on screen is 4 times which is duplicate. Fragement Code -

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();
        }
    }

}
Akshay
  • 657
  • 2
  • 19
  • 38
  • Try after remove `viewPager.setOffscreenPageLimit(0);` same result or different by default its value is 1. – ADM Dec 20 '17 at 06:37
  • @ADM it's same behavior even after i remove that, i added that after reading other users issues, but it didn't help me. – Akshay Dec 20 '17 at 14:38

1 Answers1

2

By default view pager load the fragment in the following order.

  1. Currently selected position fragment. Visible
  2. Cache for the (selected position - 1) fragment, if any. Not visible
  3. Cache for the (selected position + 1) fragment, if any. Not visible

Reason for this is, to make smooth animation from one fragment to another without lagging, view pager caches the previous and the next fragment. To confirm this log the position in the getItem() method in the view pager adapter.

As a result of above. When launching activity your viewpager is loading position 0 and 1. ie loading 2 fragment. There is no fragment in -1 position.

Anbarasu Chinna
  • 975
  • 9
  • 28
  • Thanks @Anbarasu Chinna, could you please share an example. I am not clear how it will be helpful, this is first time i am using viewpage adapter. – Akshay Dec 20 '17 at 14:47
  • forgot to mention i tried below option in getItem, but that didn't help either. switch case 0: DownloadFragment tab1 = new DownloadFragment(); return tab1; – Akshay Dec 20 '17 at 17:49
  • can you post or update your question with your Fragments – Anbarasu Chinna Dec 21 '17 at 06:45
  • i have added my fragment section for one class, similarly i have 3 more tabs and they do some activity after load inside. – Akshay Dec 21 '17 at 15:27
  • @AnbarasuChinna If I have 3 tabs and one `Fragment` and load this fragment in the 3 tabs . In each time give me a different result . So how can I catch the first call of the fragment and the second call ? – Ahmed Jul 11 '18 at 08:33