android filehelper,为AndroidStudio开发mvp插件(MvpHelper)

如果觉得写mvp有点枯燥无味,我们可以做点 cool 的事情:做个 as 插件

47509e1684a1

help.png

todo-mvp: 基础的MVP架构。

todo-mvp-loaders:基于MVP架构的实现,在获取数据的部分采用了loaders架构。

todo-mvp-databinding: 基于MVP架构的实现,采用了数据绑定组件。

todo-mvp-clean: 基于MVP架构的clean架构的实现。

todo-mvp-dagger2: 基于MVP架构,采用了依赖注入dagger2。

dev-todo-mvp-contentproviders: 基于mvp-loaders架构,使用了ContenPproviders。

dev-todo-mvp-rxjava: 基于MVP架构,对于程序的并发处理和数据层(MVP中的Model)的抽象。

因为对mvp的理解不同,会有很多种方式表达架构,所以插件要极简易读,可扩展性强,所以可以选择:

/**

* 通过模板生成类

* @param var1 文件生成路径

* @param var2 文件名

* @param var3 模板名

* @param var4 是否生产类

* @param var5 模板参数

*/

public abstract PsiClass createClass(@NotNull PsiDirectory var1, @NotNull String var2, @NotNull String var3, boolean var4, @NotNull Map var5) throws IncorrectOperationException;

也就是只要定制不同的模板就可以实现扩展性

直接贴下步骤:

1: idea File - new - Project - IntelliJ Platform Plugin

47509e1684a1

dir.PNG

plugin.xml 插件配置信息:

com.your.company.unique.plugin.id

Plugin display name here

1.0

YourCompany

Enter short description for your plugin here.

most HTML tags may be used

]]>

Add change notes here.

most HTML tags may be used

]]>

description="Generate MVP" icon="/icons/app_icon.png">

action:

public class MvpGenerator extends AnAction implements MvpHandler.OnGenerateListener {

private AnActionEvent actionEvent;

private MvpHandler mvpHandler;

private Map map = new HashMap<>();

@Override

public void actionPerformed(AnActionEvent anActionEvent) {

this.actionEvent = anActionEvent;

mvpHandler = new MvpHandler();

mvpHandler.setTitle("输入名称-生成MVP相关类");

mvpHandler.setOnGenerateListener(this);

mvpHandler.pack();

//设置对话框跟随当前windows窗口

mvpHandler.setLocationRelativeTo(WindowManager.getInstance().getFrame(anActionEvent.getProject()));

mvpHandler.setVisible(true);

}

@Override

public void onGenerate(String text) {

JavaDirectoryService directoryService = JavaDirectoryService.getInstance();

//当前工程

Project project = actionEvent.getProject();

map.put("NAME", text);

map.put("PACKAGE_NAME", Util.getPackageName(project));

//鼠标右键所选择的路径

IdeView ideView = actionEvent.getRequiredData(LangDataKeys.IDE_VIEW);

PsiDirectory directory = ideView.getOrChooseDirectory();

assert directory != null;

if (directory.getName().contains("contract") && directory.findFile(text + "Contract.java") == null) {

directoryService.createClass(directory, text + "Contract", "GenerateContractFile", true, map);

}

if (directory.getName().contains("model") && directory.findFile(text + "Model.java") == null) {

directoryService.createClass(directory, text + "Model", "GenerateModelFile", true, map);

}

if (directory.getName().contains("presenter") && directory.findFile(text + "Presenter.java") == null) {

directoryService.createClass(directory, text + "Presenter", "GeneratePresenterFile", true, map);

}

}

@Override

public void onCancel() {

mvpHandler.setVisible(false);

}

}

dialog: (action下,右键,new dialog)

public class MvpHandler extends JDialog {

private JPanel contentPane;

private JButton buttonOK;

private JButton buttonCancel;

private JTextArea textArea1;

private OnGenerateListener listener;

public void setOnGenerateListener(OnGenerateListener listener) {

this.listener = listener;

}

public MvpHandler() {

setContentPane(contentPane);

setModal(true);

getRootPane().setDefaultButton(buttonOK);

buttonOK.addActionListener(e -> listener.onGenerate(textArea1.getText().trim()));

buttonCancel.addActionListener(e -> listener.onCancel());

// call onCancel() when cross is clicked

setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e) {

listener.onCancel();

}

});

// call onCancel() on ESCAPE

contentPane.registerKeyboardAction(e -> listener.onCancel(), KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);

}

public interface OnGenerateListener{

void onGenerate(String text);

void onCancel();

}

}

MvpHandler.form 拖动控件

47509e1684a1

dialog.PNG

Util:

