Comment puis-je placer des titres dans ViewPager en utilisant des fragments?

J'utilise ViewPager pour permettre aux utilisateurs de glisser entre les fragments.

Comment puis-je ajouter le titre de chaque fragment à l'écran?

  • Bibliothèque de support VectorDrawable Resources $ NotFoundException
  • Android Studio 2.2 Aperçu 3 Erreur de mise en page
  • Comment faire HTTP demande dans Android
  • Vous ne trouvez pas un exemple approprié pour la classe de sprite Android 2d OpenGL qui n'utilise pas GL11Ext pour le dessin
  • Comment construire une mise en page des astuces du clavier dans Android
  • Android: le moyen le plus simple de changer la couleur d'un fichier png
  • package com.multi.andres; import java.util.List; import java.util.Vector; import com.viewpagerindicator.TitlePageIndicator; import com.viewpagerindicator.TitleProvider; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; public class ViewPagerFragment extends FragmentActivity{ private PagerAdapter mPagerAdapter; //contiene el pager adapter private static String[] titulosPaginas = { "APP 1", "APP 2" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.lcmeter); //layout que contiene el ViewPager initialisePaging(); //inicializo las paginas } private void initialisePaging() { List<Fragment> fragments = new Vector<Fragment>(); fragments.add(Fragment.instantiate(this, FragmentPrueba1.class.getName())); fragments.add(Fragment.instantiate(this, FragmentPrueba2.class.getName())); this.mPagerAdapter = new PagerAdapter(super.getSupportFragmentManager(), fragments); ViewPager pager = (ViewPager)super.findViewById(R.id.pager); pager.setAdapter(this.mPagerAdapter); //Agrega los titulos TitlePageIndicator titleIndicator = (TitlePageIndicator) findViewById(R.id.titulos); //layout XML titleIndicator.setViewPager(pager); } /** ************************************************************************************************* /** Clase: public class PagerAdapter extends FragmentPagerAdapter implements TitleProvider /** Notas: extends FragmentPagerAdapter permite el uso de las paginas de ViewPager pero con Fragments /** implements TitleProvider permite el uso de los titulos en las paginas /** Funcion: crea paginas por las cuales deslizarse horizontalmente las cuales son usadas ****************************************************************************************************/ public class PagerAdapter extends FragmentPagerAdapter implements TitleProvider { private List<Fragment> fragments; public String getTitle(int position) { // TODO Auto-generated method stub return titulosPaginas[position]; // titulo de la pagina } public PagerAdapter(FragmentManager fm, List<Fragment> fragments) { super(fm); this.fragments = fragments; } @Override public int getCount() { return this.fragments.size(); } @Override public Fragment getItem(int position) { return this.fragments.get(position); } } } 

    Mais il ne montre pas les titres de ViewPager et je ne sais pas pourquoi. J'ai utilisé ViewPager avec des titres avant mais pas avec des fragments et je ne peux pas obtenir de titres fonctionnant maintenant.

  • Est-ce que iOS 7 Multipeer Connectivity est compatible avec Android Wi-Fi Direct?
  • Manipulation Intercept touch event sans étendre ViewGroup
  • Android: redirige les appels sortants
  • Erreur: Impossible d'exécuter une action de compilation à l'aide de l'installation Gradle 'C: \ Program Files \ Android \ Android Studio1 \ gradle \ gradle-2.2.1'
  • Le groupe de vue le plus léger pour les conteneurs
  • Rapports de Play Store "Votre appareil n'est pas compatible avec cette version" mais il s'installe via AdB uniquement sur Nexus7
  • 4 Solutions collect form web for “Comment puis-je placer des titres dans ViewPager en utilisant des fragments?”

    Vous pouvez également utiliser la bibliothèque ViewPagerIndicator de Jake Wharton pour obtenir l'effet désiré. La réponse de Davek804 fonctionne aussi, mais elle nécessite de faire référence à l'ensemble de la bibliothèque ActionBarSherlock, ce qui n'est pas préférable si vous avez besoin d'un ViewPager compatible avec des titres personnalisés ou stylés.

    Le fait de configurer correctement le travail est simplement une question d'écriture d'un peu de XML, d'initialisation de votre ViewPager dans votre Activity , et la mise en œuvre d'un FragmentAdapter (qui extends FragmentPagerAdapter implements TitleProvider ) pour spécifier les pages extends FragmentPagerAdapter implements TitleProvider ce Fragment .

    1. Mise en page XML

       <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <com.viewpagerindicator.TabPageIndicator android:id="@+id/titles" android:layout_height="wrap_content" android:layout_width="match_parent"/> <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/> </LinearLayout> 
    2. Initialiser dans votre Activity

       //Set the pager with an adapter ViewPager pager = (ViewPager)findViewById(R.id.pager); pager.setAdapter(new CustomAdapter(getSupportFragmentManager())); //Bind the title indicator to the adapter TitlePageIndicator titleIndicator = (TitlePageIndicator) findViewById(R.id.titles); titleIndicator.setViewPager(pager); 
    3. Mettre en place un CustomFragmentAdapter

       public static class CustomFragmentAdapter extends FragmentPagerAdapter implements TitleProvider { public static final int POSITION_PAGE_1 = 0; public static final int POSITION_PAGE_2 = 1; public static final int POSITION_PAGE_3 = 2; private static final String[] TITLES = new String[] { "Title 1", "Title 2", "Title 3" }; public static final int NUM_TITLES = TITLES.length; public CustomFragmentAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { switch (position) { case POSITION_TITLE_1: return PageOneFragment.newInstance(); case POSITION_TITLE_2: return PageTwoFragment.newInstance(); case POSITION_TITLE_3: return PageThreeFragment.newInstance(); } return null; } @Override public int getCount() { return NUM_TITLES; } @Override public String getTitle(int position) { return TITLES[position % NUM_TITLES].toUpperCase(); } } 

    Modifier:

    La bibliothèque ViewPagerIndicator prend en charge les fonctionnalités de titrage:

    1. TitlePageIndicator

      TitlePageIndicator

    2. TabPageIndicator

      TabPageIndicator

    3. CirclePageIndicator

      CirclePageIndicator

    Ou si vous ne souhaitez pas utiliser de la bibliothèque de la troisième partie, vous pouvez utiliser la classe v4 PagerTabStrip support. Par exemple:

     <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="0px" android:layout_weight="1"> <android.support.v4.view.PagerTabStrip android:id="@+id/pts_main" android:layout_width="match_parent" android:layout_height="wrap_content" /> </android.support.v4.view.ViewPager> 

    Et dans la méthode PagerAdapter override getPageTitle:

     public static class MyAdapter extends FragmentPagerAdapter { ... @Override public CharSequence getPageTitle(int position) { return String.valueOf(position); } } 

    Vous pouvez accéder à l'élément xml à partir d'un code comme celui-ci:

     protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.pager); ... mAdapter = new MyAdapter(getSupportFragmentManager()); // Add custom adapter mPager = (ViewPager)findViewById(R.id.pager); mPager.setAdapter(mAdapter); // Get PagerTabStrip PagerTabStrip strip = (PagerTabStrip) findViewById(R.id.pts_main); strip.setDrawFullUnderline(false); ... 

    J'espère que cela aidera quelqu'un

    Où le mien dit SherlockFragmentActivity, vous pouvez simplement avoir FragmentActivity. GetSupportActionBar peut être getActionBar ().

     public class Polling extends SherlockFragmentActivity implements OnMenuItemClickListener { private ViewPager mViewPager; private TabsAdapter mTabsAdapter; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mViewPager = new ViewPager(this); mViewPager.setId(R.id.pager); setContentView(mViewPager); bar = getSupportActionBar(); bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); bar.setDisplayShowTitleEnabled(false); bar.setDisplayShowHomeEnabled(false); mTabsAdapter = new TabsAdapter(this, mViewPager); mTabsAdapter.addTab(bar.newTab().setText(R.string.login), LoginFragment.class, null); mTabsAdapter.addTab(bar.newTab().setText(R.string.economics), EconFragment.class, null); mTabsAdapter.addTab(bar.newTab().setText(R.string.elections), ElectionsFragment.class, null); mTabsAdapter.addTab(bar.newTab().setText(R.string.politics), PoliticsFragment.class, null); mTabsAdapter.addTab(bar.newTab().setText(R.string.science), ScienceFragment.class, null); mTabsAdapter.addTab(bar.newTab().setText(R.string.finance), FinanceFragment.class, null); mTabsAdapter.addTab(bar.newTab().setText(R.string.religion), ReligionFragment.class, null); mTabsAdapter.addTab(bar.newTab().setText(R.string.military), MilitaryFragment.class, null); mTabsAdapter.addTab(bar.newTab().setText(R.string.international), InternationalFragment.class, null); } public static class TabsAdapter extends FragmentPagerAdapter implements ActionBar.TabListener, ViewPager.OnPageChangeListener { private final Context mContext; private final ActionBar mActionBar; private final ViewPager mViewPager; private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); static final class TabInfo { private final Class<?> clss; private final Bundle args; TabInfo(Class<?> _class, Bundle _args) { clss = _class; args = _args; } } public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) { super(activity.getSupportFragmentManager()); mContext = activity; mActionBar = activity.getSupportActionBar(); mViewPager = pager; mViewPager.setAdapter(this); mViewPager.setOnPageChangeListener(this); } public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) { TabInfo info = new TabInfo(clss, args); tab.setTag(info); tab.setTabListener(this); mTabs.add(info); mActionBar.addTab(tab); notifyDataSetChanged(); } public int getCount() { return mTabs.size(); } public SherlockFragment getItem(int position) { TabInfo info = mTabs.get(position); return (SherlockFragment)Fragment.instantiate(mContext, info.clss.getName(), info.args); } public void onPageSelected(int position) { mActionBar.setSelectedNavigationItem(position); } public void onPageScrollStateChanged(int state) {} public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} public void onTabSelected(Tab tab, FragmentTransaction ft) { mViewPager.setCurrentItem(tab.getPosition()); //Log.v(TAG, "clicked"); Object tag = tab.getTag(); for (int i=0; i<mTabs.size(); i++) { if (mTabs.get(i) == tag) { mViewPager.setCurrentItem(i); } } } public void onTabUnselected(Tab tab, FragmentTransaction ft) {} public void onTabReselected(Tab tab, FragmentTransaction ft) {} public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {} public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {} } } 

    @Alex Lockwood Merci 🙂 J'ai encore un problème: / C'est mon XML:

    Lcmeter.xml

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="fill_parent" android:layout_height="fill_parent" > </android.support.v4.view.ViewPager> <com.viewpagerindicator.TitlePageIndicator android:id="@+id/titulos" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> 

    Dans mon premier code dans la première publication, si un "TitlePageIndicator" a été "android.support.v4.view.ViewPager", je peux voir les titres, mais je ne peux pas faire de swype en cliquant seulement sur les titres, modifiez les pages et mes fragments ne sont pas affichés, mais avec Le XML de cette façon, je peux passer à travers mes fragments, mais je ne vois pas les titres: /. J'ai essayé avec les constructeurs de cette façon:

     package com.multi.andres; import java.util.List; import java.util.Vector; import com.viewpagerindicator.TitlePageIndicator; import com.viewpagerindicator.TitleProvider; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; public class ViewPagerFragment extends FragmentActivity{ private PagerAdapter mPagerAdapter; //contiene el pager adapter String[] titulosPaginas = { "APP 1", "APP 2" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.lcmeter); //layout que contiene el ViewPager initialisePaging(); //inicializo las paginas } private void initialisePaging() { List<Fragment> fragments = new Vector<Fragment>(); fragments.add(Fragment.instantiate(this, FragmentPrueba1.class.getName())); fragments.add(Fragment.instantiate(this, FragmentPrueba2.class.getName())); this.mPagerAdapter = new PagerAdapter(super.getSupportFragmentManager(), fragments); ViewPager pager = (ViewPager)super.findViewById(R.id.pager); pager.setAdapter(this.mPagerAdapter); //Agrega los titulos TitlePageIndicator titleIndicator = (TitlePageIndicator) findViewById(R.id.titulos); //layout XML titleIndicator.setViewPager(pager); } /** ************************************************************************************************* /** Clase: public class PagerAdapter extends FragmentPagerAdapter implements TitleProvider /** Notas: extends FragmentPagerAdapter permite el uso de las paginas de ViewPager pero con Fragments /** implements TitleProvider permite el uso de los titulos en las paginas /** Funcion: crea paginas por las cuales deslizarse horizontalmente las cuales son usadas ****************************************************************************************************/ public class PagerAdapter extends FragmentPagerAdapter implements TitleProvider { private List<Fragment> fragments; public String getTitle(int position) { // TODO Auto-generated method stub return titulosPaginas[position]; // titulo de la pagina } public PagerAdapter(FragmentManager fm, List<Fragment> fragments) { super(fm); this.fragments = fragments; } @Override public int getCount() { return this.fragments.size(); } @Override public Fragment getItem(int position) { try { FragmentPrueba1.class.newInstance(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } return this.fragments.get(position); } } } 

    Mais j'ai un FC lorsque j'ouvre l'application. Voici mon fragment tous les deux sont égaux:

     package com.multi.andres; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; public class FragmentPrueba1 extends Fragment { FragmentPrueba1 (){ } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return (LinearLayout)inflater.inflate(R.layout.prueba1, container, false); } } 

    Il s'agit de fragments XML:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#FF0000" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Numero 1 !!" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Esto es un boton XD" /> </LinearLayout> 

    J'ai lu sur les fragments, mais je ne peux pas travailler avec des fragments avec des titres et cela n'a pas de sens: / Je suis nouveau à ce sujet, mais j'apprends et c'est très compliqué pour moi, ce genre de choses, je vous remercie beaucoup pour votre aide, je l'apprécie vraiment 🙂

    MODIFIER:

    Je pense que j'ai fondé le problème, ce n'est pas sur le code Java, le problème est sur le fichier XML ViewPager:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="fill_parent" android:layout_height="fill_parent" > </android.support.v4.view.ViewPager> <com.viewpagerindicator.TitlePageIndicator android:id="@+id/titulos" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> 

    Cela semble «surpasser» les titres parce que si j'utilise un fichier XML de l'exemple de Google qui ajoute Android: layout_weight = "1" sur android.support.v4.view.ViewPager, je peux voir les titres en bas de l'écran, Pas sur le dessus mais est une progression 🙂

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.