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

21
Android Studio Plugin 作作作作作 作 CreateIntent method Generator 作 作作作作作作作作作作 #9 西 Ryo Sotoyama

Upload: -

Post on 14-Apr-2017

238 views

Category:

Software


0 download

TRANSCRIPT

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

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

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

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

自己紹介

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

● シーサー株式会社

● Android アプリ開発

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

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

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

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

問題点 : 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);}

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

つらい :(

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

Solution

● Android Studio(IntelliJ) Plugin

● Android Processing Tool (APT)

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

Solution

● Android Studio(IntelliJ) Plugin

● Android Processing Tool (APT)

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

Plugin Example

Code Generator● ButterKnife Zelezny● ParcelableGenerator

Navigation● Dagger IntelliJ Plugin● Otto IntelliJ Plugin

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

Intent へ値の出し入れする

プラグイン作ってみた

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

CreateIntent method Generator

Page 11: Android studio plugin 作ってみた 〜 create intent method generator 〜
Page 12: Android studio plugin 作ってみた 〜 create intent method generator 〜

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

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

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

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

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

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); } }

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

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(); } }

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

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(); } }

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

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

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

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

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

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

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

Code Generator Plugin: Resultpublic class GenerateSampleClass {}

public class GenerateSampleClass { int s = 1;}

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

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