为了账号安全,请及时绑定邮箱和手机立即绑定

多module开发时module模板插件开发

标签:
Android

1.需求

制作插件,根据module名和包名生成对应的module模板

2.代码

2.1下载Intellij Idea

2.2创建Plugin项目

webp

image

2.3定义plugin.xml配置文件

<idea-plugin>
    <id>com.skateboard.modulegenerator</id>
    <name>组件化模板module产生器</name>
    <version>1.0</version>
    <vendor email="skateboard1991@163.com" url="http://www.yourcompany.com">YourCompany</vendor>

    <description><![CDATA[
      用来产生模板module
    ]]></description>

    <change-notes><![CDATA[
      Add change notes here.<br>
      <em>most HTML tags may be used</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="173.0"/>

    <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
         on how to target different products -->
    <!-- uncomment to enable plugin in all products
    <depends>com.intellij.modules.lang</depends>
    -->

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

    <actions>
        <!-- Add your actions here -->
        <group id="com.skateboard.modulegenerator" popup="true" text="GenerateModule">
            <action id="MultiModuleGenerator" class="com.skateboard.modulegenerator.GeneratorAction"
                    text="ModuleGenerator" description="Use to generate module">
                <add-to-group group-id="FileMenu" anchor="first"/>
                <keyboard-shortcut keymap="$default" first-keystroke="shift ctrl P"/>
            </action>
        </group>
    </actions></idea-plugin>

其中的<name>和<description>就是插件名称和功能描述,会在你安装插件时显示。<actions>标签定义了插件的一些动作,其中<group>定义了插件显示的菜单名称和显示样式,<add-to-group>定义了将会把GenerateModule菜单栏 添加到File菜单下。<actiton>定义了action的代码的位置。

2.4对话框的编写

当点击ModuleGenerator选项后,会出现一个对话框,让你输入module的名称以及包名,这个对话框其实就是用java swing编写的

ublic class ModuleInfoDialog extends JDialog {    private DialogCallback dialogCallback;    private final static String OK = "OK";    private final static String CANCEL = "CANCEL";    private final static String TITLE = "创建新module";    private final static String MODULE_NAME_HINT = "请输入模块名称:";    private final static String PACKAGE_NAME_HINT = "请输入包名:";    private final static String ERROR_MESSAGE = "模块名和包名不能为空";    public ModuleInfoDialog(DialogCallback dialogCallback) {
        setSize(450, 300);
        setModal(true);
        setTitle(TITLE);
        prepareUI();        this.dialogCallback = dialogCallback;

    }    private void prepareUI() {


        GridBagLayout gridBagLayout = new GridBagLayout();
        JPanel contentPannel = new JPanel();
        contentPannel.setLayout(gridBagLayout);

        GridBagConstraints constraints = new GridBagConstraints();
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.gridwidth = 1;
        constraints.weightx = 0;


        JLabel moduleHintLabel = new JLabel();
        moduleHintLabel.setText(MODULE_NAME_HINT);
        contentPannel.add(moduleHintLabel, constraints);

        constraints.gridx = 0;
        constraints.gridy = 1;
        constraints.weightx=0;
        JLabel packageNameHintLabel = new JLabel();
        packageNameHintLabel.setText(PACKAGE_NAME_HINT);
        contentPannel.add(packageNameHintLabel, constraints);

        constraints.gridx = 1;
        constraints.gridy = 0;
        constraints.weightx=1;
        constraints.fill=GridBagConstraints.HORIZONTAL;
        JTextField moduleNameImp = new JTextField();
        moduleNameImp.setForeground(Color.WHITE);
        contentPannel.add(moduleNameImp, constraints);

        constraints.gridx = 1;
        constraints.gridy = 1;
        constraints.weightx=1;
        constraints.fill=GridBagConstraints.HORIZONTAL;
        JTextField packageNameImp = new JTextField();
        packageNameImp.setForeground(Color.WHITE);
        contentPannel.add(packageNameImp, constraints);


        JLabel errorLabel = new JLabel();
        errorLabel.setForeground(Color.RED);
        errorLabel.setVisible(false);


        JButton okBtn = new JButton();
        okBtn.setText(OK);
        okBtn.addActionListener(new ActionListener() {            @Override
            public void actionPerformed(ActionEvent e) {                if (moduleNameImp.getText().isEmpty() || packageNameImp.getText().isEmpty()) {
                    errorLabel.setVisible(true);
                    errorLabel.setText(ERROR_MESSAGE);                    return;
                }                if (dialogCallback != null) {
                    dialogCallback.onOkClicked(moduleNameImp.getText(), packageNameImp.getText());
                }
                dispose();
            }
        });


        JButton cancelBtn = new JButton();
        cancelBtn.setText(CANCEL);
        cancelBtn.addActionListener(new ActionListener() {            @Override
            public void actionPerformed(ActionEvent e) {                if (dialogCallback != null) {
                    dialogCallback.onCancelClicked();
                }
                dispose();
            }
        });

        constraints.anchor=WEST;
        constraints.weightx=0;
        constraints.gridx = 0;
        constraints.gridy = 2;
        contentPannel.add(okBtn, constraints);

        constraints.fill=GridBagConstraints.NONE;
        constraints.gridy = 2;
        constraints.gridx = 1;
        contentPannel.add(cancelBtn, constraints);

        constraints.gridy = 3;
        constraints.gridx = 0;
        contentPannel.add(errorLabel, constraints);

        setContentPane(contentPannel);
    }    interface DialogCallback {        void onOkClicked(String moduleName, String packageName);        void onCancelClicked();
    }    public static void pop(DialogCallback callback) {
        ModuleInfoDialog infoDialog = new ModuleInfoDialog(callback);
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        infoDialog.setLocation(screenSize.width / 2 - infoDialog.getWidth() / 2, screenSize.height / 2 - infoDialog.getHeight() / 2);
        infoDialog.setVisible(true);
    }

}

没什么特别要说的,就是构建了一个dilaog,其中的静态方法pop()用来显示这个dialog

2.5action的编写

当我们点击ModuleGenerator的这个选项时,会产生一个action,这里要实现对应的逻辑,就是我们创建模板文件的地方。首先创建一个类GeneratorAction并继承自AnAction,同时需要复写actionPerformed方法,看一下GeneratorAction的actionPerformed方法

 ModuleInfoDialog.pop(new ModuleInfoDialog.DialogCallback() {            @Override
            public void onOkClicked(String moduleName, String packageName) {
                generateModuleFiles(moduleName, packageName, e.getProject().getBasePath());
                e.getProject().getBaseDir().refresh(true, true);

            }            @Override
            public void onCancelClicked() {

            }
        });

首先就是产生刚才说的用来输入module名和包名的dialog,当点击ok按钮后,就会创建项目模板文件和同步工程文件了。其中的generateModuleFils方法就是创建相应的文件夹和文件的,具体实现看代码就好了,没什么可说的。

3.问题

gradle文件中指定的intellij的版本号

intellij {
    version '2018.1'}

plugin.xml中指定的idea的build version

<idea-version since-build="181.0"/>



作者:滑板上的老砒霜
链接:https://www.jianshu.com/p/f1dc64dc8716


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消