public class Util {

/**

* AndroidManifest.xml 获取 app 包名

* @return

*/

public static String getPackageName(Project project) {

String package_name = "";

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

try {

DocumentBuilder db = dbf.newDocumentBuilder();

Document doc = db.parse(project.getBasePath() + "/app/src/main/AndroidManifest.xml");

NodeList nodeList = doc.getElementsByTagName("manifest");

for (int i = 0; i < nodeList.getLength(); i++) {

Node node = nodeList.item(i);

Element element = (Element) node;

package_name = element.getAttribute("package");

}

} catch (Exception e) {

e.printStackTrace();

}

return package_name;

}

}

2: 定制模板:按需求定制

new - file - xxx.java.ft

GenerateContractFile.java.ft

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")

package ${PACKAGE_NAME};

#end

import base.IBaseModel;

import base.IBaseView;

import base.IPresenter;

public interface ${NAME}Contract{

interface I${NAME}View extends IBaseView{

}

interface I${NAME}Model extends IBaseModel{

}

interface I${NAME}Presenter extends IPresenter{

}

}

GenerateModelFile.java.ft

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end

import ${PACKAGE_NAME}.contract.${NAME}Contract;

import base.IBaseModel;

public class ${NAME}Model implements ${NAME}Contract.I${NAME}Model{

public static IBaseModel newInstance(){

return new ${NAME}Model();

}

}

GeneratePresenterFile.java.ft

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")

package ${PACKAGE_NAME}

;#end

import ${PACKAGE_NAME}.contract.${NAME}Contract;

import ${PACKAGE_NAME}.model.${NAME}Model;

import base.BasePresenter;

public class ${NAME}Presenter extends BasePresenter implements ${NAME}Contract.I${NAME}Presenter{

@Override

public ${NAME}Contract.I${NAME}Model bindModel(){

return (${NAME}Contract.I${NAME}Model)${NAME}Model.newInstance();

}

}

MVP:

BasePresenter:

public abstract class BasePresenter implements IPresenter {

protected T mView;

protected M mModel;

protected CompositeDisposable mDisposable;

public BasePresenter() {

this.mModel = bindModel();

mDisposable = new CompositeDisposable();

}

public boolean isViewAttached() {

return mView != null;

}

public void checkViewAttached() {

if (!isViewAttached()) throw new RuntimeException("未注册View");

}

@Override

public void onAttach(T t) {

mView = t;

if (mModel == null) {

throw new NullPointerException("model没有绑定 不能使用");

}

}

/**

* return Model

*/

public abstract M bindModel();

@Override

public void onDetach() {

if (!mDisposable.isDisposed())

mDisposable.dispose();

mView = null;

}

}

IBaseModel:

package base;

/**

* Created by haoran on 2018/4/4.

*/

public interface IBaseModel {

}

IBaseView :

package base;

/**

* Created by haoran on 2017/10/30.

*/

public interface IBaseView {

void showLoading();

void hideLoading();

void onError(String message);

}

IPresenter:

package base;

/**

* Created by haoran on 2017/10/30.

*/

public interface IPresenter {

void onAttach(T t);

void onDetach();

}

实现类:(引导页为例)... import 忽略

GuideContract:

public interface GuideContract {

interface IGuideView extends IBaseView{

void showGuideImages(List pictureListBeans);

void showGuideDefaultImage();

}

interface IGuideModel extends IBaseModel {

Observable> getGuideImages();

}

interface IGuidePresenter extends IPresenter {

void getGuideImages();

}

}

GuideModel:

public class GuideModel implements GuideContract.IGuideModel {

public static IBaseModel newInstance() {

return new GuideModel();

}

public Observable> getGuideImages() {

return ApiHelper.get().getGuideImages(new JSONObject());

}

}

GuidePresenter:

public class GuidePresenter extends BasePresenter implements GuideContract.IGuidePresenter {

@Override

public void getGuideImages() {

checkViewAttached();

mDisposable.add(mModel.getGuideImages().subscribe(pictureList -> {

if (pictureList == null || pictureList.size() == 0) {

mView.showGuideDefaultImage();

} else {

mView.showGuideImages(pictureList);

}

}, throwable -> mView.showGuideDefaultImage()));

}

@Override

public GuideContract.IGuideModel bindModel() {

return (GuideContract.IGuideModel) GuideModel.newInstance();

}

}

根据自己实际的mvp实现类定制模板

3: 打包插件,as引入插件,使用插件(插件开发调试忽略)

打包:idea里 build - Prapare Pulgine Module 'xxx' for Developer

项目目录下的jar包

打开as -- setting pulgine import from disk : jar 包目录

重启as

选中目录(含contract , model ,presenter) alt + i(快捷键可在plugine.xml配置)

