Pull to refresh

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

Reading time 3 min
Views 29K

Вступление


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

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

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

Если вам это интересно, приступим.

Шаблоны


Для доступа к шаблонам используется меню Window-Preferences-Java-Templates. Там вы увидите список уже готовых шаблонов, а также сможете создать свои.

Давайте посмотрим, какие шаблоны я создал для себя.



В названиях своих шаблонов я сделал общий префикс «at_», но вы можете заменить это на то, что вам удобно.

Handler (at_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 (at_queryhandler).
${: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 (at_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 класс, в то время как следующий (at_creator)
${: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 (at_nisempty)

${:import (android.text.TextUtils)}!TextUtils.isEmpty(${cursor})

очень простенький шаблон, позволяющий быстро вставить проверку на пустоту строки.

getView (at_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 просто импортится в эклипс.

Спасибо за внимание.
Tags:
Hubs:
+34
Comments 22
Comments Comments 22

Articles