diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index 720e0f216..88a4c9c63 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -30,6 +30,7 @@ import org.schabi.newpipe.settings.tabs.Tab; import org.schabi.newpipe.settings.tabs.TabsManager; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.ServiceHelper; +import org.schabi.newpipe.views.ScrollableTabLayout; import java.util.ArrayList; import java.util.List; @@ -37,7 +38,7 @@ import java.util.List; public class MainFragment extends BaseFragment implements TabLayout.OnTabSelectedListener { private ViewPager viewPager; private SelectedTabsPagerAdapter pagerAdapter; - private TabLayout tabLayout; + private ScrollableTabLayout tabLayout; private List tabsList = new ArrayList<>(); private TabsManager tabsManager; diff --git a/app/src/main/java/org/schabi/newpipe/views/ScrollableTabLayout.java b/app/src/main/java/org/schabi/newpipe/views/ScrollableTabLayout.java new file mode 100644 index 000000000..88b108052 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/views/ScrollableTabLayout.java @@ -0,0 +1,83 @@ +package org.schabi.newpipe.views; + +import android.content.Context; +import android.os.Build; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; +import android.view.ViewTreeObserver.OnGlobalLayoutListener; + +import androidx.annotation.NonNull; + +import com.google.android.material.tabs.TabLayout; +import com.google.android.material.tabs.TabLayout.Tab; + +/** + * A TabLayout that is scrollable when tabs exceed its width. + */ +public class ScrollableTabLayout extends TabLayout { + private static final String TAG = ScrollableTabLayout.class.getSimpleName(); + + public ScrollableTabLayout(Context context) { + super(context); + } + + public ScrollableTabLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public ScrollableTabLayout(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + + setTabMode(TabLayout.MODE_FIXED); + resetMode(); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + + resetMode(); + } + + @Override + public void addTab(@NonNull Tab tab, int position, boolean setSelected) { + super.addTab(tab, position, setSelected); + + resetMode(); + } + + @Override + public void removeTabAt(int position) { + super.removeTabAt(position); + + resetMode(); + } + + private void resetMode() { + if (getTabCount() == 0 || getTabAt(0).view == null) return; + setTabMode(TabLayout.MODE_FIXED); + + int layoutWidth = getWidth(); + int minimumWidth = ((View) getTabAt(0).view).getMinimumWidth(); + if (minimumWidth * getTabCount() > layoutWidth) { + setTabMode(TabLayout.MODE_SCROLLABLE); + return; + } + + int actualWidth = 0; + for (int i = 0; i < getTabCount(); ++i) { + if (getTabAt(i).view == null) return; + actualWidth += ((View) getTabAt(i).view).getWidth(); + if (actualWidth > layoutWidth) { + setTabMode(TabLayout.MODE_SCROLLABLE); + return; + } + } + } +} diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index 85614342d..1a2455691 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -6,12 +6,13 @@ android:layout_height="match_parent"> -