一、什么是页面滑动
页面滑动(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。 - 配合
FragmentPagerAdapter或FragmentStatePagerAdapter来管理Fragment。
- 创建多个
4. 常见的页面滑动场景
- 底部导航栏:用户可以通过滑动在不同的页面之间切换。
- Tab布局:每个 Tab 对应一个 Fragment,用户可以滑动来查看不同的内容。
- 引导页:多个引导页面可以通过滑动展示。
二、具体实战
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>