Modelos de arquivo no Android Studio

Problema

Decidi criar um modelo para um fragmento, mas onde fazer isso no Android Studio?

Primeiro, acessei as configurações do IDE no Android Studio. Localizei uma área que listava vários modelos. Eu tinha certeza de que tinha encontrado. Criei um novo modelo chamado “Fragmento de ciclo de vida” e preenchi-o com o conteúdo desejado. Então apliquei as alterações e fechei a janela.

Cliquei com o botão direito em meu pacote de fragmentos> novo> …. nada mudou. Acontece que o que eu criei era um modelo Java genérico. Eu poderia usá-lo acessando new> java class> drop down para “Lifecycle Fragment”. Mas isso claramente não era o ideal porque não se encaixava na área dos modelos do Android. Além disso, o que eu faria no futuro para um modelo que requer recursos de layout? Eu queria fazer isso direito.

Modelos Android

Após algumas pesquisas, descobri que os modelos Android usados ​​no Android Studio não são específicos do Android Studio. Na verdade, eles nem são específicos do IntelliJ. Em vez disso, esses modelos se conectam ao ADT e são baseados em um sistema chamado FreeMarker. Esta é a mesma tecnologia de modelo que fornece modelos dentro do Eclipse usando o ADT Plugin.

Localização dos modelos Android

Você pode encontrar todos os modelos Android do Android Studio em:
ANDROID_STUDIO_DIR/plugins/android/lib/templates

Estrutura e formato dos modelos Android

Você pode aprender como estruturar e formatar modelos aqui: Documento de formato de modelo do
Android ADT

Exemplo de modelo

Criei um novo modelo chamado “Fragmento de Ciclo de Vida” e coloquei-o no diretório “outro” localizado no caminho descrito acima. O conteúdo desses arquivos é mostrado abaixo para se ter uma ideia da aparência de um modelo.

A estrutura do diretório é:

FragmentWithLifecycle
./template.xml
./recipe.xml.ftl
./globals.xml.ftl
./temlpate_blank_fragment.png
./root/src/app_package/LifecycleFragment.java.ftl
./root/res/layout/fragment_blank.xml.ftl

template.xml

<?xml version="1.0"?>
<template
format="4"
revision="1"
name="New Fragment With Lifecycle"
minApi="7"
minBuildApi="8"
description="Creates a new fragment, with hooks for the entire fragment lifecycle and a static initializer.">

<dependency name="android-support-v4" revision="8" />

<category value="Other" />

<parameter
id="className"
name="Fragment Name"
type="string"
constraints="class|unique|nonempty"
default="MyFragment"
help="The name of the fragment class to create" />

<parameter
id="includeLayout"
name="Create layout XML?"
type="boolean"
default="true"
help="Generate a layout XML for the fragment" />

<thumbs>
<thumb>template_blank_fragment.png</thumb>
</thumbs>

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

</template>

receita.xml.ftl

<?xml version="1.0"?>
<recipe>
<dependency mavenUrl="com.android.support:support-v4:+"/>

<#if includeLayout>

<instantiate from="res/layout/fragment_blank.xml.ftl"
to="${escapeXmlAttribute(resOut)}/layout/fragment_${classToResource(className)}.xml" />

<open file="${escapeXmlAttribute(resOut)}/layout/fragment_${classToResource(className)}.xml" />
</#if>


<open file="${escapeXmlAttribute(srcOut)}/${className}.java" />

<instantiate from="src/app_package/LifecycleFragment.java.ftl"
to="${escapeXmlAttribute(srcOut)}/${className}.java" />
</recipe>

globals.xml.ftl

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

template_ blank _fragment.png

Copiado do diretório de modelos de fragmentos em branco pré-existente.

root / src / app_package / LifecycleFragment.java.ftl

package ${packageName};

import <#if appCompat?has_content>android.support.v7.app.ActionBarActivity<#else>android.app.Activity</#if>;
import android.<#if appCompat?has_content>support.v4.</#if>app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class ${className} extends Fragment {

//public static final String arg_param1 = "SOMETHING";

public static ${className} newInstance()
{
$
{className} frag = new ${className}();

// Get arguments pass in, if any
Bundle args = frag.getArguments();
if(args == null)
{
args
= new Bundle();
}

// Add parameters to the arguments bundle
//args.putInt(SOME_KEY, someValue);

frag
.setArguments(args);

return frag;
}

public ${className}()
{
// TODO
}

//------- Start Fragment Lifecycle -----------
@Override
public void onAttach(Activity activity)
{
super.onAttach(activity);
}

@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
<#if includeLayout>
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_${classToResource(className)}, container, false);
<#else>
return super.onCreateView(inflater, container, savedInstanceState);
</#if>
}

@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
}

@Override
public void onStart()
{
super.onStart();
}

@Override
public void onResume()
{
super.onResume();
}

@Override
public void onPause()
{
super.onPause();
}

@Override
public void onStop()
{
super.onStop();
}

@Override
public void onDestroyView()
{
super.onDestroyView();
}

@Override
public void onDestroy()
{
super.onDestroy();
}

@Override
public void onDetach()
{
super.onDetach();
}
//------- End Fragment Lifecycle -------------
}

root / res / layout / fragment_blank.xml.ftl

<LinearLayout >="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
>

</LinearLayout>