一般开发一个新页面的工作是这样的:
- 新建Activity/Fragment,里面会各种继承和默认实现的函数。
- 新建ViewModel,也是继承和基础实现。
- 如果有RecyclerView还要创建Adapter。
大部分开发者估计都是拷贝之前的文件然后改改就用了,但是拷贝这些文件是不是很繁琐?以后这些活交给AI来干。首先思考一下可能碰到的问题。
一、可能碰到的问题
1、文件名的定义
如果要生成Activity,Fragment,ViewModel,Adapter,ViewBinding等,文件名要怎么取? 答案是按项目的命名规范告诉AI即可,例如要创建AboutActivity,告诉AI对应的Fragment应该是AboutFragment,ViewModel应该是AboutViewModel,Adapter应该是AboutAdapter,ViewBding应该是ActivityAboutBinding,如果是XML布局文件来写UI,布局文件应该是activity_about。在skill中描述清楚。
2、文件放哪儿
上一篇有讨论这个问题,可以见上篇。
二、编辑skill
还是让AI只给出代码。
需要在skill中描述生成哪些文件以及每个文件应该如何参考项目的模版代码生成。下面是一个简单的示例:
kotlin
---
name: new_page_dev
description: 新页面开发生成Activity。
---
## 创建Activity等并给出如下要求的代码:
### 1、代码一:创建对应的Activity
可以参考`MyOrdersActivity`这个Activity。
布局文件的Binding按规则:例如AActivity, 那么viewbinding就是ActivityABinding,我会在后续补充这个布局文件。
class MyOrdersActivity : BaseVBActivity<ActivityMyOrdersListBinding>() {
//涉及具体项目代码,略,根据自己的项目模版代码编辑
}
请参照上面的模版代码给出。
给出AndroidManifest清单文件注册的代码。
### 2、代码二:给出ViewModel的代码
ViewModel的命名规则如果是AActivity,那么ViewModel就是AViewModel。
AViewModel的创建可参考的代码为:
class AlertDetailsViewModel(savedStateHandle: SavedStateHandle) : BaseViewModel() {
//涉及具体项目代码,略,根据自己的项目模版代码编辑
companion object {
}
}
### 3、代码三:给出Adapter的代码
Adapter的命名规则同上。
可参考的Adapter的代码:
class MyOrdersListAdapter : BaseQuickAdapter<PlanDetails, QuickViewHolder>() {
override fun onBindViewHolder(holder: QuickViewHolder, position: Int, item: PlanDetails?) {
val binding = ItemMyOrdersInfoBinding.bind(holder.itemView)
item?.apply {
//TODO
}
}
override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): QuickViewHolder {
return QuickViewHolder(R.layout.item_my_orders_info, parent)
}
}
根据项目的实际情况编辑上面的skill。
在Codex Cli中输入:
kotlin
新页面开发生成AboutActivity
下面是AI生成的结果:
kotlin
Using skill new_page_dev to generate the Activity/ViewModel/Adapter skeletons.
//...略...
class AboutActivity : BaseVBActivity<ActivityAboutBinding>() {
override val viewModel by viewModels<AboutViewModel>()
private val mAdapter = AboutAdapter()
private var mDataList = mutableListOf<Any>()
override fun createViewBinding(inflater: LayoutInflater): ActivityAboutBinding {
return ActivityAboutBinding.inflate(inflater)
}
override fun init(savedInstanceState: Bundle?) {
multiStateContainer = MultiStatePage.bindMultiState(binding.rlContainer)
initAdapter()
requestData(true)
}
private fun initAdapter() {
binding.rcy.layoutManager = LinearLayoutManager(this)
binding.rcy.adapter = mAdapter
binding.refreshLayout.setEnableFooterFollowWhenNoMoreData(true)
}
@SuppressLint("NotifyDataSetChanged")
private fun requestData(isShowLoading: Boolean = false) {
if (isShowLoading) {
multiStateContainer.showLoading()
}
// TODO: request data and update mDataList / adapter
}
private fun showError() {
multiStateContainer.showErrorCustom {
requestData(true)
}
}
private fun showEmpty() {
multiStateContainer.showEmptyCustom()
}
override fun createObserver() {
}
}
//...略...
class AboutViewModel(savedStateHandle: SavedStateHandle) : BaseViewModel() {
companion object {
}
}
//...略...
class AboutAdapter : BaseQuickAdapter<Any, QuickViewHolder>() {
override fun onBindViewHolder(holder: QuickViewHolder, position: Int, item: Any?) {
val binding = ItemAboutBinding.bind(holder.itemView)
item?.apply {
// TODO: bind item
}
}
override fun onCreateViewHolder(context: Context, parent: ViewGroup, viewType: Int): QuickViewHolder {
return QuickViewHolder(R.layout.item_about, parent)
}
}
Confirm the target package and whether this page is list-based (RecyclerView). If not, I can simplify the Activity and remove the adapter scaffold.
代码完全可用,开启写的权限,复制粘贴都省了。
三、总结
实战的三篇分别解决了:
- 根据需求创建模板文件;
- 通过Figma MCP加skill生成UI;
- 通过Apifox加skill生成接口数据;
作为开发者:
- 基本不用写UI了;
- 不用写接口接入那一套流程了;
- 不用操作创建一堆文件那一套流程了;
重心只需要放在需求和数据对接的代码即可,极大的解放了生成力。