0

I am implementing bottom tab for my app ,When i switch between tabs ,tab indicator will lags(slow loading).I am using tablayout was positioning bottom. In this case i am loading four fragment on click of each tab i.e yourday, yourtime, punchanga, kundali.its delaying about 1 second each time while loading the fragments

public class MainPage extends MyActivity {
private static final int LOC_PER = 201;
YourDay yourDay;
YourTime yourTime;
Panchang panchang;
Kundali kundali;
Advice advice;
FrameLayout dummy;
TabLayout tabs;
private static MainPage inst;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    adjustFontScale(getResources().getConfiguration());
    setContentView(R.layout.main_page);
    dummy = findViewById(R.id.mp_dummy);
    yourDay = new YourDay();
    tabs = findViewById(R.id.mp_tabs);
    tabs.setTabIndicatorFullWidth(false);
    tabs.addTab(tabs.newTab().setText(getResources().
    getString(R.string.yday)).setIcon(R.drawable.your_day_w));
    tabs.addTab(tabs.newTab().setText(getResources().
    getString(R.string.ytime)).setIcon(R.drawable.your_time_w));
    tabs.addTab(tabs.newTab().setText(getResources().
    getString(R.string.panchang)).setIcon(R.drawable.panchang_w));
    tabs.addTab(tabs.newTab().setText(getResources().
    getString(R.string.kundali)).setIcon(R.drawable.kundali_w));
    getLocationPermission();
    setCurrentTab(tabs.getTabAt(0));
    tabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            setCurrentTab(tab);
        }
        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
            tab.getIcon().
   setColorFilter(ContextCompat.getColor(getApplicationContext(), 
   R.color.white),
                    PorterDuff.Mode.SRC_IN);
        }
        @Override
        public void onTabReselected(TabLayout.Tab tab) { }
    });
}

public void showAdvice(){
        advice = new Advice(MainPage.this, 
 android.R.style.Theme_Light_NoTitleBar);
    advice.show();
}
public void goToProfiles(){
    startActivity(new Intent(getApplicationContext(), 
 SwitchProfile.class));
}
public void setDates(TextView d, TextView my){
    Calendar calendar = Calendar.getInstance();
    SimpleDateFormat dayFormat = new SimpleDateFormat("EEEE", 
Locale.getDefault());
    SimpleDateFormat monthFormat = new SimpleDateFormat("MMM", 
 Locale.getDefault());
    final String today = dayFormat.format(calendar.getTime());
    d.setText(String.valueOf(calendar.get(Calendar.DAY_OF_MONTH)));
    String t = today + "\n"
            + monthFormat.format(calendar.getTime()) + ", " + 
      String.valueOf(calendar.get(Calendar.YEAR));
    my.setText(t);
}

private void setCurrentTab(TabLayout.Tab tab) {
    tab.getIcon().
 setColorFilter(ContextCompat.getColor(getApplicationContext(), 
 R.color.black),
            PorterDuff.Mode.SRC_IN);
    switch (tab.getPosition()) {
        case 0:
            setFrag(yourDay);
            break;
        case 1:
            if(yourTime == null){
                yourTime = new YourTime();
            }
            setFrag(yourTime);
            break;
        case 2:
            if(panchang == null){
                panchang = new Panchang();
            }
            setFrag(panchang);
            break;
        case 3:
            if(kundali == null){
                kundali = new Kundali();
            }
            setFrag(kundali);
            break;
    }
}
void setFrag(Fragment fragment) {

    getSupportFragmentManager().beginTransaction()
            .replace(R.id.mp_dummy, fragment)
            .commit();
}
@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

void getLocationPermission() {
    if (ActivityCompat.checkSelfPermission(getApplicationContext(), 
   Manifest.permission.ACCESS_FINE_LOCATION) != 
 PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(getApplicationContext(), 
  Manifest.permission.ACCESS_COARSE_LOCATION) != 
  PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(MainPage.this, new String[] 
  {Manifest.permission.ACCESS_COARSE_LOCATION,
                Manifest.permission.ACCESS_FINE_LOCATION}, LOC_PER);
    }}
public static MainPage instance() {
    return inst;
}
}
Ravichandra S V
  • 129
  • 1
  • 6

1 Answers1

0

The stutter is due to the fragments being replaced, every time tabs are switched.

Consider using a ViewPager in conjunction with your TabLayout A view pager can retain multiple fragments in memory, so you can switch between them without loading/unloading the fragments.

A good example on how this can be done : https://medium.com/@Abdulkadir98/android-sliding-tabs-with-viewpager-851f9c996cb5

Vinay W
  • 9,912
  • 8
  • 41
  • 47
  • I don`t want viewpager because in each fragment there is viewpager attached to it ,so there i am using. – Ravichandra S V Jun 25 '19 at 10:04
  • You could still use ViewPager on the top level. If you are worried about the swiping UX/conflict between top level and lower level view pagers, you can disable swiping in one of them - https://stackoverflow.com/questions/9650265/how-do-disable-paging-by-swiping-with-finger-in-viewpager-but-still-be-able-to-s – Vinay W Jun 25 '19 at 10:13