Je veux utiliser com.google.android.material.tabs.TabLayout
avec le nouveau composant Android ViewPager
mise en œuvre androidx.viewpager2.widget.ViewPager2
. Cependant, le setupWithViewPager(..)
méthode fournie par TabLayout
ne supporte que l'ancien ViewPager
mise en œuvre. Existe-t-il un moyen de lier un TabLayout
à un ViewPager2
facilement ?
Réponses
Trop de publicités?Si vous codez en JAVA. Vous pouvez utiliser l'adaptateur suivant pour le viewPager2 :
public class ViewPagerAdapter extends FragmentStateAdapter {
private static final int CARD_ITEM_SIZE = 10;
public ViewPagerAdapter(@NonNull FragmentActivity fragmentActivity) {
super(fragmentActivity);
}
@NonNull @Override public Fragment createFragment(int position) {
return CardFragment.newInstance(position);
}
@Override public int getItemCount() {
return CARD_ITEM_SIZE;
}
}
Et dans l'activité principale, vous devez avoir quelque chose en ligne avec ce qui suit :
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = findViewById(R.id.view_pager);
tabLayout = findViewById(R.id.tabs);
viewPager.setAdapter(new ViewPagerAdapter(this));
new TabLayoutMediator(tabLayout, viewPager,
new TabLayoutMediator.TabConfigurationStrategy() {
@Override public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
tab.setText("Tab " + (position + 1));
}
}).attach();
}
}
Si le titre de votre onglet provient de string.xml
.
Vous pouvez mettre le fragment
avec title
ensemble dans un List
puis fixer le titre par TabLayoutMediator
. Il vous aide à réorganiser, supprimer ou ajouter facilement de nouveaux fragments.
class MyFragment : Fragment() {
override fun onCreateView(...): View? {
...
TabLayoutMediator(tabLayout, viewPager) { tab, position ->
tab.text = pagerAdapter.getTabTitle(position)
}.attach()
}
private inner class PagerAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {
val pages = listOf(
Pair(HomeFragment.newInstance(), R.string.home),
Pair(GraphFragment.newInstance(), R.string.graph),
Pair(SettingFragment.newInstance(), R.string.setting),
)
override fun createFragment(position: Int): Fragment {
return pages[position].first
}
override fun getItemCount(): Int {
return pages.count()
}
fun getTabTitle(position: Int): String {
return getString(pages[position].second)
}
}
}
Je fais tourner le mien avec l'implémentation 'com.google.Android.material:material:1.2.1' et je n'ai pas non plus utilisé le tabLayoutMediator. Pour commencer, le https://developer.Android.com/jetpack/androidx/migrate/class-mappings ont changé pour le TabLayout dans androidX donc assurez-vous d'utiliser com.google.Android.material.tabs.TabLayout dans votre déclaration d'importation. Voici le reste de mon implémentation de la solution : La déclaration de layout Xml du viewPager et du TabLayout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@color/tan_background"
android:orientation="vertical">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewpager"
app:layout_anchor="@id/tabs"
app:layout_anchorGravity="bottom"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
et le fichier d'activité
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set the content of the activity to use the activity_main.xml layout file
setContentView(layout.activity_main);
// Find the view pager that will allow the user to swipe between fragments
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
// Create an adapter that knows which fragment should be shown on each page
SimpleFragmentPagerAdapter adapter = new SimpleFragmentPagerAdapter(this,getSupportFragmentManager());
// Set the adapter onto the view pager
viewPager.setAdapter(adapter);
// Find the tab layout that shows the tabs
TabLayout tabLayout = findViewById(R.id.tabs);
// Connect the tab layout with the view pager. This will
// 1. Update the tab layout when the view pager is swiped
// 2. Update the view pager when a tab is selected
// 3. Set the tab layout's tab names with the view pager's adapter's titles
// by calling onPageTitle()
tabLayout.setupWithViewPager(viewPager);
}
}
J'ai également utilisé un adaptateur de fragment dans une autre classe où j'ai passé le contexte au constructeur pour les différents onglets.
- Réponses précédentes
- Plus de réponses