Android——ViewPager和Fragment混合使用

ViewPager经常用来连接Fragment,它很方便管理每个页面的生命周期,使用ViewPager管理Fragment是标准的适配器实现。最常用的实现一般有FragmentPagerAdapter和FragmentStatePagerAdapter。通过为UI添加ViewPager后,用户可以左右滑动屏幕,切换到不同的Fragment页面。
下面将通过一个简单的实例进行ViewPager和Fragment混合使用。
在这里插入图片描述
我们设计了三个按钮分别是首页、联系人和我的,并创建了3个Fragment页面。不但可以通过左右滑动实现页面切换,也可以通过按钮点击切换页面。下面我们来看一下详细代码。

一、创建一个Activity命名为FragmentViewPagerActivity.java和一个布局文件activity_view_pager.xml,具体代码如下:

activity_view_pager.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context=".FragmentViewPagerActivity"
    android:orientation="vertical">
    <androidx.viewpager.widget.ViewPager
        android:id="@+id/fragment_view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/linear">

    </androidx.viewpager.widget.ViewPager>
    <LinearLayout
        android:id="@+id/linear"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal">
        <Button
            android:id="@+id/btn_previous"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="首页"
            android:layout_weight="1">

        </Button>
        <Button
            android:id="@+id/btn_middle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="联系人"
            android:layout_marginLeft="2dp"
            android:layout_marginRight="2dp"
            android:layout_weight="1">

        </Button>
        <Button
            android:id="@+id/btn_next"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="我的"
            android:layout_weight="1">

        </Button>


    </LinearLayout>

</RelativeLayout>

FragmentViewPagerActivity .java

package com.example.myapplication;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.fragment.app.FragmentStatePagerAdapter;
import androidx.viewpager.widget.ViewPager;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class FragmentViewPagerActivity extends AppCompatActivity{
    private ViewPager viewPager;
    private FragmentManager fragmentManager;
    private Button mBtnPrevious;
    private Button mBtnMiddle;
    private Button mBtnNext;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_pager);

        //初始化3个按钮,绑定布局文件的按钮控件并实现其点击事件
        mBtnInit();


        //绑定viewPager并获得fragmentManager实例
        viewPager = findViewById(R.id.fragment_view_pager);
        fragmentManager = getSupportFragmentManager();


        //设置viewPager的起始页面和按钮的起始状态
        viewPager.setCurrentItem(0);
        mBtnPrevious.setBackgroundColor(0xFF87F00D);

        //设置viewPager的Adapter,得到当前的Fragment页面
        viewPager.setAdapter(new FragmentStatePagerAdapter(fragmentManager) {
            @NonNull
            @Override
            public Fragment getItem(int position) {
                return createFragment(position);
            }

            @Override
            public int getCount() {
                return 3;
            }
        });

        //设置viewPager的界面改变监听
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }


            @Override
            public void onPageSelected(int position) {

                clearAllBtnStatus();

                switch (position){
                    case 0:
                        mBtnPrevious.setBackgroundColor(0xFF87F00D);
                       break;
                    case 1:
                        mBtnMiddle.setBackgroundColor(0xFF87F00D);
                        break;
                    case 2:
                        mBtnNext.setBackgroundColor(0xFF87F00D);
                        break;
                    default:
                        break;
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });


    }

    //初始化3个按钮,绑定布局文件的按钮控件并实现其点击事件
    private void mBtnInit() {

        mBtnPrevious = findViewById(R.id.btn_previous);
        mBtnMiddle = findViewById(R.id.btn_middle);
        mBtnNext = findViewById(R.id.btn_next);

        mBtnPrevious.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewPager.setCurrentItem(0);
            }
        });
        mBtnMiddle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewPager.setCurrentItem(1);
            }
        });
        mBtnNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewPager.setCurrentItem(2);
            }
        });

        clearAllBtnStatus();
    }

    //用于清除按钮的背景颜色状态
    private void clearAllBtnStatus() {

        mBtnPrevious.setBackgroundColor(0xffffffff);
        mBtnMiddle.setBackgroundColor(0xffffffff);
        mBtnNext.setBackgroundColor(0xffffffff);
    }

    //创建不同的Fragment页面
    private  Fragment createFragment(int position) {

        switch (position){
            case 0:
                return new FragmentOne();
            case 1:
                return new FragmentTwo();
            case 2:
                return new FragmentThree();
            default:
                break;
        }
        return null;
    }


}

二、分别创建3个Fragment的子类FragmentOne.java、FragmentTwo.java、FragmentThree.java和3个对用的fragment布局文件fragment_one.xml、fragment_two.xml、fragment_three.xml。代码如下:

FragmentOne.java

package com.example.myapplication;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;


import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

public class FragmentOne extends Fragment {
    private TextView tvPrevious;


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

        tvPrevious = view.findViewById(R.id.tv_previous);
        return view;
    }
}

fragment_one.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:background="#4CAF50"
    android:orientation="vertical"
    android:gravity="center">
    <TextView
        android:id="@+id/tv_previous"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="首页界面"
        android:textSize="30sp"
        android:textColor="#000000"
        android:gravity="center">

    </TextView>


</LinearLayout>

注意:本实例的FragmentTwo.java、FragmentThree.java与FragmentOne.java类似,fragment_two.xml、fragment_three.xml与fragment_one.xml类似,不再复述。

推荐阅读:
Android——Fragment的静态注册和动态注册

发布了10 篇原创文章 · 获赞 3 · 访问量 3280

猜你喜欢

转载自blog.csdn.net/qq_43567345/article/details/104214320