或 右键 - new - 点击插件图标

输入 名称(XXX)--- 生成 java 类

47509e1684a1

generate1.PNG

点击ok

47509e1684a1

generate2.PNG

感谢:)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android+5.q,MSM8909+Android5.1.1电池管理(2)--qpnp-linear-charger.txt驱动学习概要

MSM8909Android5.1.1电池管理(2)--qpnp-linear-charger.txt驱动学习概要参考文件\kernel\Documentation\power\qpnp-linear-charger.txt---下面是学习此文件\kernel\Documentation\devicetree\bindings\power\qpnp-linear-charger.txt1. 简介The QPNP linear charger drive…

岳阳鸿蒙数学培优阶梯训练,鸿蒙应用-呼吸训练app部分练习展示(开始)

本帖最后由 李洋水蛟龙 于 2020-12-20 18:11 编辑1.在主页面添加一个按钮并响应点击事件效果显示&#xff1a;图片1.png (404.17 KB, 下载次数: 0)2020-12-10 17:53 上传点击按钮“点我”下方便会显示“我被点击了”说明点击事件已完成代码如下&#xff1a;Index.hml文件中Hell…

Android无法优化应用,Android应用优化总结

原标题&#xff1a;Android应用优化总结内存泄漏最常见也是最严重的 &#xff1a;持有Activity 与Context引用&#xff0c;生命周期本该短于应用生命周期&#xff0c;该回收的没被回收掉&#xff0c;导致泄露检测手段&#xff1a;leakcanary mit等Handler泄露new Handler 替换为…

android日期选择滚轮框架,GitHub - liwenzhi/wheelview: 滚轮效果的View,日期选择器

#wheelview滚动效果的View这段时间需要用到一个时间选择器&#xff0c;但是不能使用日期对话框&#xff0c;因为它是筛选条件框架下的&#xff0c;只能是View&#xff01;这个WheelView改造后可以达到要求&#xff01;这个wheelview框架使用的类不多&#xff0c;就几个&#xf…

html页面返回原理,浏览器输入URL到界面显示(HTML渲染)发生了什么?

浏览器从输入URL到界面显示一共经历了6个阶段1. DNS(域名)解析2. TCP连接(三次握手)3. 发送HTTP请求4. 服务器处理请求并返回HTTP报文5. 浏览器解析渲染页面6. 连接结束1. DNS(域名)解析一个网址到ip地址的转换&#xff0c;找到URL对应的IP。如www.xiaochongtec.cn到22.33.55.6…

nginx缓存HtmL文件,Nginx在缓存的html文件上返回404

我试图在没有索引页的所有.html文件中添加缓存&#xff0c;但是当我做了一些更改时&#xff0c;我的文件进入了404找不到页面。Nginx在缓存的html文件上返回404这是我对我的默认配置&#xff0c;没有任何改变&#xff0c;我做了&#xff0c;没有工作。server {listen 80;server…

韩顺平轻松搞定网页设计(html+css+js),韩顺平轻松搞定网页设计方案(html+css+js)之javascript现场授课笔记(完整版).doc...

2011韩顺平轻松搞定网页设计(htmlcssjs)之javascript现场授课笔记(完整版)视频18整和19的前半部分不用看Javascript的基本介绍JS是用于WEB开发的脚本语言&#xff1a;脚本语言是什么&#xff1a;脚本语言不能独立使用&#xff0c;它和HTML/JSP/PHP/ASP.NET配合使用脚本语言也有…

大学计算机基础知识点图文,大学计算机基础知识点超详细总结

大学计算机基础知识点超详细总结 第一章 计算机及信息技术概述1. 电子计算机的发展历程①1946 年 2 月由宾夕法尼亚大学研制成功的 ENIAC 是世界上第一台电子数字计算机。 “诞生了一个电子的大脑” 致命缺陷&#xff1a;没有存储程序。②电子技术的发展促进了电子计算机的更新…

计算机专业学comsol,有关COMSOL的学习心得,与同是初学者的朋友共勉! - 仿真模拟 - 小木虫 - 学术 科研 互动社区...

接触COMSOL也有一年时间了&#xff0c;相信很多朋友都有这样的感触&#xff0c;那就是完全不知所措&#xff0c;无从下手。根据网上的一些经验&#xff0c;参考案例&#xff0c;看用户手册&#xff0c;折腾了几个月甚至大半年的时间&#xff0c;对于模型计算的各种错误一头雾水…

兰州交通大学计算机科学与技术学院,兰州交通大学计算机科学与技术

