前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android MVP 代码自动生成插件开发

Android MVP 代码自动生成插件开发

作者头像
luciozhang
发布2023-04-22 16:22:46
4400
发布2023-04-22 16:22:46
举报
文章被收录于专栏:前端lucio前端lucio

在享受MVP模式带来的清爽的代码的同时,我们似乎必须忍受写更多的代码,创建更多的文件。 但拥有懒这一优秀品质的程序员,总会为这种困境找到解决的办法。 本文是2017年lucio实习的时候,从事Android开发时候写的文章,现在看来,依然有一些借鉴意义。

本文会出现的原因是,lucio在遵循Google的Android MVP示例代码的模式开发一个小的程序,发现我们会需要写很多重复的代码,更加麻烦的是,我们需要创建很多重复的文件。每开发一个小的模块,至少会需要创建Activity、Contract、Fragment和Presenter四个文件。

总之,在享受MVP模式带来的清爽的代码的同时,我们似乎必须忍受写更多的代码,创建更多的文件。

但拥有懒这一优秀品质的程序员,总会为这种困境找到解决的办法。

lucio开始寻找Android Studio的代码自动生成插件,希望有出色的插件能解决我的困境,但结果并不好。相关插件中,很多插件很出色,但它生成的代码结构并不是我期望的——我希望各个小的模块都能自己成为一个包,而不是把整个程序分为几个大的包,前者对我来说有更好的可读性,另外一些插件所生成的代码与我的期望也有许多小的不同。

看过几个插件的源码后,发现开发一个插件并不会很难,于是lucio决定自己写一个插件!

具体的实现思路如下:

  1. 定义类文件的模板,读取模板,修改关键字后输出类源码
  2. 使用Intellij IDEA开发插件,提供清爽的可视化界面

生成代码

实现思路
  1. 写好两个txt文件作为模板
  2. 读取模板,修改里面不是通用的字段
  3. 输出生成的代码到指定文件。
模板示例
代码语言:javascript
复制
package &package&;

/**
 * Created by xxx on xxxx/xx/xx.
 */

public interface BaseView<T> {

    void setPresenter(T presenter);

}
代码语言:javascript
复制
package &amp;package&amp;;

/**
 * Created by xxx on xxxx/xx/xx.
 */

public interface BasePresenter {

    void start();

}
程序示例

可以看到我们需要修改的只有路径名称这一项,我们只需要读取模板文件,替换全部的&package&为真正的包名。包名的生成,可以取java文件夹下的路径,修改“/”为“.”。

代码语言:javascript
复制
/**
 * 获取包名
 */
private String getPackageName(String path) {
    return path.substring(path.indexOf("java") + 5, path.length()).replace("/", ".");
}
代码语言:javascript
复制
/**
  * 生成BaseView.java
  */
