Android AI解放生产力(六)实战:解放页面开发前的繁琐工作

一般开发一个新页面的工作是这样的:

  • 新建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了;
  • 不用写接口接入那一套流程了;
  • 不用操作创建一堆文件那一套流程了;

重心只需要放在需求和数据对接的代码即可,极大的解放了生成力。

相关推荐
JMchen1237 小时前
现代Android图像处理管道:从CameraX到OpenGL的60fps实时滤镜架构
android·图像处理·架构·kotlin·android studio·opengl·camerax
快点好好学习吧7 小时前
phpize 依赖 php-config 获取 PHP 信息的庖丁解牛
android·开发语言·php
是誰萆微了承諾7 小时前
php 对接deepseek
android·开发语言·php
Dxy12393102168 小时前
MySQL如何加唯一索引
android·数据库·mysql
Jing_jing_X10 小时前
CPU 架构:x86、x64、ARM 到底是什么?为什么程序不能通用?
arm开发·架构·cpu
冠希陈、10 小时前
PHP 判断是否是移动端,更新鸿蒙系统
android·开发语言·php
qq_1777673711 小时前
React Native鸿蒙跨平台自定义复选框组件,通过样式数组实现选中/未选中状态的样式切换,使用链式调用替代样式数组,实现状态驱动的样式变化
javascript·react native·react.js·架构·ecmascript·harmonyos·媒体
小程故事多_8012 小时前
深度搜索Agent架构全解析:从入门到进阶,解锁复杂问题求解密码
人工智能·架构·aigc
晚霞的不甘13 小时前
Flutter for OpenHarmony从零到一:构建《冰火人》双人合作闯关游戏
android·flutter·游戏·前端框架·全文检索·交互
2601_9498333913 小时前
flutter_for_openharmony口腔护理app实战+饮食记录实现
android·javascript·flutter