职朋圈友兰州交通大学 | 计算机科学与技术 | 本科算机科学与技术学科为甘肃省省级重点学科&#xff0c;为硕士一级学科授权点&#xff0c;拥有国家级计算机实验教学示范中心、国家级交通信息类创新人才培养模式实验区。专业师资力量雄厚&#xff0c;2009年被授予国家级“计算机…

圣地亚哥的计算机科学在哪个学院,加州大学圣地亚哥分校计算机科学在哪个学院?...

加州大学圣地亚哥分校计算机科学在工程学院加州大学圣地亚哥分校雅各布工程学院成立于学校建校之初的1964-1965年&#xff0c;共开设6个系&#xff0c;拥有250多位世界级教师&#xff0c;开设本科、硕士和博士三个阶段的课程教育&#xff0c;目前共有本科生6025名&#xff0c;硕…

计算机网络检错码和纠错码的特点,检错码和纠错码有何不同?试比较在网络通信中使用时各自的优缺点。...

检错码和纠错码有何不同&#xff1f;试比较在网络通信中使用时各自的优缺点。更多相关问题心理发展的速度可以有个别差异&#xff0c;可以加速或延缓&#xff0c;但发展的顺序一般不能改变。这说明心理发展具有(德国邓克尔发现&#xff1a;人看到某物品具有一种功能后就很难看出…

云星空计算机名访问不可以,03.PLM系统访问金蝶云星空(webapi):读取基础资料编码、名称...

1. 需求描述PLM系统中的物料&#xff0c;BOM同步到金蝶云星空系统中时&#xff0c;构造的json数据中&#xff0c;一些基础资料字段需要传递编码&#xff0c;而不是名称。 本接口提供获取所有基础资料的编码、名称&#xff0c;可作为PLM系统中的对照关系。2. 接口定义2.1 请求地…

js复制html到粘贴板,用clipboard.js实现纯JS复制文本到剪切板

以前很多人都是用ZeroClipboard.js来实现网页复制内容&#xff0c;火端也是用它。ZeroClipboard是利用flash来实现的&#xff0c;ZeroClipboard兼容性很好&#xff0c;但是由于现在越来越多的浏览器不支持flash&#xff0c;导致一些没法正常使用了。今天火端开始使用clipboard.…

计算机 国际顶尖级会议排名,计算机学科国际会议排名.doc

计算机学科国际会议排名中科院计算所会议会议名称会议介绍代表领域1ACM SIGCOMM: ACM Conf on Communication Architectures, Protocols & AppsACM的旗舰会议之一&#xff0c;也是网络领域顶级学术会议&#xff0c;内容侧重于有线网络&#xff0c;每年举办一次&#xff0c;…

教师计算机excel培训教案,Excel培训教案..doc

三灶中心小学教师信息技术应用能力培训教案(excel部分)excel培训计划安排2学时&#xff0c;通过实例来进行讲解。具体讲解内容及时间进度视老师们的掌握情况酌情安排。附实例如下&#xff1a;培训内容&#xff1a;实例一&#xff1a; 建立与编辑工作表一、实验目的1. 掌握启动和…

计算机程序设计a,计算机程序设计 A(1620401)

计算机程序设计 A 是一门介绍了 C 语言基本概念并将其在程序设计中运用起来的课程。在本课程中&#xff0c;将会介绍如何用 C 语言完成基本的输入输出、数学运算、分支结构表达、循环结构表达&#xff1b;同时&#xff0c;我们会学会如何使用函数对程序进行组织、写出良好的程序…

计算机设备的存放,计算机硬件储存设备与网络储存的发展现状

计算机的出现&#xff0c;改变了人们的生活和生产&#xff0c;而计算机硬件技术的发展&#xff0c;则为计算机储存开辟了新的发展方向和途径。而随着时代的进步&#xff0c;计算机储存技术的发展也是日新月异&#xff0c;现在我们所使用的云储存技术&#xff0c;就是储存技术发…

计算机考研408哪个视频好,408计算机考研视频课哪个好

408计算机考研视频课哪个好&#xff1f;如今&#xff0c;考研培训班比比皆是&#xff0c;选择适合自己的成了很多考生的难题。如今的考研网课辅导&#xff0c;很适合考生复习备考。网络学习很方便,只要你有电脑或者手机,不管在哪里都可以学习,没有时间和地点的限制,另外不懂的知…

计算机键盘没有fn,键盘Fn键失灵怎么解决?键盘Fn键失灵的修复方法

电脑键盘是电脑输入设备中最常用的设备之一&#xff0c;也是大家使用最频繁的的设备。其实键盘Fn键占据着很大分量,Fn键能够实现很多功能,如控制音量、打开关闭摄像头、屏幕亮度调节等。如果Fn键失灵的话,那就会对电脑造成很大的影响&#xff0c;有什么办法修复&#xff1f;下面…