java - 如何使用 fragment 将标题放入 ViewPager?

标签 java android android-fragments android-viewpager android-fragmentactivity

我正在使用 ViewPager 允许用户在 fragment 之间滑动。

如何将每个 fragment 的标题添加到屏幕?

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);
        }

    }

}

但它不显示ViewPager 的标题,我不知道为什么。我之前将 ViewPager 与标题一起使用,但不与 fragment 一起使用,现在我无法让标题工作。

最佳答案

您还可以使用 Jake Wharton 的 ViewPagerIndicator库以获得所需的效果。 Davek804 的答案也有效,但它要求您引用整个 ActionBarSherlock 库,如果您只需要一个支持自定义/样式化标题的 ViewPager,这不是最好的选择。

要使其正常工作,只需编写一小段 XML,在 Activity 中初始化 ViewPager,并实现一个 FragmentAdapter(扩展 FragmentPagerAdapter 实现 TitleProvider)以指定哪些页面包含哪些 Fragment

  1. 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. 在您的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. 实现一个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();
            }
        }
    

编辑:

ViewPagerIndicator库支持标题功能:

  1. TitlePageIndicator

    TitlePageIndicator

  2. TabPageIndicator

    TabPageIndicator

  3. CirclePageIndicator

    CirclePageIndicator

关于java - 如何使用 fragment 将标题放入 ViewPager?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10037887/

相关文章:

java - 使用递归返回字符串的反转?

android - 向 MuPDF android 添加注释

android - 在 RelativeLayout 中垂直居中两个 TextView

android - 无法解析方法 Android Studio

java - 无法恢复 Android 应用程序中的 Activity 错误

java - 截击传球网址

java - 使用 Java,在同一个 cmd.exe 窗口中运行多个命令

java - 使用 map 时如何从 Controller 获取数据

android - 如何使用 Object Animator 制作放大动画

php - 使用 json rereiver php mysql 填充 fragment 中的 ListView