private void genBaseView(String path) {
        File codeBaseView = new File(path + "\\base\\" + "BaseView.java");
        String strTemplateBaseView = readTemplateFile("BaseView.txt");
        String strCodeBaseView = strTemplateBaseView.replaceAll("&amp;package&amp;", getPackageName(path) + ".base");

        try {
            FileUtils.writeStringToFile(codeBaseView, strCodeBaseView);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
总结

同样的,我们可以生成生成&ModelName&Activity.java、&ModelName&Contract.java、&ModelName&Fragment.java和&ModelName&Presenter.java,做法是相似的,我们只需要更改一些不通用的字段。

如果需要继续扩展,我们还可以让一些工具类的代码也使用自动生成的方式创建。

上面用到的路径,我们期望是点击右键时所在的包下的路径,这在用IDEA开发插件时很容易获取,下面我们看下IDEA开发Android Studio插件的过程。

IDEA开发Android Studio插件

实现过程
  1. 新建IntellJ Platform Plugin项目
  2. 新建一个Action,设置唤起插件的方式
  3. 编写插件
新建IntellJ Platform Plugin项目
新建IntellJ Platform Plugin项目

我们直接使用Messages类创建对话框,很方便可以不去考虑界面代码的编写,当然如果期望有更好的交互,也可以自己编写界面。下面我们创建了三个对话框分别完成基类、工具类和模块内类文件的自动生成。

程序示例

通过下面的代码获取右键点击位置所在的路径:

代码语言:javascript
复制
project = e.getProject();
        selectGroup = DataKeys.VIRTUAL_FILE.getData(e.getDataContext());
        String path = selectGroup.getPath();
代码语言:javascript
复制
public class AutoGen extends AnAction {

    Project project;
    VirtualFile selectGroup;

    @Override
    public void actionPerformed(AnActionEvent e) {
        project = e.getProject();
        selectGroup = DataKeys.VIRTUAL_FILE.getData(e.getDataContext());
        String path = selectGroup.getPath();

        int resultCode = Messages.showYesNoCancelDialog(project,"New base class(BasePresenter.java and BaseView.java)",
                "New Base Class", null);
        if(resultCode==0) {
            GenMVPCode genMVPCode = new GenMVPCode();
            genMVPCode.genBaseClassCode(path);
        }

        int resultCodeUtils = Messages.showYesNoCancelDialog(project,"New utils class(ActivityUtils.java, LogUtils.java and ToastUtils.java)",
                "New Base Class", null);
        if(resultCodeUtils==0) {
            GenMVPCode genMVPCode = new GenMVPCode();
            genMVPCode.genUtilsClassCode(path);
        }

        String modelName = Messages.showInputDialog(project, "Please input model name", "New MVP Model", Messages.getQuestionIcon());
        if (modelName == null || modelName.equals("")) {
            Messages.showErrorDialog("Model name can not be empty!","Model name is empty.");
            return;
        }else{
            GenMVPCode genMVPCode = new GenMVPCode();
            genMVPCode.genModelCode(path,modelName);
        }
    }
}

试试运行一下,我们可以在指定的路径下生成我们的代码,当然还有一些依赖库和界面文件不存在可能报错,但这已经极大地方便了我们在Android Studio中去创建一个新的模块了。存在的问题我们以后再继续改进。

生成文件的目录
生成文件的目录
生成的Activity文件
生成的Activity文件

如果熟悉Java Swing,我们还可以开发出比较好看一点的对话框。当然这个插件还有其他许多可以改进的地方,如检测模块名称是否规范,还可以根据在对话框的输入使用Javapoet在Contract生成方法。这是一个很简单的插件,根据每个人需求不同,可以扩展出不同的用法。

发布插件

为了和更多的人分享我们的成果,我们选择在JetBrains Plugins Repository发布我们的插件。

1.填写plugin.xml的信息
代码语言:javascript
复制
<idea-plugin>
  <id>com.luciozhang.plugin.id</id>
  <name>MVPAutoGen</name>
  <version>1.0</version>
  <vendor email="821193666@qq.com" url="http://blog.csdn.net/qq_18738333">luciozhang</vendor>

  <description><![CDATA[
      A plugin for Android Studio MVP code automatically generating.<br>
      <em>https://github.com/zxchehe/MVPAutoGen</em>
    ]]></description>

  <change-notes><![CDATA[
      No change notes here.<br>
      <em>https://github.com/zxchehe/MVPAutoGen</em>
    ]]>
  </change-notes>

  <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
  <idea-version since-build="145.0"/>

  <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
       on how to target different products -->

  <depends>com.intellij.modules.lang</depends>


  <extensions defaultExtensionNs="com.intellij">
    <!-- Add your extensions here -->
  </extensions>

  <actions>
    <!-- Add your actions here -->
    <action id="autogen" class="AutoGen" text="AutoGenMVP" description="Automatically generated MVP code">
      <add-to-group group-id="NewGroup" anchor="first"/>
    </action>
  </actions>

</idea-plugin>

注意去掉com.intellij.modules.lang这句的注释让插件可以发布到所有平台,否则只会发布到Intellij Idea。

2.在JetBrains Plugins Repository注册账号
3.打包

右键项目名->Prepare Plugin Module 'xxxx' For Deployment会生成项目的jar包,有用第三方库的话会生成zip包,也可以直接使用。

4.在官网upload plugin等两个工作日就好了

通过审核后,我们可以在Android Studio中与他人分享到我们的插件。

浏览我们的插件
浏览我们的插件

看看运行效果,基本满足了我们的期望。

生成mvp代码
生成mvp代码
生成结果
生成结果
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 生成代码
    • 实现思路
      • 模板示例
        • 程序示例
          • 总结
          • IDEA开发Android Studio插件
            • 实现过程
              • 程序示例
              • 发布插件
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档