🐳 《Android》 安卓开发教程 -页面滑动-Fragment

263 阅读3分钟

一、什么是页面滑动

页面滑动(Fragment)是指在一个屏幕上显示多个内容区域,而用户可以通过滑动手势在这些区域之间切换的一种界面设计模式。它通常被用在移动应用开发中,尤其是在Android开发中,利用 Fragment 来实现多个页面或视图的滑动切换。

1. Fragment的概念

  • Fragment 是一个界面组件,它代表了一个活动(Activity)的一部分。通常,Fragment 可以包含自己的视图和逻辑,也可以在同一个 Activity 中与其他 Fragment 协同工作。它允许一个活动拥有多个可滑动的界面部分,而不用重新加载整个页面。

2. Fragment的特点

  • 可重用性:一个 Fragment 可以在多个不同的 Activity 中使用,从而提高代码的复用性。
  • 灵活性:你可以将多个 Fragment 组合在一起,使用不同的布局管理它们。
  • 生命周期:每个 Fragment 都有自己独立的生命周期,它依赖于宿主的 Activity 生命周期,但也可以在适当的时候进行独立管理。

3. 如何实现页面滑动

页面滑动通常是通过 ViewPager 来实现的。ViewPager 是 Android 提供的一个控件,它支持水平滑动,可以在多个 Fragment 之间切换。

  • 使用ViewPager+Fragment

    • 创建多个 Fragment
    • 使用 ViewPager 来展示这些 Fragment
    • 配合 FragmentPagerAdapterFragmentStatePagerAdapter 来管理 Fragment

4. 常见的页面滑动场景

  • 底部导航栏:用户可以通过滑动在不同的页面之间切换。
  • Tab布局:每个 Tab 对应一个 Fragment,用户可以滑动来查看不同的内容。
  • 引导页:多个引导页面可以通过滑动展示。

tutieshi_640x288_4s.gif

二、具体实战

1.定义UploadDataActivity主页面

package com.imindbot.medicalinformation.ui.settings;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;

import com.google.android.material.tabs.TabLayoutMediator;
import com.imindbot.medicalinformation.R;
import com.imindbot.medicalinformation.data.db.ChildHealthCheckUpLite;
import com.imindbot.medicalinformation.data.db.ElderlySelfCareScoreDataLite;
import com.imindbot.medicalinformation.data.db.HealthCheckUpLite;
import com.imindbot.medicalinformation.data.db.HealthManageLite;
import com.imindbot.medicalinformation.data.db.ResidentArchivesDB;
import com.imindbot.medicalinformation.data.param.HealthCheckUpSaveParam;
import com.imindbot.medicalinformation.data.param.HealthManageParam;
import com.imindbot.medicalinformation.data.param.IllnessDate;
import com.imindbot.medicalinformation.data.param.PreviousIllnessesParam;
import com.imindbot.medicalinformation.data.param.ResidentArchivesParam;
import com.imindbot.medicalinformation.data.response.HealthInfoByIdSearchResponse;
import com.imindbot.medicalinformation.databinding.ActivityResidentNewBinding;
import com.imindbot.medicalinformation.databinding.ActivityUploadDataBinding;
import com.imindbot.medicalinformation.model.ResidentInfoByIdSearchModel;
import com.imindbot.medicalinformation.model.UploadDateViewModel;
import com.imindbot.medicalinformation.ui.healthCheckup.fragment.AdditionalInformationFragment;
import com.imindbot.medicalinformation.ui.healthCheckup.fragment.ExistingHealthIssuesFragment;
import com.imindbot.medicalinformation.ui.healthCheckup.fragment.FragmentAdapter;
import com.imindbot.medicalinformation.ui.healthCheckup.fragment.HealthGeneralFragment;
import com.imindbot.medicalinformation.ui.healthCheckup.fragment.HealthShenghuoFragment;
import com.imindbot.medicalinformation.ui.healthCheckup.fragment.HealthSymptomFragment;
import com.imindbot.medicalinformation.ui.healthCheckup.fragment.OrganFunctionFragment;
import com.imindbot.medicalinformation.ui.healthCheckup.fragment.PhysicalExaminationFragment;
import com.imindbot.medicalinformation.ui.index.IndexActivity;
import com.imindbot.medicalinformation.ui.settings.fragment.ChildHealthCheckupFragment;
import com.imindbot.medicalinformation.ui.settings.fragment.HealthCheckupRecordFragment;
import com.imindbot.medicalinformation.ui.settings.fragment.PhysicalFitnessRecordFragment;
import com.imindbot.medicalinformation.ui.settings.fragment.ResidentFileFragment;
import com.imindbot.medicalinformation.utils.GetTokenUtil;
import com.imindbot.medicalinformation.utils.IllnessHeChen;
import com.imindbot.medicalinformation.utils.IllnessParser;
import com.imindbot.medicalinformation.utils.ToastUtils;
import com.imindbot.medicalinformation.utils.UploadStatusUtil;
import com.king.app.dialog.AppDialog;
import com.king.app.dialog.AppDialogConfig;
import com.king.app.updater.AppUpdater;
import com.king.app.updater.UpdateConfig;
import com.king.app.updater.callback.UpdateCallback;
import com.king.app.updater.http.OkHttpManager;

