Android studio plugin 作ってみた 〜 create intent method generator 〜

Preview:

Citation preview

Android Studio Plugin 作ってみた 〜 CreateIntent method Generator 〜

関西モバイルアプリ研究会 #9Ryo Sotoyama

自己紹介

● 外山 椋 ( そとやま りょう )

● シーサー株式会社

● Android アプリ開発

private int mIntVal;private long mLongVal;private String mStringVal;private ArrayList<String> mStringList;

問題点 : Activity へのデータ渡し

問題点 : Activity へのデータ渡しprivate int mIntVal;private long mLongVal;private String mStringVal;private ArrayList<String> mStringList;

public static Intent createIntent(Context context, int intVal, long longVal, String stringVal, ArrayList<String> stringList) { Intent intent = new Intent(context, SampleActivity.class); intent.putExtra(ARG_INT_VAL, intVal); intent.putExtra(ARG_LONG_VAL, longVal); intent.putExtra(ARG_STRING_VAL, stringVal); intent.putStringArrayListExtra(ARG_STRING_LIST, stringList);}

public void restore(Intent intent) { this.mIntVal = intent.getIntExtra(ARG_INT_VAL, -1); this.mLongVal = intent.getLongExtra(ARG_LONG_VAL, -1L); this.mStringVal = intent.getStringExtra(ARG_STRING_VAL); this.mStringList = intent.getStringArrayListExtra(ARG_STRING_LIST);}

つらい :(

Solution

● Android Studio(IntelliJ) Plugin

● Android Processing Tool (APT)

Solution

● Android Studio(IntelliJ) Plugin

● Android Processing Tool (APT)

Plugin Example

Code Generator● ButterKnife Zelezny● ParcelableGenerator

Navigation● Dagger IntelliJ Plugin● Otto IntelliJ Plugin

Intent へ値の出し入れする

プラグイン作ってみた

CreateIntent method Generator

どんなプログラムでプラグインが作られているか軽く紹介

例: int s = 1; をクラス内に生成するプラグイン

Code Generator Pluginpublic class ActionClass extends AnAction { @Override public void actionPerformed(AnActionEvent e) { } }

Code Generator Pluginpublic class ActionClass extends AnAction { @Override public void actionPerformed(AnActionEvent e) {

final Project project = e.getProject();final Editor editor = e.getData(DataKeys.EDITOR);final PsiFile file = PsiUtilBase.getPsiFileInEditor(editor, project); } }

Code Generator Pluginpublic class ActionClass extends AnAction { @Override public void actionPerformed(AnActionEvent e) {

final Project project = e.getProject();final Editor editor = e.getData(DataKeys.EDITOR);final PsiFile file = PsiUtilBase.getPsiFileInEditor(editor, project);

new WriteCommandAction.Simple(project, file) { @Override protected void run() throws Throwable { }}.execute(); } }

Code Generator Pluginpublic class ActionClass extends AnAction { @Override public void actionPerformed(AnActionEvent e) {

final Project project = e.getProject();final Editor editor = e.getData(DataKeys.EDITOR);final PsiFile file = PsiUtilBase.getPsiFileInEditor(editor, project);

new WriteCommandAction.Simple(project, file) { @Override protected void run() throws Throwable {

generate(project, file, editor); }}.execute(); } }

private void generate(Project project, PsiFile file, Editor editor){// field インスタンス作成PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(project);

PsiField field = elementFactory.createFieldFromText("int s = 1;", null);}

Code Generator Plugin

private void generate(Project project, PsiFile file, Editor editor){// field インスタンス作成PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(project);

PsiField field = elementFactory.createFieldFromText("int s = 1;", null);

// カーソルのある場所のクラスを取得PsiElement element = file.findElementAt(editor.getCaretModel().getOffset());PsiClass psiClass = PsiTreeUtil.getParentOfType(element, PsiClass.class);

}

Code Generator Plugin

private void generate(Project project, PsiFile file, Editor editor){// field インスタンス作成PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(project);

PsiField field = elementFactory.createFieldFromText("int s = 1;", null);

// カーソルのある場所のクラスを取得PsiElement element = file.findElementAt(editor.getCaretModel().getOffset());PsiClass psiClass = PsiTreeUtil.getParentOfType(element, PsiClass.class);

// 実際のクラス内にフィールド追加JavaCodeStyleManager styleManager = JavaCodeStyleManager.getInstance(project);PsiElement element1 =

styleManager.shortenClassReferences(psiClass.addBefore(field, psiClass.getLastChild()));}

Code Generator Plugin

Code Generator Plugin: Resultpublic class GenerateSampleClass {}

public class GenerateSampleClass { int s = 1;}

最初にフィールドを取得して型によって生成する文を変えればCreateIntent method Generator みたいなのが作れる!

Recommended