React Native的fragment和JetPack ViewPager2的集成

news/2024/10/21 7:42:15/

文章目录

    • 背景
    • 原生ViewPage2的代码结构
    • React Native端的实现
    • 原生端的实现
      • 在Adapter中注册Fragment
      • MainActivity实现DefaultHardwareBackBtnHandler接口
    • 小结

背景

ViewPager2是ViewPager的升级版,在原生Android应用中使用广泛。近期本人项目需要添加一些React Native页面,怎么在现有的ViewPager2中添加Fragment,然后在Fragment里显示RN的页面?经过试验,发现其实也比较容易做。但目前google上几乎没搜到例子,于是分享一下。

原生ViewPage2的代码结构

Main Activity的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns: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:layout_width="match_parent"android:layout_height="match_parent"tools:context=".ui.MainActivity"android:orientation="vertical"><androidx.viewpager2.widget.ViewPager2android:id="@+id/viewPager"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1" /><com.google.android.material.tabs.TabLayoutandroid:id="@+id/tabLayout"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/design_default_color_primary_dark"app:tabIconTint="@color/grey"app:tabIndicatorColor="@color/white"app:tabMode="fixed"app:tabSelectedTextColor="@color/white"app:tabTextColor="@color/grey" /></LinearLayout>

ViewPager对应的Adapter类:

package com.icool.cms.android.adapterimport android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.lifecycle.Lifecycle
import androidx.viewpager2.adapter.FragmentStateAdapter
import com.facebook.react.ReactFragment
import com.icool.cms.android.R
import com.icool.cms.android.model.Category
import com.icool.cms.android.ui.*public class HomePagerAdapter(fragmentManager: FragmentManager, lifecycle: Lifecycle) :FragmentStateAdapter(fragmentManager, lifecycle) {private val TAG = "HomePagerAdapter"override fun getItemCount(): Int {return 4}override fun createFragment(position: Int): Fragment {lateinit var fragment: Fragmentwhen (position) {0 -> {fragment = ArticleHomeFragment()}1 -> {fragment = SysEventFragment()                }2 -> {fragment = MessagingHomeFragment()                }3 -> {fragment = MeHomeFragment()}}Log.i(TAG, "Created CMS Fragment successfully.")return fragment}  
}

React Native端的实现

假如我们要在ViewPager2中添加两个Fragment,每个对应一个RN组件,则需要先注册两个RN组件:

import {AppRegistry} from 'react-native';
import Component1 from './component1';
import Component2 from './component2';AppRegistry.registerComponent('component1', () => Component1);
AppRegistry.registerComponent('component2', () => Component2);

原生端的实现

在Adapter中注册Fragment

import com.facebook.react.ReactFragment
...override fun getItemCount(): Int {return 6}override fun createFragment(position: Int): Fragment {lateinit var fragment: Fragmentwhen (position) {0 -> {fragment = ArticleHomeFragment()}1 -> {fragment = SysEventFragment()                }2 -> {fragment = MessagingHomeFragment()                }3 -> {fragment = MeHomeFragment()}4 -> {fragment = ReactFragment()val args = Bundle()args.putString("arg_component_name", "component1")fragment.arguments = args}5 -> {fragment = ReactFragment()val args = Bundle()args.putString("arg_component_name", "component2")fragment.arguments = args}}Log.i(TAG, "Created CMS Fragment successfully.")return fragment

MainActivity实现DefaultHardwareBackBtnHandler接口

class MainActivity : AppCompatActivity(), DefaultHardwareBackBtnHandler {...override fun invokeDefaultOnBackPressed() {TODO("Not yet implemented")}}
}

小结

RN和原生应用的集成,既可以以Activity的形式,也可以以Fragment的形式,有了两者融合方式后,底座采用kotlin,上层采用RN,即可满足性能和功能的需求,实现快速开发迭代。


http://www.ppmy.cn/news/106480.html

相关文章

详解iPaaS与RPA的区别及各自的应用场景

随着企业数字化转型的加速&#xff0c;业务系统集成和自动化流程成为关键议题。本文旨在探讨iPaaS&#xff08;Integration Platform as a Service&#xff09;与RPA&#xff08;Robotic Process Automation&#xff09;在业务系统集成方面的区别&#xff0c;它们各自的用途和适…

【C++初阶】:string类

string 一string的基本用法二.迭代器1.基本使用2.语法糖3.反向迭代器4.const迭代器 三.容量四.插入和删除五.一个例题&#xff1a;解析协议六.读取空格七.一些其他函数 一string的基本用法 文档里 一般使用 二.迭代器 1.基本使用 string里重载了一种非常厉害的运算符[ ] 这个运…

MySQL CAST 函数与 CONVERT 函数

文章目录 CAST 函数与 CONVERT 函数1. 数字和小数点组成的字符串转换为整型2. 非数值字符串转换为整型3. 把整型转换为二进制4. 数字和小数点组成的字符串转换为浮点型 CAST 函数与 CONVERT 函数 前面我们介绍的两个函数用于字符串和日期类型之间进行相互转换&#xff0c;有时我…

搭建后台管理系统模板(v3+ts+vite)

目录 项目初始化 环境准备 初始化项目 项目配置 一、eslint配置 .eslint.cjs配置文件 vue3环境代码校验插件 安装指令 修改.eslintrc.cjs配置文件 .eslintignore忽略文件 1.4运行脚本 二、配置prettier 2.1安装依赖包 2.2.prettierrc.json添加规则 2.3.prett…

(一)浅谈微服务概念理解

1.什么是微服务 让我们以一个餐厅为例来解释微服务的概念。 想象一家传统的餐厅&#xff0c;它有一个集中式的厨房&#xff0c;所有的菜品都在同一个厨房中准备和烹饪。这个厨房负责接收顾客的点餐请求&#xff0c;准备食材&#xff0c;烹饪菜品&#xff0c;并最终将菜品交给…

【面试集锦 - 汽车电子 - 功能安全】

功能安全 在汽车电子行业中&#xff0c;功能安全是指确保车辆电子系统在发生故障时能够继续执行其所需的安全功能的能力。由于现代汽车中的电子系统在安全性、可靠性和性能方面起着关键作用&#xff0c;因此功能安全成为了汽车电子行业中的重要概念。 功能安全的目标是防止或…

浏览器兼容性:JavaScript polyfill

由于 JavaScript API 有自己的规范&#xff0c;因此并非所有浏览器都同时支持特定规范。因此&#xff0c;我们必须提供 API 的补丁版本&#xff0c;以确保它仍然可以在不原生支持它的浏览器上运行。这种补丁称为 polyfill。 比如为 Safari 15.4 之前提供 Array 的at()方法的补…

防雷接地的施工工艺与防雷施工方案

雷电是自然界的一种强大而危险的自然现象&#xff0c;经常造成重大财产损失和人员伤亡。为了保护建筑物和人员免受雷电的危害&#xff0c;防雷接地系统的设计和施工至关重要。本文将介绍防雷接地的施工工艺和防雷施工方案&#xff0c;强调专业和符合国家标准的方法&#xff0c;…