Android UI 转鸿蒙 ArkUI 开发范式对照文档

本文档面向有 Android 开发经验的工程师,帮助快速理解并迁移到 HarmonyOS ArkUI 声明式开发范式。


一、架构理念对照

维度Android (XML/Compose)HarmonyOS (ArkUI)
UI 范式XML 命令式 / Compose 声明式ArkUI 声明式
编程语言Java / KotlinArkTS (TypeScript 子集)
页面容器ActivityUIAbility
组件化Fragment / @Composable@Component / @ComponentV2
状态管理ViewModel + LiveData / remember + State@State/@Local + @Observed/@ObservedV2
导航Intent / Navigation ComposeNavigation + NavPathStack
资源引用R.string.xxx / R.drawable.xxx$r(‘app.string.xxx’) / $r(‘app.media.xxx’)
构建GradleHvigor
包管理Maven / GradleOHP

二、生命周期对照

2.1 页面生命周期

Android Activity                        HarmonyOS UIAbility
─────────────────                       ──────────────────
onCreate()                         →    onCreate()
onStart()                          →    onWindowStageCreate()
onResume()                         →    onForeground()
onPause()                          →    onBackground()
onStop()                           →    (无直接对应)
onDestroy()                        →    onDestroy()

2.2 组件生命周期

Android Fragment                        HarmonyOS @Component
─────────────────                       ──────────────────
onAttach()                         →    (无对应)
onCreateView()                      →    build()
onViewCreated()                     →    (在build中完成)
onStart() / onResume()              →    aboutToAppear()
onPause() / onStop()                →    aboutToDisappear()
onDestroyView()                      →    (无对应)
onDetach()                          →    (无对应)

注意:@Component 没有 onResume/onPause 概念。如需感知页面可见性,在页面的 onPageShow/onPageHide 中通过状态变量通知组件。


三、布局组件映射

3.1 XML 布局 → ArkUI 布局

Android XMLHarmonyOS ArkUI说明
LinearLayout(vertical)Column垂直线性排列
LinearLayout(horizontal)Row水平线性排列
RelativeLayoutRelativeContainer相对定位布局
FrameLayoutStack层叠布局
ConstraintLayoutRelativeContainer / Flex复杂约束用 RelativeContainer,弹性用 Flex
ScrollViewScroll可滚动容器
NestedScrollViewScroll + List嵌套滚动
ViewPager / ViewPager2Swiper轮播/页面切换
TabLayout + ViewPagerTabs + TabContent选项卡
RecyclerViewList + LazyForEach / Repeat高性能列表
GridViewGrid + GridItem网格布局
FlexboxLayoutFlex弹性布局
GridLayoutGridRow + GridCol栅格布局(响应式)
DrawerLayoutPanel / 自定义 Stack抽屉布局
CoordinatorLayoutColumn + 手势/动画协调布局(需自行实现)

3.2 关键属性映射

通用属性
Android XML 属性ArkUI 属性示例
layout_width="match_parent".width('100%') 或 .width('100%')
layout_height="wrap_content".height('auto') 或不设置
layout_margin="16dp".margin(16)支持 vp/px 单位
layout_padding="16dp".padding(16)
layout_gravity="center".alignSelf(ItemAlign.Center)父容器交叉轴对齐
gravity="center".justifyContent(FlexAlign.Center) + .alignItems(HorizontalAlign.Center)内容对齐
visibility="gone".visibility(Visibility.None)
visibility="invisible".visibility(Visibility.Hidden)
visibility="visible".visibility(Visibility.Visible)
background="@color/xxx".backgroundColor($r('app.color.xxx'))
elevation="4dp".shadow({ radius: 4 })
alpha="0.5".opacity(0.5)
clickable="true".onClick(() => {})
enabled="false".enabled(false)
LinearLayout → Column/Row
<!-- Android XML -->
<LinearLayout
    android:orientation="vertical"
    android:gravity="center"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView android:layout_weight="1" />
    <TextView android:layout_weight="2" />
