J'ai ajouté une disposition relative dans la vue personnalisée et l'ajoutée dans la disposition par onglets. J'utilise un arrière-plan blanc pour les onglets et je n'ai pas appliqué de remplissage dans la disposition personnalisée des onglets. Mais je reçois aussi du rembourrage sur les onglets, ce qui me permet de voir un fond gris dans les onglets comme si Android appliquait un remplissage interne aux onglets. J'essaie d'afficher trois vues de texte, ce que je peux faire, mais l'une d'entre elles est tronquée à cause du remplissage appliqué aux onglets. Aussi, je veux avoir une couleur de fond uniforme pour les onglets.
Voici mon code de mise en page:
activity_home.xml
<?xml version="1.0" encoding="utf-8"?>
<Android.support.design.widget.CoordinatorLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:context="com.customtablayoutapplication.HomeActivity">
<Android.support.design.widget.AppBarLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:theme="@style/AppTheme.AppBarOverlay">
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</Android.support.design.widget.AppBarLayout>
<include layout="@layout/content_home" />
</Android.support.design.widget.CoordinatorLayout>
fragment_home.xml
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
Android:theme="@style/AppTheme.AppBarOverlay"
tools:context="com.customtablayoutapplication.HomeFragment"
tools:showIn="@layout/activity_home">
<Android.support.design.widget.TabLayout
Android:id="@+id/tabs"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
app:tabGravity="fill"
app:tabMode="fixed" />
<Android.support.v4.view.ViewPager
Android:id="@+id/viewpager"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</LinearLayout>
custom_tab.xml`enter code here`
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:background="@Android:color/white"
Android:layout_height="match_parent"
Android:layout_gravity="center">
<TextView
Android:id="@+id/total_request_count"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:layout_alignParentRight="true"
Android:text="12"
Android:textAllCaps="false"
Android:visibility="gone"
Android:textColor="@color/colorPrimaryDark"
Android:textSize="12sp" />
<RelativeLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_centerVertical="true"
Android:fitsSystemWindows="true"
Android:gravity="center">
<TextView
Android:id="@+id/request_status"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:gravity="center"
Android:text="New Request"
Android:textAllCaps="false"
Android:textColor="@color/colorPrimaryDark"
Android:textSize="12sp" />
<TextView
Android:id="@+id/badge_icon"
Android:layout_width="13dp"
Android:layout_height="13dp"
Android:layout_alignParentRight="true"
Android:layout_alignTop="@id/request_status"
Android:layout_marginLeft="-3dp"
Android:layout_marginTop="15dp"
Android:background="@drawable/circular_text_background"
Android:clickable="false"
Android:visibility="gone" />
</RelativeLayout>
</RelativeLayout>
HomeFragment.Java
package com.customtablayoutapplication;
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.view.ViewPager;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.RelativeLayout;
import Android.widget.TextView;
import Java.util.ArrayList;
import Java.util.List;
/**
* A placeholder fragment containing a simple view.
*/
public class HomeFragment extends Fragment {
private ViewPager viewPager;
private TabLayout tabLayout;
public HomeFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home, container, false);
viewPager = (ViewPager) view.findViewById(R.id.viewpager);
setupViewPager(viewPager);
tabLayout = (TabLayout) view.findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
setUpTabIcons();
return view;
}
private void setUpTabIcons() {
RelativeLayout tabNewRequest= (RelativeLayout) LayoutInflater.from(getActivity()).inflate(R.layout.custom_tab, null);
TextView tabNewRequesttxt = (TextView) tabNewRequest.findViewById(R.id.request_status);
tabNewRequesttxt.setText("New Request");
tabLayout.getTabAt(0).setCustomView(tabNewRequest);
RelativeLayout tabInProgress= (RelativeLayout) LayoutInflater.from(getActivity()).inflate(R.layout.custom_tab, null);
TextView tabInProgresstxt = (TextView) tabInProgress.findViewById(R.id.request_status);
tabInProgresstxt.setText("In Progress");
tabLayout.getTabAt(1).setCustomView(tabInProgress);
RelativeLayout tabWorkDone= (RelativeLayout) LayoutInflater.from(getActivity()).inflate(R.layout.custom_tab, null);
TextView tabWorkDonetxt = (TextView) tabWorkDone.findViewById(R.id.request_status);
tabWorkDonetxt.setText("Work Done");
tabLayout.getTabAt(2).setCustomView(tabWorkDone);
RelativeLayout tabDelivered= (RelativeLayout) LayoutInflater.from(getActivity()).inflate(R.layout.custom_tab, null);
TextView tabDeliveredtxt = (TextView) tabDelivered.findViewById(R.id.request_status);
tabDeliveredtxt.setText("Delivered");
tabLayout.getTabAt(3).setCustomView(tabDelivered);
}
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());
adapter.addFragment(new NewRequestFragment(), "New Request");
adapter.addFragment(new InProgressFragment(), "In Progress");
adapter.addFragment(new WorkDoneFragment(), "Work Done");
adapter.addFragment(new DeliveredFragment(), "Delivered");
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 addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
}
<Android.support.design.widget.TabLayout
Android:id="@+id/tab_layout"
Android:layout_width="210dp"
Android:layout_height="28dp"
Android:layout_centerInParent="true"
Android:background="@drawable/bg_forum_tab"
app:tabIndicatorColor="@color/colorBtnBg"
app:tabIndicatorHeight="0dp"
app:tabPaddingBottom="-1dp"
app:tabPaddingEnd="-1dp"
app:tabPaddingStart="-1dp"
app:tabPaddingTop="-1dp"
app:tabSelectedTextColor="@color/colorBtnBg"
app:tabTextColor="@color/colorWhite" />
Définissez tabPaddingStart
/tabPaddingEnd
/tabPaddingTop
/tabPaddingBottom
comme ceci.
Cela a fonctionné pour moi:
Dans votre TabLayout
, vous devez définir tabPaddingEnd
et tabPaddingStart
à 0dp
.
Dans votre affichage personnalisé, vous devez définir layout_width
et layout_height
sur match_parent
afin de remplir tout l'espace avec votre couleur personnalisée.
Le TabLayout:
<Android.support.design.widget.TabLayout
Android:id="@+id/tl_dashboard"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:layout_alignParentBottom="true"
app:tabGravity="fill"
app:tabIndicatorColor="@color/colorRed"
app:tabMode="fixed"
app:tabPaddingStart="0dp"
app:tabPaddingEnd="0dp"/>
Et vue personnalisée:
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<!--Your widgets-->
</RelativeLayout>
Grâce à XML, vous pouvez supprimer uniquement les rembourrages gauche et droit comme celui-ci:
app:tabPaddingEnd="0dp"
app:tabPaddingStart="0dp"
Notez que cette façon ne fonctionne pas pour les rembourrages TOP et BOTTOM, mais je trouve la solution suivante:
Lorsque vous utilisez des vues personnalisées en tant qu'élément de tabulation, vous devez définir LayoutParams sur la vue et définir les rembourrages 0 .
for (int i = 0; i < tabLayout.getTabCount(); i++) {
View tabView = LayoutInflater.from(context)
.inflate(LayoutInflater.from(this), R.layout.item_main_tabview, null, false);
tabView.setLayoutParams(new TableLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
tabView.setPadding(0, 0, 0, 0);
tabLayout.getTabAt(i).setCustomView(tabViewBinding.getRoot());
}
J'ai résolu ce problème en définissant la marge et le remplissage du parent de votre vue personnalisée sur zéro lors de l'ajout de nouveaux onglets à la disposition des onglets.
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
lp.setMargins(0,0,0,0);
TabLayout.Tab newTab = mTabsBottom.newTab().setCustomView(R.layout.view_custom_tab);
setupTabParentLayout(newTab.getCustomView(), lp);
..
..
..
private void setupTabParentLayout(View customView, LinearLayout.LayoutParams lp)
{
LinearLayout tabParent = (LinearLayout) customView.getParent();
tabParent.setLayoutParams(lp);
tabParent.setPadding(0,0,0,0);
}
L'astuce consistait à utiliser LinearLayout.LayoutParams pour le parent de la vue personnalisée.
Je sais que c'est une vieille question, mais cela peut aider quelqu'un d'autre. Le début et la fin du remplissage ne suppriment pas l'espace entre les onglets. La solution est:
Android: clipToPadding = "true"
<Android.support.design.widget.TabLayout
Android:id="@+id/tab_layout"
Android:layout_width="match_parent"
Android:layout_height="80dp"
Android:background="@color/colorGrayBackground"
app:tabGravity="fill"
app:tabPaddingStart="0dp"
app:tabPaddingEnd="0dp"
app:tabContentStart="0dp"
app:tabIndicatorHeight="0dp"
Android:clipToPadding="true"
app:tabMode="fixed" />
Ensuite, vous pouvez définir des rembourrages sur "0dp". J'espère que ça aide quelqu'un.
<Android.support.design.widget.TabLayout
Android:id="@+id/tabview"
app:layout_constraintTop_toBottomOf="@+id/ivpromo"
Android:layout_width="0dp"
app:tabMode="scrollable"
app:tabIndicatorHeight="0dp"
app:tabContentStart="0dp"
Android:clipToPadding="true"
app:tabMaxWidth="45dp"
app:tabGravity="fill"
app:tabPaddingStart="0dp"
app:tabPaddingEnd="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:tabIndicatorColor="@Android:color/transparent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toRightOf="@+id/tvcode"
Android:layout_height="40dp"/>