android studio plugin 作ってみた 〜 create intent method generator 〜
TRANSCRIPT
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 みたいなのが作れる!