Как создать собственные шаблоны проектов для Android Studio 3.6 или более поздней версии? - PullRequest
0 голосов
/ 06 мая 2020

Я пытался создавать шаблоны проектов, чтобы оптимизировать свое время, я нашел много ответов по этому поводу, но не работаю с новейшими версиями Android Studio. Я попытался скопировать существующий шаблон проекта и работал, но только если я использую то же имя, что и основной шаблон проекта.

Мне нужно только создать новый шаблон проекта и показать его на экране мастера, как на этом рисунке :

Экран мастера

Я создал копию папки BasicActivity, которую нашел по этому пути {папка программных файлов AndroidStudio} \ plugins \ android \ lib \ templates \ activity и изменил template. xml файл моего скопированного шаблона, изменив имя шаблона и значение категории.

Но после перезапуска Android Studio мой новый проект не отображался. Что мне нужно сделать, чтобы отобразить новые шаблоны проектов?

Я читал исходный код android плагин в репозитории IntelliJ, и мой шаблон имеет правильный формат для отображения в мастере.

Мой пример: шаблон. xml

<template
        revision="1"
        name="My template"
        minApi="9"
        minBuildApi="14"
        description="Example template">

    <parameter
        id="className"
        name="Feature name"
        type="string"
        constraints="class|nonempty|unique"
        default="ExampleFeature"
        help="Feature name (omit 'fragment' suffix)" />

    <category value="Activity"/>

    <!-- 128x128 thumbnails relative to template.xml -->
    <thumbs>
        <!-- default thumbnail is required -->
        <thumb>template_basic_activity.png</thumb>
    </thumbs>

    <globals file="globals.xml.ftl"/>
    <execute file="recipe.xml.ftl"/>

</template>

globals. xml .ftl

<?xml version="1.0"?>
<globals>
 <global id="resOut" value="${resDir}" />
 <global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
</globals>

рецепт. xml .ftl

<!--?xml version="1.0"?-->
<recipe>
 <instantiate from="root/res/layout/fragment_demo.xml.ftl" to="${escapeXmlAttribute(resOut)}/layout/fragment_${classToResource(className)}.xml"></instantiate>
 <open file="${escapeXmlAttribute(resOut)}/layout/fragment_${classToResource(className)}.xml"></open>

 <instantiate from="root/src/app_package/DemoView.java.ftl" to="${escapeXmlAttribute(srcOut)}/${className}View.java"></instantiate>
 <open file="${escapeXmlAttribute(srcOut)}/${className}View.java"></open>

 <instantiate from="root/src/app_package/DemoPresenter.java.ftl" to="${escapeXmlAttribute(srcOut)}/${className}Presenter.java"></instantiate>
 <open file="${escapeXmlAttribute(srcOut)}/${className}Presenter.java"></open>

 <instantiate from="root/src/app_package/DemoFragment.java.ftl" to="${escapeXmlAttribute(srcOut)}/${className}Fragment.java"></instantiate>
 <open file="${escapeXmlAttribute(srcOut)}/${className}Fragment.java"></open>
</recipe>

Анализ плагина IntelliJ android, I нашел этот момент, который может быть там, где IDE ищет каталог пользовательских шаблонов, я тоже поместил копию своего шаблона в это место и не работал.

  private static List<File> getUserDefinedTemplateRootFolders() {
    List<File> folders = new ArrayList<>();

    String homeFolder = AndroidLocation.getFolderWithoutWrites();
    if (homeFolder != null) {
      // Look in $userhome/.android/templates
      File templatesFolder = new File(homeFolder, FD_TEMPLATES);
      if (templatesFolder.isDirectory()) {
        Collections.addAll(folders, templatesFolder);
      }
    }
    return folders;
  }

И в этот момент:

@GuardedBy("CATEGORY_TABLE_LOCK")
  private void addTemplateToTable(@NotNull File newTemplate, boolean userDefinedTemplate) {
    TemplateMetadata newMetadata = getTemplateMetadata(newTemplate, userDefinedTemplate);
    if (newMetadata != null) {
      String title = newMetadata.getTitle();
      if (title == null || (newMetadata.getCategory() == null &&
                            myCategoryTable.columnKeySet().contains(title) &&
                            myCategoryTable.get(CATEGORY_OTHER, title) == null)) {
        // If this template is uncategorized, and we already have a template of this name that has a category,
        // that is NOT "Other," then ignore this new template since it's undoubtedly older.
        return;
      }
      String category = newMetadata.getCategory() != null ? newMetadata.getCategory() : CATEGORY_OTHER;
      File existingTemplate = myCategoryTable.get(category, title);
      if (existingTemplate == null || compareTemplates(existingTemplate, newTemplate) > 0) {
        myCategoryTable.put(category, title, newTemplate);
      }
    }
  }

1 Ответ

2 голосов
/ 06 мая 2020

Верно. В Android Studio 3.6 и 4.0 beta5 невозможно добавить новые шаблоны действий в форм-фактор "Mobile" в мастере создания нового проекта, поскольку список заголовков шаблонов жестко запрограммирован в исходном коде . Но можно добавить шаблоны в другие форм-факторы.

Обратите внимание, что даже для мобильного форм-фактора новый шаблон действия может быть использован после создания проекта (File > New > Activity > "New Template Title here")

Начиная с Android Studio 4.0, Template API (надеюсь) будет открыт в виде точки расширения (см. https://issuetracker.google.com/issues/154531807)

В IntelliJ IDEA можно создать шаблон из существующего проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...