import org.litepal.LitePal;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

public class UploadDataActivity extends AppCompatActivity {


    private ActivityUploadDataBinding binding;


    private FragmentAdapter fragmentAdapter;

    private List<Fragment> fragmentList;

    private UploadDateViewModel uploadDateViewModel;




    private Toast toast;

    public Context getContext() {
        return this;
    }



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityUploadDataBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        uploadDateViewModel = new ViewModelProvider(this).get(UploadDateViewModel.class);

    

        initData();


    }




    private void initData() {


        fragmentList = new ArrayList<>();
        fragmentList.add(new ResidentFileFragment());
        fragmentList.add(new HealthCheckupRecordFragment());
        fragmentList.add(new PhysicalFitnessRecordFragment());
        fragmentList.add(new ChildHealthCheckupFragment());

        List<String> tableNames = new ArrayList<>();
        tableNames.add("居民档案");
        tableNames.add("健康体检记录");

        fragmentAdapter = new FragmentAdapter(this, fragmentList);
        binding.viewPager.setAdapter(fragmentAdapter);

        // 设置TabLayout的标题和数量
        new TabLayoutMediator(binding.tabLayout, binding.viewPager, (tab, position) -> {
            String tabTitle = tableNames.get(position);
            int sum = sumValues.get(position); // 获取对应Tab的sum值
            tab.setText(tabTitle + " (" + sum + ")");
        }).attach();
    }

  

    @Override
    protected void onResume() {
        super.onResume();
        // 这里调用刷新页面的逻辑
        refreshPageData();
    }


    private void refreshPageData() {
        initData();
    }


}

2.定义滑动页面 ResidentFileFragment

/**
 * 居民档案
 *
 */
public class ResidentFileFragment extends Fragment {

    private static final String Wu = "无";

    private FragmentResidentFileBinding binding;

    private Gson mGon;

    private UpdateDateAdapter mAdapter;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        binding = FragmentResidentFileBinding.inflate(inflater,container,false);
        View rootView = binding.getRoot();

        setupRecyclerView();  // 调用设置 RecyclerView 的方法

        List<ResidentArchivesDB> residentArchivesDBList = getResidentArchivesDBList();
        parser(residentArchivesDBList);

        return rootView;
    }

}

3.编写UploadDataActivity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:orientation="vertical"
    tools:context=".ui.settings.UploadDataActivity">

    <!-- 引入公共标题和搜索部分 -->
    <include
        android:id="@+id/ll_title_bar"
        layout="@layout/layout_checkup_title_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <!--导航栏-->
    <LinearLayout
        android:id="@+id/nav_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:visibility="visible">
        <com.google.android.material.tabs.TabLayout
            android:id="@+id/tabLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            style="@style/TabStyle"/>


    </LinearLayout>

    <!--功能区-->
    <LinearLayout
        android:id="@+id/functional_area"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="vertical"
        android:visibility="visible">
        <androidx.viewpager2.widget.ViewPager2
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal" />

    </LinearLayout>

</LinearLayout>

3.编写UploadDataActivity.xml

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

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:layout_marginLeft="20dp"
            android:background="@color/white"
            android:orientation="vertical">
            
        </LinearLayout>


    </ScrollView>

</RelativeLayout>