android filehelper,为AndroidStudio开发mvp插件(MvpHelper)
如果覺得寫mvp有點(diǎn)枯燥無味,我們可以做點(diǎn) cool 的事情:做個(gè) as 插件
help.png
todo-mvp: 基礎(chǔ)的MVP架構(gòu)。
todo-mvp-loaders:基于MVP架構(gòu)的實(shí)現(xiàn),在獲取數(shù)據(jù)的部分采用了loaders架構(gòu)。
todo-mvp-databinding: 基于MVP架構(gòu)的實(shí)現(xiàn),采用了數(shù)據(jù)綁定組件。
todo-mvp-clean: 基于MVP架構(gòu)的clean架構(gòu)的實(shí)現(xiàn)。
todo-mvp-dagger2: 基于MVP架構(gòu),采用了依賴注入dagger2。
dev-todo-mvp-contentproviders: 基于mvp-loaders架構(gòu),使用了ContenPproviders。
dev-todo-mvp-rxjava: 基于MVP架構(gòu),對(duì)于程序的并發(fā)處理和數(shù)據(jù)層(MVP中的Model)的抽象。
因?yàn)閷?duì)mvp的理解不同,會(huì)有很多種方式表達(dá)架構(gòu),所以插件要極簡(jiǎn)易讀,可擴(kuò)展性強(qiáng),所以可以選擇:
/**
* 通過模板生成類
* @param var1 文件生成路徑
* @param var2 文件名
* @param var3 模板名
* @param var4 是否生產(chǎn)類
* @param var5 模板參數(shù)
*/
public abstract PsiClass createClass(@NotNull PsiDirectory var1, @NotNull String var2, @NotNull String var3, boolean var4, @NotNull Map var5) throws IncorrectOperationException;
也就是只要定制不同的模板就可以實(shí)現(xiàn)擴(kuò)展性
直接貼下步驟:
1: idea File - new - Project - IntelliJ Platform Plugin
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相關(guān)類");
mvpHandler.setOnGenerateListener(this);
mvpHandler.pack();
//設(shè)置對(duì)話框跟隨當(dāng)前windows窗口
mvpHandler.setLocationRelativeTo(WindowManager.getInstance().getFrame(anActionEvent.getProject()));
mvpHandler.setVisible(true);
}
@Override
public void onGenerate(String text) {
JavaDirectoryService directoryService = JavaDirectoryService.getInstance();
//當(dāng)前工程
Project project = actionEvent.getProject();
map.put("NAME", text);
map.put("PACKAGE_NAME", Util.getPackageName(project));
//鼠標(biāo)右鍵所選擇的路徑
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 拖動(dòng)控件
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("未注冊(cè)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();
}
實(shí)現(xiàn)類:(引導(dǎo)頁為例)... 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();
}
}
根據(jù)自己實(shí)際的mvp實(shí)現(xiàn)類定制模板
3: 打包插件,as引入插件,使用插件(插件開發(fā)調(diào)試忽略)
打包:idea里 build - Prapare Pulgine Module 'xxx' for Developer
項(xiàng)目目錄下的jar包
打開as -- setting pulgine import from disk : jar 包目錄
重啟as
選中目錄(含contract , model ,presenter) alt + i(快捷鍵可在plugine.xml配置)
或 右鍵 - new - 點(diǎn)擊插件圖標(biāo)
輸入 名稱(XXX)--- 生成 java 類
generate1.PNG
點(diǎn)擊ok
generate2.PNG
感謝:)
總結(jié)
以上是生活随笔為你收集整理的android filehelper,为AndroidStudio开发mvp插件(MvpHelper)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一张图 综合交通 解决方案_航天智慧环保
- 下一篇: 视频质量检测中的TP、FP、Reacll