Fragment+Viewpager实现底部选项卡切换

Fragment+Viewpager实现底部选项卡切换

一、用到的java类文件

  • HomepageActivity
  • MessageFragment
  • HomeFragment
  • RecommendFragment
  • SettingFragment
  • ShareFragment
  • CustomPagerAdapter

二、用到的布局资源文件

  • activity_homepage
  • fragment_message
  • fragment_home
  • fragment_recommend
  • fragment_setting
  • fragment_share
  • styles(res文件中的values文件中)

三、HomepageActivity代码

    public class HomepageActivity extends FragmentActivity implements View.OnClickListener {


    // 获取fragment管理器
    FragmentManager fragmentmanager;

    //声明存储fragment的集合
    private ArrayList<Fragment> fragments;

    //声明四个导航对应fragment
    MessageFragment messageFragment;
    HomeFragment homeFragment;
    RecommendFragment recommendFragment;
    SettingFragment settingFragment;
    ShareFragment shareFragment;

    //声明ViewPager
    private ViewPager viewPager;

    //声明导航栏中对应的布局
    private LinearLayout ll_message, ll_home, ll_recommend, ll_setting, ll_share;

    //声明导航栏中包含的imageview和textview
    private ImageView image_message, image_home, image_recommend, image_setting, image_share;
    private TextView tv_message, tv_home, tv_recommend, tv_setting, tv_share;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_homepage);

        //初始化加载首页布局
        initView();

        //调用自定义initListener方法,为各个组件添加监听事件
        initListener();

        //设置默认选择的pager和导航栏的状态,即优先显示哪个fragment
        viewPager.setCurrentItem(2);
        image_home.setSelected(true);
        tv_home.setSelected(true);

    }

    /**
     * 事件监听
     */
    private void initListener() {

        //为四大导航组件添加监听
        ll_message.setOnClickListener(this);
        ll_home.setOnClickListener(this);
        ll_recommend.setOnClickListener(this);
        ll_setting.setOnClickListener(this);
        ll_share.setOnClickListener(this);

        //为viewpager添加页面变化的监听以及事件处理
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            // 当页面滑动时,这个方法将被调用,无论是编程方式启动一个平滑滚动,还是用户手动触摸滑动。
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            // 当onPageSelected()被调用时,页面切换动画还没结束,还会继续调用onPageScrolled()
            // 当页面滑动时,对应的textview,imageview相应发生改变
            @Override
            public void onPageSelected(int position) {

                // 设置初始状态下底部导航的图标
                resetImg();

                //根据位置直接决定显示哪个fragment
                viewPager.setCurrentItem(position);

                switch (position) {

                    case 0:

                        image_message.setSelected(true);
                        image_message.setImageResource(R.drawable.message_pressed);
                        tv_message.setSelected(true);


                        image_home.setSelected(false);
                        tv_home.setSelected(false);

                        image_recommend.setSelected(false);
                        tv_recommend.setSelected(false);

                        image_setting.setSelected(false);
                        tv_setting.setSelected(false);

                        image_share.setSelected(false);
                        tv_share.setSelected(false);

                        break;

                    case 1:

                        image_message.setSelected(false);
                        tv_message.setSelected(false);


                        image_home.setSelected(true);
                        image_home.setImageResource(R.drawable.home_pressed);
                        tv_home.setSelected(true);

                        image_recommend.setSelected(false);
                        tv_recommend.setSelected(false);

                        image_setting.setSelected(false);
                        tv_setting.setSelected(false);

                        image_share.setSelected(false);
                        tv_share.setSelected(false);

                        break;

                    case 2:

                        image_message.setSelected(false);
                        tv_message.setSelected(false);


                        image_home.setSelected(false);
                        tv_home.setSelected(false);

                        image_recommend.setSelected(true);
                        image_recommend.setImageResource(R.drawable.recommend_pressed);
                        tv_recommend.setSelected(true);


                        image_setting.setSelected(false);
                        tv_setting.setSelected(false);

                        image_share.setSelected(false);
                        tv_share.setSelected(false);

                        break;

                    case 3:

                        image_message.setSelected(false);
                        tv_message.setSelected(false);


                        image_home.setSelected(false);
                        tv_home.setSelected(false);

                        image_recommend.setSelected(false);
                        tv_recommend.setSelected(false);

                        image_setting.setSelected(true);
                        image_setting.setImageResource(R.drawable.setting_pressed);
                        tv_setting.setSelected(true);

                        image_share.setSelected(false);
                        tv_share.setSelected(false);

                        break;

                    case 4:

                        image_message.setSelected(false);
                        tv_message.setSelected(false);

                        image_home.setSelected(false);
                        tv_home.setSelected(false);

                        image_recommend.setSelected(false);
                        tv_recommend.setSelected(false);

                        image_setting.setSelected(false);
                        tv_setting.setSelected(false);

                        image_share.setSelected(true);
                        image_share.setImageResource(R.drawable.share_pressed);
                        tv_share.setSelected(true);

                }

            }

            // 当滑动状态改变时被调用,有助于发现当用户开始拖拽,当页面自动的安放在当前页面,或当页面完全停止
            @Override
            public void onPageScrollStateChanged(int state) {

            }

        });


    }


    /**
     * 加载布局资源文件
     */
    private void initView() {

        //在主布局中根据id找到ViewPager
        viewPager = (ViewPager) findViewById(R.id.viewPager);

        //实例化所属五个fragment
        messageFragment = new MessageFragment();
        homeFragment = new HomeFragment();
        recommendFragment = new RecommendFragment();
        settingFragment = new SettingFragment();
        shareFragment = new ShareFragment();
        fragments = new ArrayList<>();

        //添加fragments到集合中
        fragments.add(messageFragment);
        fragments.add(shareFragment);
        fragments.add(homeFragment);
        fragments.add(recommendFragment);
        fragments.add(settingFragment);

        fragmentmanager = getSupportFragmentManager();

        CustomPagerAdapter adapter = new CustomPagerAdapter(fragmentmanager, fragments);

        viewPager.setAdapter(adapter);
        
        ll_message = (LinearLayout) findViewById(R.id.ll_message);
        ll_share = (LinearLayout) findViewById(R.id.ll_share);
        ll_home = (LinearLayout) findViewById(R.id.ll_home);
        ll_recommend = (LinearLayout) findViewById(R.id.ll_recommend);
        ll_setting = (LinearLayout) findViewById(R.id.ll_setting);

        image_message = (ImageView) findViewById(R.id.tab_message_img);
        image_share = (ImageView) findViewById(R.id.tab_share_img);
        image_home = (ImageView) findViewById(R.id.tab_home_img);
        image_recommend = (ImageView) findViewById(R.id.tab_recommend_img);
        image_setting = (ImageView) findViewById(R.id.tab_setting_img);

        tv_message = (TextView) findViewById(R.id.tv_message);
        tv_share = (TextView) findViewById(R.id.tv_share);
        tv_home = (TextView) findViewById(R.id.tv_home);
        tv_recommend = (TextView) findViewById(R.id.tv_recommend);
        tv_setting = (TextView) findViewById(R.id.tv_setting);

    }


    /**
     * 设置导航栏的点击事件并同步更新对应的ViewPager
     * 点击事件其实就是更改导航布局中对应的Text/ImageView的选中状态
     * 与上述的滑动状态同理
     */

    @Override

    public void onClick(View v) {

        switch (v.getId()) {

            case R.id.ll_message:

                viewPager.setCurrentItem(0); // viewpager显示最左边的fragment,例如messagefragment

                image_message.setSelected(true);
                image_message.setImageResource(R.drawable.message_pressed);
                tv_message.setSelected(true);


                image_home.setSelected(false);
                tv_home.setSelected(false);

                image_recommend.setSelected(false);
                tv_recommend.setSelected(false);

                image_setting.setSelected(false);
                tv_setting.setSelected(false);

                image_share.setSelected(false);
                tv_share.setSelected(false);

                break;

            case R.id.ll_share:

                viewPager.setCurrentItem(1);

                image_message.setSelected(false);
                tv_message.setSelected(false);


                image_home.setSelected(false);
                tv_home.setSelected(false);

                image_recommend.setSelected(false);
                tv_recommend.setSelected(false);

                image_setting.setSelected(false);
                tv_setting.setSelected(false);

                image_share.setSelected(true);
                image_share.setImageResource(R.drawable.share_pressed);
                tv_share.setSelected(true);

                break;

            case R.id.ll_home:

                viewPager.setCurrentItem(2);

                image_message.setSelected(false);
                tv_message.setSelected(false);

                image_home.setSelected(true);
                image_home.setImageResource(R.drawable.home_pressed);
                tv_home.setSelected(true);

                image_recommend.setSelected(false);
                tv_recommend.setSelected(false);

                image_setting.setSelected(false);
                tv_setting.setSelected(false);

                image_share.setSelected(false);
                tv_share.setSelected(false);

                break;

            case R.id.ll_recommend:

                viewPager.setCurrentItem(3);

                image_message.setSelected(false);
                tv_message.setSelected(false);

                image_home.setSelected(false);
                tv_home.setSelected(false);

                image_recommend.setSelected(true);
                image_recommend.setImageResource(R.drawable.recommend_pressed);
                tv_recommend.setSelected(true);

                image_setting.setSelected(false);
                tv_setting.setSelected(false);

                image_share.setSelected(false);
                tv_share.setSelected(false);

                break;

            case R.id.ll_setting:

                viewPager.setCurrentItem(4);

                image_message.setSelected(false);
                tv_message.setSelected(false);


                image_home.setSelected(false);
                tv_home.setSelected(false);

                image_recommend.setSelected(false);
                tv_recommend.setSelected(false);

                image_setting.setSelected(true);
                image_setting.setImageResource(R.drawable.setting_pressed);
                tv_setting.setSelected(true);

                image_share.setSelected(false);
                tv_share.setSelected(false);

                break;

        }

    }

    /**
     * 将当前fragment的图标显示不同状态(初始状态)
     * 例如当前fragment为homefragment,则底部图标为白色
     */

    private void resetImg() {
        image_message.setImageResource(R.drawable.message);
        image_home.setImageResource(R.drawable.home);
        image_recommend.setImageResource(R.drawable.recommend);
        image_setting.setImageResource(R.drawable.setting);
        image_share.setImageResource(R.drawable.share);

    }
}

