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

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

相关推荐
心静财富之门2 小时前
a.py打包加密
android
成都大菠萝3 小时前
1-2-2 Kotlin与C++基础-C++基础语法与内存管理
android
陈希瑞3 小时前
【保姆级教程】安卓手机免Root一键部署AutoGLM:支持语音控制与自动化操作
android·智能手机·自动化
TheNextByte13 小时前
如何将联系人从Android传输到计算机的 6 种方法
android
喂_balabala3 小时前
excludeFromRecents
android
语落心生3 小时前
边缘AI推理计算 - StarryOS RK3588 边缘AI系统架构深度解析(二):AArch64裸机启动与内存管理
架构
元气满满-樱3 小时前
LNMP架构实验部署
架构
TimeFine3 小时前
Android AI解放生产力(五)实战:解放写API接口的繁琐工作
android
BuffaloBit3 小时前
5G 核心网架构入门
网络协议·5g·架构