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

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

相关推荐
Mr_sun.6 分钟前
Day09——入退管理-入住-2
android·java·开发语言
ujainu1 小时前
告别杂乱!Flutter + OpenHarmony 鸿蒙记事本的标签与分类管理(三)
android·flutter·openharmony
常利兵2 小时前
Android内存泄漏:成因剖析与高效排查实战指南
android
·云扬·2 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
野生技术架构师2 小时前
SQL语句性能优化分析及解决方案
android·sql·性能优化
Tadas-Gao2 小时前
缸中之脑:大模型架构的智能幻象与演进困局
人工智能·深度学习·机器学习·架构·大模型·llm
晚霞的不甘3 小时前
Flutter for OpenHarmony 可视化教学:A* 寻路算法的交互式演示
人工智能·算法·flutter·架构·开源·音视频
doupoa3 小时前
内存指针是什么?为什么指针还要有偏移量?
android·c++
代码改善世界4 小时前
CANN深度解构:中国AI系统软件的原创性突破与架构创新
大数据·人工智能·架构
非凡ghost4 小时前
PowerDirector安卓版(威力导演安卓版)
android·windows·学习·软件需求