Вступление
Привет, коллеги.
Сегодня я хочу поделиться с вами несколькими полезными шаблончиками (templates) для IDE Eclipse, которые помогут вам ускорить некоторые рутинные операции при разработке под под Android. Я пока что использую Eclipse для разработки, но, я уверен, что Idea позволит создавать совершенно аналогичные шаблоны.
Что такое шаблоны? Это заранее заготовленные кусочки кода, которые IDE может быстро подставлять для вас при нажатии на Ctrl+Space. Например, введите «syso» в eclipse, нажмите Ctrl+Space. Бац, у вас появился System.put.println(), или «fore» — у вас появится готовый шаблон для цикла fore each. Более того, данные кусочки параметризированы, и IDE предложит вам ввести имена для нужных переменных.
Если вам это интересно, приступим.
Шаблоны
Для доступа к шаблонам используется меню Window-Preferences-Java-Templates. Там вы увидите список уже готовых шаблонов, а также сможете создать свои.
Давайте посмотрим, какие шаблоны я создал для себя.
Handler
${:import (android.os.Handler, android.os.Message, java.lang.ref.WeakReference)}
private static final class ${handler_name} extends Handler {
private WeakReference<${enclosing_type}> ${outer}Ref;
public ${handler_name}(${enclosing_type} ${outer}) {
${outer}Ref = new WeakReference<${enclosing_type}>(${outer});
}
public void handleMessage(Message msg) {
}
}
Этот простой шаблон позволит моментально создать заготовку для статического Handler'a с обратной ссылкой на внешний класс. Напомню, что создание хендлера как внутреннего класса, не являющегося статическим не рекомендуется. Это может привести к утечке Activity, и призовет лютую ненависть линта по вашу душу.
Немножко модифицировав, мы получаем шаблон для AsyncQueryHandler.
${:import (android.os.AsyncQueryHandler, android.content.ContentResolver, java.lang.ref.WeakReference)}
private static final class ${handler_name} extends AsyncQueryHandler {
private WeakReference<${enclosing_type}> ${outer}Ref;
public ${handler_name}(ContentResolver cr, ${enclosing_type} ${outer}) {
super(cr);
${outer}Ref = new WeakReference<${enclosing_type}>(${outer});
}
}
Parcelable
Создание Parcelable, как известно, требует выполнения однотипных шаблонных действий. Что если нам их автоматизировать?
${:import (android.os.Parcel, android.os.Parcelable)}
public static class ${parcelable_class} implements Parcelable {
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
// TODO: serialize your properties here
}
public static final Parcelable.Creator<${parcelable_class}> CREATOR
= new Parcelable.Creator<${parcelable_class}>() {
public ${parcelable_class} createFromParcel(Parcel in) {
return new ${parcelable_class}(in);
}
public ${parcelable_class}[] newArray(int size) {
return new ${parcelable_class}[size];
}
};
private ${parcelable_class}(Parcel in) {
// TODO: deserialize your properties here
}
}
Этот шаблон позволит нам создать полноценный Parcelable класс, в то время как следующий
${:import (android.os.Parcel, android.os.Parcelable)}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
// TODO: serialize your properties here
}
public static final Parcelable.Creator<${enclosing_type}> CREATOR
= new Parcelable.Creator<${enclosing_type}>() {
public ${enclosing_type} createFromParcel(Parcel in) {
return new ${enclosing_type}(in);
}
public ${enclosing_type}[] newArray(int size) {
return new ${enclosing_type}[size];
}
};
private ${enclosing_type}(Parcel in) {
// TODO: deserialize your properties here
}
позволит нам быстро добавить CREATOR в уже существующий класс.
isEmpty
${:import (android.text.TextUtils)}!TextUtils.isEmpty(${cursor})
очень простенький шаблон, позволяющий быстро вставить проверку на пустоту строки.
getView
Ниже представлено типовое создание getView в адаптере с добавлением ViewHolder. Конкретно этому шаблону я научился у Alexandre Thomas (автору Android Kickstartr и контрибутору AndroidAnnotations) на DevConf 2013.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
v = LayoutInflater.from(context).inflate(${layout_name}, null);
ViewHolder h = new ViewHolder();
v.setTag(h);
}
ViewHolder holder = (ViewHolder) v.getTag();
return v;
}
static class ViewHolder {
// ViewHolder fields
}
Заключение
Я надеюсь, кому-нибудь эти шаблоны помогут сделать разработку чуть-чуть приятней. Для своих шаблончиков я завел специальный гитхаб репозиторий, который буду стараться пополнять новыми шаблончиками по-мере поступления оных. Файл templates.xml просто импортится в эклипс.
Спасибо за внимание.
Автор: evilduck