1

I have a problem with android a ViewPager setup with FragmentPagerAdapter and TabLayout

TabLayout works fine. But, the code in all tabs run simultaneously. I want the code in the currently selected tab to run

This is my activity

package francesco.prisco.siamostudenti.ui;

import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
import francesco.prisco.siamostudenti.R;
import francesco.prisco.siamostudenti.ui.fragments.CalendarFragment;
import francesco.prisco.siamostudenti.ui.fragments.ChatFragment;
import francesco.prisco.siamostudenti.ui.fragments.EmailFragment;
import francesco.prisco.siamostudenti.ui.fragments.HomeFragment;
import francesco.prisco.siamostudenti.ui.fragments.ProfiloFragment;


public class HomeTabActivity extends AppCompatActivity {

//  private Toolbar toolbar;
    private TabLayout tabLayout;
    private ViewPager viewPager;

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

       //     toolbar = (Toolbar) findViewById(R.id.toolbar);
       //    setSupportActionBar(toolbar);
       //    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);

        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
        setupTabIcons();
    }
    private void setupTabIcons() {
        int[] tabIcons = {
            R.drawable.ic_home,
            R.drawable.ic_calendar,
            R.drawable.ic_chat,
            R.drawable.ic_email,
            R.drawable.ic_profile
        };

        tabLayout.getTabAt(0).setIcon(tabIcons[0]);
        tabLayout.getTabAt(1).setIcon(tabIcons[1]);
        tabLayout.getTabAt(2).setIcon(tabIcons[2]);
        tabLayout.getTabAt(3).setIcon(tabIcons[3]);
        tabLayout.getTabAt(4).setIcon(tabIcons[4]);
    }

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFrag(new HomeFragment(), "HOME");
        adapter.addFrag(new CalendarFragment(), "CALENDAR");
        adapter.addFrag(new ChatFragment(), "CHAT");
        adapter.addFrag(new EmailFragment(), "EMAIL");
        adapter.addFrag(new ProfiloFragment(), "PROFILO");
        viewPager.setAdapter(adapter);
    }
    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 addFrag(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {

            // return null to display only the icon
            return null;
         }
     }
 }

And this is code of a fragment

package francesco.prisco.siamostudenti.ui.fragments;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import francesco.prisco.siamostudenti.R;
import francesco.prisco.siamostudenti.ui.HomeTabActivity;

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_profilo, container, false);
        return rootView;
    }

}    

Help me please

Karthiksrndrn
  • 188
  • 1
  • 12
Engineer
  • 21
  • 1
  • Hard to tell what you're asking, but this might help: http://stackoverflow.com/questions/10024739/how-to-determine-when-fragment-becomes-visible-in-viewpager – Daniel Nugent May 16 '16 at 14:49

2 Answers2

1

Like @Mrugesh Thaker says, all of the Fragment lifecycle functions - onCreateView(), etc. are executed every time the View of a Fragment is inflated.

Here, the View of each Fragment is inflated every time it becomes the adjacent Fragment of the current Fragment page.

So, you should move the 'code each Fragment needs to execute' when it becomes the currently selected Fragment page into an OnPageChangeListener

In your HomeTabActivity, when you set up the ViewPager, add an OnPageChangeListener to yourViewPager

private void setupViewPager(ViewPager viewPager) {    
    .
    .
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener(){
        public void onPageScrollStateChanged (int state){
        }

        public void onPageSelected (int position){
            /*
             * Define the action to be performed for each page.
             * Variable 'position' is the index of the page in the ViewPager
             */  
        }

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

Learning Resource

Karthiksrndrn
  • 188
  • 1
  • 12
0

Actually, view pager works like that. The main aim of view pager is to enable a user to have smooth swipe , so what it does is , it will create all the fragments that you gave at a time to have smooth swiping flow. This is actually the limitation of it because all the methods of fragment lifecycle are called at a time.

Mrugesh
  • 4,381
  • 8
  • 42
  • 84