四、 CustomPagerAdapter代码

public class CustomPagerAdapter extends FragmentPagerAdapter {


    //fragment与viewpager结合
    private List<Fragment> fragments;

    // 构造方法
    public CustomPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
        super(fm);  // 调用父类含参构造方法(FragmentPagerAdapter)
        this.fragments = fragments;   // 将fragment传入Adapter中
        fm.beginTransaction().commit();  // 打开事务、提交事务
    }

    // 根据position返回对应位置的fragment,在instantiateItem(实例化元素)方法中调用
    @Override
    public Fragment getItem(int position) {
        return this.fragments.get(position);
    }


    // 首先调用此方法,计算页面个数
    @Override
    public int getCount() {
        return this.fragments.size();
    }

    // 返回当前item位置(position)
    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        //super.destroyItem(container, position, object);
        // 注释此行代码,不删除当前加载完毕的fragment,避免重复加载
    }

}

五、MessageFragment代码,其他四个部分fragment同理

public class MessageFragment extends android.support.v4.app.Fragment {

    private View view;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_message, null);

        return view;
    }
}

六、activity_homepage代码

<?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">
    <!--页面顶部蓝色条纹 -->
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:gravity="center"
        android:orientation="vertical">


        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:background="#367cf6" />

        <ImageView
            android:layout_width="35dp"
            android:layout_height="35dp"
            android:layout_centerInParent="true" />
    </RelativeLayout>
    
    <!--页面中间部分fragment+viewpager -->
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <FrameLayout
            android:id="@+id/frame_layout"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1">

        </FrameLayout>

        <android.support.v4.view.ViewPager

            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </RelativeLayout>

    <!--灰色水平线 -->
    <View style="@style/bg_line" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <LinearLayout
            android:id="@+id/ll_message"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="#367cf6"
            android:gravity="center"
            android:orientation="vertical">

            <ImageView
                android:id="@+id/tab_message_img"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

            <TextView
                android:id="@+id/tv_message"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="消息"
                android:textColor="#ffffff" />

        </LinearLayout>
        
        <!--灰色竖线 -->
        <View style="@style/bg_line_vertical" />

        <LinearLayout
            android:id="@+id/ll_share"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="#367cf6"

            android:gravity="center"
            android:orientation="vertical">

            <ImageView
                android:id="@+id/tab_share_img"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

            <TextView
                android:id="@+id/tv_share"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="分享"
                android:textColor="#ffffff" />

        </LinearLayout>
        
        <!--灰色竖线 -->
        <View style="@style/bg_line_vertical" />

        <LinearLayout
            android:id="@+id/ll_home"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="#367cf6"

            android:gravity="center"
            android:orientation="vertical">

            <ImageView
                android:id="@+id/tab_home_img"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

            <TextView
                android:id="@+id/tv_home"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="首页"
                android:textColor="#ffffff" />

        </LinearLayout>

        <!--灰色竖线 -->
        <View style="@style/bg_line_vertical" />

        <LinearLayout
            android:id="@+id/ll_recommend"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="#367cf6"

            android:gravity="center"
            android:orientation="vertical">

            <ImageView
                android:id="@+id/tab_recommend_img"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

            <TextView
                android:id="@+id/tv_recommend"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="推荐"
                android:textColor="#ffffff" />

        </LinearLayout>

        <!--灰色竖线 -->
        <View style="@style/bg_line_vertical" />

        <LinearLayout
            android:id="@+id/ll_setting"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="#367cf6"

            android:gravity="center"
            android:orientation="vertical">

            <ImageView
                android:id="@+id/tab_setting_img"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

            <TextView
                android:id="@+id/tv_setting"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="设置"
                android:textColor="#ffffff" />

        </LinearLayout>

    </LinearLayout>

</LinearLayout>

七、fragment_message,其余四个fragment同理

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:text="消息"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

八、styles文件添加view(res文件夹下values文件夹下)

    <!-- view水平分割线样式 -->
    <style name="bg_line">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">1px</item>
        <item name="android:background">#ffffff</item>
    </style>

    <!-- view竖直分割线样式 -->
    <style name="bg_line_vertical">
        <item name="android:layout_width">1px</item>
        <item name="android:layout_height">match_parent</item>
        <item name="android:background">#ffffff</item>
    </style>

参考链接
https://www.cnblogs.com/lianghui66/p/3607091.html
https://blog.csdn.net/baidu_26352053/article/details/72457719
https://blog.csdn.net/baidujiangwei18/article/details/51330813
https://blog.csdn.net/noaboutfengyue/article/details/50354592

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值