</LinearLayout>
// ArkUI
Column() {
  Text('item1').layoutWeight(1)
  Text('item2').layoutWeight(2)
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
.alignItems(HorizontalAlign.Center)
XML 属性ArkUI 属性
orientation="vertical"使用 Column
orientation="horizontal"使用 Row
layout_weight="1".layoutWeight(1)
gravity="center_vertical"Column: .justifyContent(FlexAlign.Center)
gravity="center_horizontal"Column: .alignItems(HorizontalAlign.Center)
ConstraintLayout → RelativeContainer
RelativeContainer() {
  Text('Title')
    .id('title')
    .alignRules({ top: { anchor: '__container__', align: VerticalAlign.Top } })

  Text('Subtitle')
    .id('subtitle')
    .alignRules({
      top: { anchor: 'title', align: VerticalAlign.Bottom },
      left: { anchor: 'title', align: HorizontalAlign.Start }
    })
}

四、UI 组件映射

4.1 基础组件

Android (XML/Compose)HarmonyOS ArkUI说明
TextView / Text()Text文本显示
EditText / TextField()TextInput单行输入
EditText(multiline) / TextField(maxLines)TextArea多行输入
Button / Button()Button按钮
ImageView / Image()Image图片显示
ProgressBar(horizon) / LinearProgressIndicatorProgress(Linear)线性进度条
ProgressBar(circle) / CircularProgressIndicatorProgress(Ring) / LoadingProgress圆形进度
CheckBox / Checkbox()Checkbox复选框
RadioButton / RadioButton()Radio + RadioContainer单选按钮
Switch / Switch()Toggle(type: SwitchType)开关
SeekBar / Slider()Slider滑块
RatingBar / RatingBar()Rating评分
Spinner / 下拉选择Select下拉选择
SearchView / SearchBar()Search搜索框
WebView / WebView()Web网页视图
VideoView / VideoPlayer()Video视频播放

4.2 对话框与弹窗

AndroidHarmonyOS ArkUI说明
AlertDialog.BuilderAlertDialog / promptAction.showDialog提示对话框
BottomSheetDialogbindSheet半模态弹窗
DialogFragmentCustomDialog / @CustomDialog自定义弹窗
Toast.makeTextpromptAction.showToast轻提示
PopupMenubindMenu菜单弹窗
DatePickerDialogDatePickerDialog日期选择
TimePickerDialogTimePickerDialog时间选择
SnackbarpromptAction.showToast / 自定义无直接对应

4.3 列表组件

AndroidHarmonyOS ArkUI说明
ListView + AdapterList + ForEach简单列表
RecyclerView + Adapter + ViewHolderList + LazyForEach高性能列表
RecyclerView + GridLayoutManagerGrid + LazyForEach网格列表
RecyclerView + StaggeredGridLayoutManagerWaterFlow + LazyForEach瀑布流
ListAdapterBasicDataSource / IDataSource数据源抽象
DiffUtilIDataSource 的 notifyDataChange数据变更通知
ItemDecorationList 的 .divider() / 自定义 ListItem 间距列表分割线
ItemAnimatoranimateItem / 属性动画列表动画
RecyclerView → List + LazyForEach 对照
// Android Compose
LazyColumn {
    items(courseList, key = { it.id }) { course ->
        CourseCard(course = course)
    }
}
// ArkUI
List() {
  LazyForEach(this.dataSource, (item: CourseItem) => {
    ListItem() {
      CourseCard({ course: item })
    }
  }, (item: CourseItem) => item.id.toString())
}
.cachedCount(5)
.divider({ strokeWidth: 1, color: '#E0E0E0' })

关键差异:

  • 无需 Adapter/ViewHolder,组件本身即 ViewHolder,框架自动复用
  • LazyForEach 第三个参数是 key 生成函数,必须返回唯一字符串
  • cachedCount 替代 RecyclerView 的缓存策略

五、Compose → ArkUI 范式对照

5.1 核心概念映射

Jetpack ComposeArkUI说明
@Composable@Component / @ComponentV2组件声明
remember@Local (V2) / @State (V1)组件内部状态
mutableStateOf@Local (V2) / @State (V1)可变状态
State<T>@Local (V2) / @State (V1)状态包装
Modifier链式属性方法样式修饰
LaunchedEffectaboutToAppear + 异步任务副作用
DisposableEffectaboutToAppear + aboutToDisappear生命周期副作用
SideEffect直接在事件回调中处理同步副作用
rememberCoroutineScope直接使用 async/await协程
CompositionLocal@Provider / @Consumer (V2)作用域传递
NavHost / NavGraphNavigation + NavPathStack导航图

5.2 状态管理对照

Jetpack ComposeArkUI V2 (推荐)ArkUI V1
var text by remember { mutableStateOf("") }@Local text: string = ''@State text: string = ''
传参 (text: String)@Param text: string = ''@Prop text: string = ''
回调 (onChange: (String) -> Unit)@Event onChange: (s: string) => void回调函数属性
ViewModel + StateFlow@ObservedV2 + @Trace@Observed + @ObjectLink
MutableLiveData@Trace 属性@Watch 监听

5.3 Modifier → 链式属性

// Compose
Text(
    text = "Hello",
    modifier = Modifier
        .fillMaxWidth()
        .padding(16.dp)
        .background(Color.Blue)
        .clickable { /* ... */ },
    color = Color.White,
    fontSize = 16.sp
)
// ArkUI
Text('Hello')
  .width('100%')
  .padding(16)
  .backgroundColor(Color.Blue)
  .onClick(() => { /* ... */ })
  .fontColor(Color.White)
  .fontSize(16)

区别:Compose 用 Modifier 参数集中传递样式;ArkUI 用链式方法调用。功能等价,表达方式不同。

5.4 常见组件对照

ComposeArkUI
Column { }Column() { }
Row { }Row() { }
Box { }Stack() { }
LazyColumn { }List() { LazyForEach(...) }
LazyRow { }List({ listDirection: Axis.Horizontal }) { }
Grid { }Grid() { }
Scaffold { }无直接对应,用 Column + 自定义 TitleBar + Tabs 组合
TopAppBarNavigation 的 title 属性 / 自定义 TitleBar
BottomNavigationTabs 的底部栏模式
FloatingActionButton自定义 Button + Stack 定位
Card { }Column + .borderRadius() + .shadow()
Chip / FilterChip自定义组件 / Toggle
Divider()Divider()
Spacer(modifier = Modifier.height(8.dp))Blank().height(8)
Surface { }Column().borderRadius().backgroundColor()

六、导航路由对照

6.1 页面跳转

// Android: Intent
val intent = Intent(this, DetailActivity::class.java)
intent.putExtra("courseId", courseId)
startActivity(intent)
// ArkUI: router (简单场景)
import { router } from '@kit.ArkUI'

router.pushUrl({
  url: 'pages/DetailPage',
  params: { courseId: this.courseId }
})
// ArkUI: Navigation + NavPathStack (推荐)
this.navPathStack.pushPath({ name: 'DetailPage', param: { courseId: this.courseId } })

6.2 导航对照表

AndroidHarmonyOS ArkUI
startActivity()router.pushUrl() / navPathStack.pushPath()
finish()router.back() / navPathStack.pop()
startActivityForResult()navPathStack.pushPath() + 回调
Intent.putExtra()params: { key: value }
getIntent().getExtra()router.getParams()['key']
Navigation Compose NavHostNavigation { NavPathStack }
NavGraphnavDestination 路由表
BottomNavigationViewTabs 组件

七、资源管理对照

AndroidHarmonyOS ArkUI说明
R.string.app_name$r('app.string.app_name')字符串
R.drawable.icon$r('app.media.icon')图片
R.color.primary$r('app.color.primary')颜色
R.dimen.spacing$r('app.float.spacing')尺寸
R.raw.video$rawfile('video.mp4')原始文件
getString(R.string.xxx)getContext().resourceManager.getStringSync($r('app.string.xxx'))代码中获取
dp 单位vp 单位 (1:1)密度无关像素
sp 单位fp 单位字体缩放像素

资源目录结构:

Android                          HarmonyOS
─────────                        ─────────
res/                             resources/
  values/                          base/
    strings.xml                      element/
    colors.xml                         string.json
    dimens.xml                         color.json
  drawable/                            float.json
  mipmap-hdpi/                       media/
  raw/                                 icon.png
                                    rawfile/
                                      video.mp4

八、数据存储对照

AndroidHarmonyOS说明
SharedPreferences@ohos.data.preferences轻量 KV 存储
Room / SQLite@ohos.data.relationalStore关系型数据库
DataStore@ohos.data.preferences偏好存储
File (内部存储)@ohos.file.fs文件操作
ContentProviderDataShareExtension数据共享
GreenDAO@ohos.data.relationalStoreORM 需自行封装

SharedPreferences 迁移示例

// Android
val sp = getSharedPreferences("config", MODE_PRIVATE)
sp.edit().putString("token", token).apply()
val token = sp.getString("token", "")
// ArkUI
import { preferences } from '@kit.ArkData'

let prefs = await preferences.getPreferences(getContext(this), 'config')
await prefs.put('token', token)
await prefs.flush()
let token = await prefs.get('token', '')

注意:鸿蒙 preferences 全部是异步操作,必须用 await;flush() 必须显式调用才会持久化。


九、事件交互对照

Android (XML/Compose)HarmonyOS ArkUI
setOnClickListener / .clickable { }.onClick(() => {})
setOnLongClickListener / .longClickable { }.onLongPress(() => {}) / 手势绑定
setOnTouchListener.onTouch((e) => {})
setOnKeyListener.onKeyEvent((e) => {})
addTextChangedListener.onChange((value) => {})
setOnFocusChangeListener.onFocus(() => {}) / .onBlur(() => {})
SwipeRefreshLayoutRefresh 组件
onTouch 手势识别GestureGroup / PanGesture / TapGesture
onScrollListener.onScrollFrameBegin() / .onScroll()
ItemTouchHelper (拖拽/滑动)List 的 .onDragStart() / .onSwipe()

手势体系对照

// Compose
Modifier.pointerInput(Unit) {
    detectTapGestures(onLongPress = { /* ... */ })
    detectDragGestures { change, dragAmount -> /* ... */ }
}
// ArkUI
.gesture(
  GestureGroup(GestureMode.Exclusive,
    LongPressGesture().onAction(() => { /* ... */ }),
    PanGesture().onActionUpdate((e: GestureEvent) => { /* ... */ })
  )
)

十、动画对照

Android (XML/Compose)HarmonyOS ArkUI
ObjectAnimatoranimateTo() 显式动画
ValueAnimatoranimateTo() + 闭包
Transition / AnimatedVisibilitytransition() 转场动画
animateFloatAsStateanimateTo() / animationDuration
Animatable@AnimatableExtend 自定义动画属性
Lottie@ohos.multimedia.media / 自定义 Canvas 动画
SharedElementgeometryTransition() 共享元素转场
MotionLayout无直接对应,组合属性动画实现
// ArkUI 显式动画
animateTo({ duration: 300, curve: Curve.EaseInOut }, () => {
  this.width = 200
  this.opacity = 1.0
})

// ArkUI 属性动画
Text('Hello')
  .width(this.width)
  .animation({ duration: 300, curve: Curve.EaseInOut })

十一、MVVM 架构对照

11.1 架构映射

Android MVVMHarmonyOS MVVM
ViewModel@ObservedV2 class (ViewModel)
MutableLiveData<T>@Trace 属性
LiveData.observe()@Watch / 自动 UI 刷新
RepositoryService / Repository (同概念)
DataBinding自动状态驱动 UI (无需绑定)

11.2 目录结构

Android                          HarmonyOS
─────────                        ─────────
app/                             entry/src/main/ets/
  model/                           model/
    User.kt                          User.ets
  viewmodel/                       viewmodel/
    UserViewModel.kt                 UserViewModel.ets
  view/                            view/
    Activity/                        pages/
    Fragment/                        components/
    Adapter/                         (无 Adapter)
  repository/                      service/
    UserRepository.kt                UserRepository.ets

11.3 代码对照

// Android ViewModel
class UserViewModel : ViewModel() {
    private val _userName = MutableLiveData("")
    val userName: LiveData<String> = _userName

    fun loadUser() {
        viewModelScope.launch {
            _userName.value = repository.getUserName()
        }
    }
}
// ArkUI ViewModel (V2)
@ObservedV2
class UserViewModel {
  @Trace userName: string = ''

  async loadUser() {
    this.userName = await repository.getUserName()
  }
}

@Entry
@ComponentV2
struct UserPage {
  @Local viewModel: UserViewModel = new UserViewModel()

  aboutToAppear() {
    this.viewModel.loadUser()
  }

  build() {
    Column() {
      Text(this.viewModel.userName)
    }
  }
}

十二、常见踩坑与注意事项

12.1 ArkTS 语法限制

限制项说明迁移策略
禁止 any 类型ArkTS 不允许 any/unknown定义具体接口/类
禁止结构化类型不支持鸭子类型,只支持名义类型使用 extends / implements
禁止 as 类型断言不允许强制类型转换使用类型守卫或正确声明类型
禁止动态属性访问obj[key] 不允许使用 Map 或 Record
对象字面量需类型上下文{ name: 'test' } 必须有类型指定变量类型或函数参数类型
禁止 for...in不允许 for…in 遍历使用 Object.keys() + for...of

12.2 状态管理常见问题

问题原因解决
修改对象属性 UI 不刷新@State 对对象是浅比较使用 @ObservedV2 + @Trace,或重新赋值整个对象
数组元素修改不刷新直接 arr[i] = newVal 不触发使用 arr.splice(i, 1, newVal) 或 arr = [...arr]
子组件状态丢失页面重新渲染时子组件被重建使用 @Reusable 装饰器标记可复用组件
LazyForEach 更新异常key 生成函数返回重复值确保第三个参数返回唯一稳定的字符串

12.3 性能优化对照

Android 优化HarmonyOS 优化
RecyclerView.setHasFixedSize(true)List 设置固定宽高
RecyclerView.setRecycledViewPool()cachedCount 设置预加载
ViewHolder 复用@Reusable 组件复用
Glide 图片缓存Image 组件内置三级缓存
避免嵌套层级过深同理,扁平化布局
DiffUtil 精确更新LazyForEach + IDataSource 的 notifyDataChange
setOnClickListener(null).hitTestBehavior(HitTestMode.None)
ViewStub 延迟加载if 条件渲染

十三、快速迁移检查清单

页面迁移

  • Activity → UIAbility,调整生命周期
  • XML 布局 → ArkUI 声明式组件树
  • Fragment → @Component 自定义组件
  • ViewPager → Swiper
  • TabLayout → Tabs + TabContent
  • RecyclerView → List + LazyForEach
  • ScrollView → Scroll

状态迁移

  • ViewModel → @ObservedV2 class
  • LiveData → @Trace 属性
  • remember/mutableStateOf → @Local (V2) / @State (V1)
  • Compose 参数传递 → @Param (V2) / @Prop (V1)
  • 回调 → @Event (V2)

导航迁移

  • Intent → Want / NavPathStack
  • startActivity → router.pushUrl / navPathStack.pushPath
  • Navigation Compose → Navigation + NavPathStack

资源迁移

  • R.string → $r(‘app.string.xxx’)
  • R.drawable → $r(‘app.media.xxx’)
  • R.color → $r(‘app.color.xxx’)
  • dp → vp
  • sp → fp

数据迁移

  • SharedPreferences → @ohos.data.preferences
  • Room/SQLite → @ohos.data.relationalStore
  • File → @ohos.file.fs
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