본 포스팅은 実践!Android Studioプラグイン開発 을 기본으로 번역하여 작성했습니다
제 일본어 실력으로 인하여 오역이나 오타가 발생할 수 있습니다.
실제 슬라이드의 일본어
부분을 번역했다는 점 양해바랍니다.
실천! Android Studio Plugin 개발
こにふぁー (@konifar)
Taptrip
자동번역
으로 간단한 커뮤니케이션250개국 / 500만 명
이 이용https://play.google.com/store/apps/details?id=com.taptrip
android-material-icon-generator
https://github.com/konifar/android-material-design-icon-generator-plugin
android-material-icon-generator
특히 개인 개발시 무척 편리!
android-material-icon-generator
40,000 정도 설치
Plugin 개발을 이야기합니다
Plugin 개발 특징 복습
AndroidStudio Plugin 특징
개발 시에는 IntelliJ가 필요
Swing
Java6
에서 개발이 필요HelloWorld
HelloWorld 순서
public class HelloWorldAction extends AnAction {
public void actionPerformed(AnActionEvent event) {
// 여기에 처리를 적는다. 이하는 HelloWorld Notification을 나타내는 코드
Notifications.Bus.notify(
new Notification("group", "Hello World Title", "Hello World Content",
NotificationType.INFORMATION));
}
}
자세한 것은 Qitta에!
http://qiita.com/konifar/items/c6e23921ffec475907fc
여기까지는 그다지 간단
문제는 여기부터
무엇을 어떻게 하면 좋은가 모르겠다
Plugin을 실제로 만들 때 도움되는 이야기를 합니다
오늘 이야기할 것
오늘 이야기하지 않을 것
AnActionEvent
메뉴 표시 전환
메뉴 표시 전환
@Override
public void update(AnActionEvent event) {
VirtualFile file = event.getData(PlatformDataKeys.VIRTUAL_FILE);
boolean isStringXml = file != null && file.getName().equals("strings.xml");
event.getPresentation().setVisible(isStringXml);
}
Project
SDK 버전 취득
Project project = event.getData(PlatformDataKeys.PROJECT);
Sdk sdk = ProjectRootManager.getInstance(project).getProjectSdk();
System.out.println("sdk_version: " + sdk.getVersionString());
// => sdk_version: java version "1.7.0_71"
Editor
Selection 내의 Text 취득
@Override
public void invoke(Project project, Editor editor, PsiFile file) {
final SelectionModel selectionModel = editor.getSelectionModel();
boolean hasSelection = selectionModel.hasSelection();
if (hasSelection) {
final String selectedText = selectionModel.getSelectedText(true);
Editor를 가장 위까지 스크롤
@Override
public void invoke(Project project, Editor editor, PsiFile file) {
ScrollingModel scrollingModel = editor.getScrollingModel();
// 가장 위까지 스크롤
scrollingModel.scrollVertically(0);
Document
Editor 내의 텍스트를 취득
Editor editor = event.getData(PlatformDataKeys.EDITOR);
Document document = editor.getDocument();
String text = document.getText();
Editor 내의 변경을 감지
Editor editor = event.getData(PlatformDataKeys.EDITOR);
Document document = editor.getDocument();
document.addDocumentListener(new DocumentListener() {
@Override
public void beforeDOcumentChange(DocumentEvent documentEvent) {
}
@Override
public void documentChanged(DocumentEvent documentEvent) {
// Droid를 치면, 'D', 'r', 'o', 'i', 'd' 5번 이곳을 통과한다
System.out.println("Changed:" + documentEvent.getNewFragment());
}
});
PsiFile
커서 위치의 Java 클래스를 취득
커서 위치의 Java 클래스를 취득
PsiFile psiFile = event.getData(LangDataKeys.PSI_FILE);
// 커서 위치 취득
int offset = editor.getCaretModel().getoffset();
// 커서 위치 요소 취득
PsiElement element = psiFile.findElementAt(offset);
// 부모 클래스 취득
PsiClass psiClass = PsiTreeUtil.getParentOfType(element, PsiClass.class);
System.out.println("Element:" + element.getText() + ", PsiClass:" + psiClass);
// => Element: FloatingActionButton, PsiClass: PsiClass:MainActivity
UI 구현
쓰기 편리한 컴포넌트
DIalogWrapper를 사용
public class SampleDialogWrapper extends DIalogWrapper {
private JPanel contentPane;
public SampleDialogWrapper(@Nullable Project project) {
super(project);
setTitle("Sample Dialog");
init();
}
@Nullable
@Override
protected JComponent createCenterPanel() { return contentPane; }
}
Dialog 호출
DIalogWrapper dialog = new SampleDialogWrapper(e.getProject());
dialog.show();
HintManager
Editor editor = e.getData(PlatformDataKeys.EDITOR);
HintManager.getInstance().showInformationHint(editor, "Sample information");
Notifications.Bus
Notifications.Bus.nofity(
new Notification("sampleDisplayId", "Sample title",
"Sample content", NotificationType.INFORMATION));
TextFieldWithBrowseButton
public class SampleDialogWrapper extends DIalogWrapper {
private JPanel contentPane;
private TextFieldWithBrowseButton textFieldWithBrowseButton
public SampleDialogWrapper(@Nullable Project project) {
super(project);
setTitle("Sample Dialog");
init();
Editor editor = e.getData(PlatformDataKeys.EDITOR);
textFieldWithBrowseButton.addBrowseFolderListener(new TextBrowseFolderListener(
new FileChooserDescriptor(false, true, false, false, false, false), project));
}
}
고민할 때에 조사 방법
공개되어있는 코드를 읽는 것이 가장 빠르다
Android Studio Plugin Repository
https://githb.com/konifar/android-material-design-icon-generator-plugin
추천 5가지
intellij-sdk-docs
https://github.com/JetBrains/intellij-sdk-docs/tree/master/code_samples
android-parcelable-intellij-plugin
https://github.com/mcharmas/android-parcelable-intellij-plugin
android-drawable-importer-intellij-plugin
https://github.com/winterDroid/android-drawable-importer-intellij-plugin
adb-idea
https://github.com/pbreault/adb-idea
Android Studio Code
http://tools.android.com/build
정리
Project이나 Editor 등의 클래스는 기억해두자
UI도 Dialog이나 Notification은 준비되어있다
모를 때는 비슷한 코드를 읽어보자
그래도 어떻게 하지 못할 때는
Intellij Plugin 스터디
@androhi님이 주최하는 IntelliJ Plugin 스터디가 근시일내에 3번째가 됩니다
원하는 Plugin을 만들어 Android 개발을 더욱 재미있게
감사합니다!
comments powered by Disqus
Subscribe to this blog via RSS.
LazyColumn/Row에서 동일한 Key를 사용하면 크래시가 발생하는 이유
Posted on 30 Nov 2024