...

понедельник, 17 июня 2013 г.

Несколько полезных шаблонов для Android-разработки под eclipse

Вступление


Привет, коллеги.


Сегодня я хочу поделиться с вами несколькими полезными шаблончиками (templates) для IDE Eclipse, которые помогут вам ускорить некоторые рутинные операции при разработке под под Android. Я пока что использую Eclipse для разработки, но, я уверен, что Idea позволит создавать совершенно аналогичные шаблоны.


Что такое шаблоны? Это заранее заготовленные кусочки кода, которые IDE может быстро подставлять для вас при нажатии на Ctrl+Space. Например, введите «syso» в eclipse, нажмите Ctrl+Space. Бац, у вас появился System.out.println(), или «fore» — у вас появится готовый шаблон для цикла for 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 просто импортится в эклипс.

Спасибо за внимание.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


Комментариев нет:

Отправить комментарий