powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Android [игнор отключен] [закрыт для гостей] / AndroidAnnotations
25 сообщений из 41, страница 1 из 2
AndroidAnnotations
    #39171975
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное, стоит чуть подробнее для начинающих описать, что это такое, как это едят и какие возможности в связи с применением аннотаций открываются.

Сайт http://androidannotations.org/

На самом сайте дано следующее описание:
Code Diet
AndroidAnnotations is an Open Source framework that speeds up Android development. It takes care of the plumbing , and lets you concentrate on what's really important. By simplifying your code, it facilitates its maintenance .

Грубо переведя, это фреймворк, который позволяет ускорить процесс разработки и повысить читаемость кода.

Пример исходного кода:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
public class BookmarksToClipboardActivity extends Activity {
  
  BookmarkAdapter adapter;
 
  ListView bookmarkList;
 
  EditText search;
 
  BookmarkApplication application;
 
  Animation fadeIn;
 
  ClipboardManager clipboardManager;
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(FLAG_FULLSCREEN, FLAG_FULLSCREEN);
 
    setContentView(R.layout.bookmarks);
 
    bookmarkList = (ListView) findViewById(R.id.bookmarkList);
    search = (EditText) findViewById(R.id.search);
    application = (BookmarkApplication) getApplication();
    fadeIn = AnimationUtils.loadAnimation(this, anim.fade_in);
    clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
 
    View updateBookmarksButton1 = findViewById(R.id.updateBookmarksButton1);
    updateBookmarksButton1.setOnClickListener(new OnClickListener() {
 
      @Override
      public void onClick(View v) {
        updateBookmarksClicked();
      }
    });
 
    View updateBookmarksButton2 = findViewById(R.id.updateBookmarksButton2);
    updateBookmarksButton2.setOnClickListener(new OnClickListener() {
 
      @Override
      public void onClick(View v) {
        updateBookmarksClicked();
      }
    });
 
    bookmarkList.setOnItemClickListener(new OnItemClickListener() {
 
      @Override
      public void onItemClick(AdapterView<?> p, View v, int pos, long id) {
        Bookmark selectedBookmark = (Bookmark) p.getAdapter().getItem(pos);
        bookmarkListItemClicked(selectedBookmark);
      }
    });
 
    initBookmarkList();
  }
 
  void initBookmarkList() {
    adapter = new BookmarkAdapter(this);
    bookmarkList.setAdapter(adapter);
  }
 
  void updateBookmarksClicked() {
    UpdateBookmarksTask task = new UpdateBookmarksTask();
 
    task.execute(search.getText().toString(), application.getUserId());
  }
  
  private static final String BOOKMARK_URL = //
  "http://www.bookmarks.com/bookmarks/{userId}?search={search}";
  
  
  class UpdateBookmarksTask extends AsyncTask<String, Void, Bookmarks> {
 
    @Override
    protected Bookmarks doInBackground(String... params) {
      String searchString = params[0];
      String userId = params[1];
 
      RestTemplate client = new RestTemplate();
      HashMap<String, Object> args = new HashMap<String, Object>();
      args.put("search", searchString);
      args.put("userId", userId);
      HttpHeaders httpHeaders = new HttpHeaders();
      HttpEntity<Bookmarks> request = new HttpEntity<Bookmarks>(httpHeaders);
      ResponseEntity<Bookmarks> response = client.exchange( //
          BOOKMARK_URL, HttpMethod.GET, request, Bookmarks.class, args);
      Bookmarks bookmarks = response.getBody();
 
      return bookmarks;
    }
 
    @Override
    protected void onPostExecute(Bookmarks result) {
      adapter.updateBookmarks(result);
      bookmarkList.startAnimation(fadeIn);
    }
    
  }
 
  void bookmarkListItemClicked(Bookmark selectedBookmark) {
    clipboardManager.setText(selectedBookmark.getUrl());
  }
 
}



И то, что получается, после применения androidannotations:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
@NoTitle
@Fullscreen
@EActivity(R.layout.bookmarks)
public class BookmarksToClipboardActivity extends Activity {
  
  BookmarkAdapter adapter;
  
  @ViewById
  ListView bookmarkList;
 
  @ViewById
  EditText search;
  
  @App
  BookmarkApplication application;
  
  @RestService
  BookmarkClient restClient;
 
  @AnimationRes
  Animation fadeIn;
  
  @SystemService
  ClipboardManager clipboardManager;
 
  @AfterViews
  void initBookmarkList() {
    adapter = new BookmarkAdapter(this);
    bookmarkList.setAdapter(adapter);
  }
  
  @Click({R.id.updateBookmarksButton1, R.id.updateBookmarksButton2})
  void updateBookmarksClicked() {
    searchAsync(search.getText().toString(), application.getUserId());
  }
  
  @Background
  void searchAsync(String searchString, String userId) {
    Bookmarks bookmarks = restClient.getBookmarks(searchString, userId);
    updateBookmarks(bookmarks);
  }
 
  @UiThread
  void updateBookmarks(Bookmarks bookmarks) {
    adapter.updateBookmarks(bookmarks);
    bookmarkList.startAnimation(fadeIn);
  }
  
  @ItemClick
  void bookmarkListItemClicked(Bookmark selectedBookmark) {
    clipboardManager.setText(selectedBookmark.getUrl());
  }
 
}
@Rest("http://www.bookmarks.com")
public interface BookmarkClient {
  
  @Get("/bookmarks/{userId}?search={search}")
  Bookmarks getBookmarks(String search, String userId);
 
}



Как подключить (актуально для android studio 1.5.1):
1. В build.gradle проекта добавить зависимость:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'

        // добавить следующую строку
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}


2. В build.gradle модуля добавить следующие строки:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
apply plugin: 'com.android.application'
// все, что ниже
apply plugin: 'android-apt'

apt {
    arguments {
        resourcePackageName android.defaultConfig.applicationId
        androidManifestFile variant.outputs[0]?.processResources?.manifestFile

        // If you're using Android NBS flavors you should use the following line instead of hard-coded packageName
        // resourcePackageName android.defaultConfig.packageName

        // You can set optional annotation processing options here, like these commented options:
        // logLevel 'INFO'
        // logFile '/var/log/aa.log'
    }
}


И это (версия 3.3.2 актуальна на момент написания этого сообщения):
Код: sql
1.
2.
3.
4.
5.
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    apt "org.androidannotations:androidannotations:3.3.2"
    compile "org.androidannotations:androidannotations-api:3.3.2"
}



После этих нехитрых манипуляций можно писать лаконичный код.
Так выглядит рабочий код пустой активности:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
package ru.wadman.reference;

import android.app.Activity;

import org.androidannotations.annotations.EActivity;

@EActivity(R.layout.activity_main2)
public class Main2Activity extends Activity {

}



Основные ключевые слова:
@EActivity - подключает и инициализирует layout активности.
@OptionsMenu - указывает меню для активности.
@ViewById - подключает любую активность (контрол) с id к переменной.
@AfterViews - метод, который выполняется, когда все вью созданы и подключены к ранее объявленным переменным.
@Background - метод, который будет выполняться в дополнительном потоке (фоновая задача).
@UiThread - метод, который будет выполняться в основном потоке. Применяется после @Background.
@Extra - переменная, которая будет сохранена между сеансами активности. Например, после смены ориентации экрана.
@TextChange - метод-обработчик, который будет вызываться при изменении текста.
@Click - метод-обработчик, который вызывается при клике на кнопку, галочку и т.п.
@OptionsItem - метод-обработчик при выборе пункта меню.

Это очень краткий список аннотаций.
С полным списком можно ознакомиться тут: https://github.com/excilys/androidannotations/wiki/AvailableAnnotations

--- добавлено 02.03.2016
Пример исходного кода нового проекта, созданного в студии 1.5.1 с BlankActivity
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
package ru.wadman.test;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}



Тот же функционал, но уже через AndroidAnnotations:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
package ru.wadman.purse;

import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.TextView;

import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.OptionsItem;
import org.androidannotations.annotations.OptionsMenu;
import org.androidannotations.annotations.ViewById;

@EActivity(R.layout.activity_main)
@OptionsMenu(R.menu.menu_main)
public class MainActivity extends AppCompatActivity {

    @ViewById(R.id.textView)
    TextView textView;
    @ViewById(R.id.fab)
    FloatingActionButton fab;
    @ViewById(R.id.toolbar)
    Toolbar toolbar;

    @AfterViews
    void init() {
        setSupportActionBar(toolbar);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

    @OptionsItem(R.id.action_settings)
    void optionSettings() {
        Snackbar.make(textView, "Settings selected", Snackbar.LENGTH_LONG).setAction("Action", null).show();
    }

}

...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172067
pand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Большое спасибо за обзор ,
очень полезная технология.

а перечень граблей гдето можно найти ?
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172081
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pandа перечень граблей гдето можно найти ?
Из граблей я встречал только это: https://habrahabr.ru/post/154851/#comment_5322429
Интересная библиотека.

Немного смутила ситуация с инъекциями. Например тот же @ViewById задекларированный в классе помеченным @EBean незаметно потащит за собой весь контекст, что может привести к утечке памяти при потери бдительности (а библиотека как раз этому способствует).

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

Это похоже на правду. По меньшей мере было, когда была версия меньше 3-х.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172100
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, возможно не все знают - суфикс генерируемых классов можно менять с _ на что-то свое с помощью аргумента classSuffix. также можно менять пакет, финальность класса и кое чего еще https://github.com/excilys/androidannotations/wiki/CustomizeAnnotationProcessing
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172102
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaсуфикс генерируемых классов можно менять с _
Да, кстати, упустил эту деталь: если суффикс не менять, то в манифесте вместо MainActivity нужно будет прописать MainActivity_ и т.п.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172197
Микола Питерский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Года 2 назад изучал эту технологию "ускоренного кодинга". Но применять не стал - читаемость кода намного хуже.
Может кто клепает проекты десятками тому и пригодится для ускорения набивки кода. Android Studio и так все делает сама за меня так что хватает пока ее :)
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172206
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Микола ПитерскийГода 2 назад изучал эту технологию "ускоренного кодинга". Но применять не стал - читаемость кода намного хуже.
в каком месте она становится хуже?


Микола ПитерскийAndroid Studio и так все делает сама за меня так что хватает пока ее :)
например что она делает за тебя?
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172222
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Микола ПитерскийAndroid Studio и так все делает сама за меня так что хватает пока ее :)
Шутишь, да? Как только студия научится определять тяжелый код и автоматом его выносить в отдельный поток - соглашусь. Загляни на страницу аннотаций - удивишься, сколько можно сократить времени на кодинг.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172264
Фотография Джибс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все хочу попробовать,
но как от руки не доходят


просто актуально для однотипных фрагментов.
где незначительная часть отличается, пока наследованием обхожу.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172266
Микола Питерский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не помню конкретно - но какие-то косяки там были. Может с отладкой проблемы или студия не умеет сама код аннотации завершать или еще что-то.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172272
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Микола ПитерскийМожет с отладкой проблемы или студия не умеет сама код аннотации завершать или еще что-то.
Ни с тем, ни с другим не испытывал проблем. Использую года 3.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172273
Микола Питерский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot chpashaМикола ПитерскийAndroid Studio и так все делает сама за меня так что хватает пока ее :)
например что она делает за тебя?[/quot]

Ты наверное Delphi никогда не пробовал раз так говоришь, если кодинг в Android Studio для меня праздник - то на IDE Delphi я уже спокойно смотреть не могу - так и хочется матюкнуться. Это действительно тупая деревяшка, которая ничего не умеет, ничего не знает и не хочет учиться и которая от версии к версии становится все хуже.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172289
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Микола Питерскийкодинг в Android Studio для меня праздник - то на IDE Delphi я уже спокойно смотреть не могу
Я тебя понимаю. :) Но можно сделать еще лучше... И тема этому посвящена.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172294
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Микола ПитерскийНе помню конкретно - но какие-то косяки там были. Может с отладкой проблемы или студия не умеет сама код аннотации завершать или еще что-то.
оно генерит обыкновенный ява-код, примерно такой-же, какой пришлось бы писать руками. какие могут быть проблемы с отладкой или "завершением" аннотаций (что бы это не значило)?

Микола ПитерскийТы наверное Delphi никогда не пробовал раз так говоришь
ты не представляешь, сколько всего я пробовал. только я не понимаю какая связь между Android Studio и android annotations кроме слова "android"? твоя фраза имеет примерно столько же смысла как и "я не пользуюсь дезодорантом - меня вязанные носки устраивают".
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172311
Микола Питерский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок - убедили. Пока пару месяцев матюкаюсь с делфи, а как вернусь на андроид - обязательно еще раз попробую.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172852
Фотография Джибс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а c аннотациями в RecyclyView - ViewHolder да и других адаптерах?
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172862
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Джибса c аннотациями в RecyclyView - ViewHolder да и других адаптерах?
Не понял вопроса.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172868
Фотография Джибс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я про

class ViewHolder extends RecyclerView.ViewHolder {
....
}
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39172888
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Джибсclass ViewHolder extends RecyclerView.ViewHolder
Вроде нет.
Да и не совсем представляю, что там заинжектить можно... Описание холдера?
Или где-то уже что-то подобное реализовано?
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39173099
Фотография Джибс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanВроде нет.
Да и не совсем представляю, что там заинжектить можно... Описание холдера?
Или где-то уже что-то подобное реализовано?

когда сложная структура, много элементов во вьюшке, и ее нужно заполнить

приходится та-же рутина в духе findViewById ...
потом view.settext(...);


с другой стороны здесь сложнее.

у меня до 5 разных видов вьюшек в списке бывает
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39173125
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Джибсприходится та-же рутина в духе findViewById ...
потом view.settext(...);
Думаю, что тот же ViewById должен сработать так или иначе.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39173218
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не, с холдерами эта фишка скорее всего не сработает. они ищут контролы через контекст, а их в нем скорее всего не будет. но вот что можно сделать, так это дописать свою аннотацию и генератор (или запостить фича-реквест) чтобы в конструктор холдерa передавать вьюху, а не контекст. а дальше уже генерить findViewById. но на данный момент из коробки адаптеры остаются кажется единственным местом где приходится писать говнокод вида findViewById
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39173281
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaэто дописать свою аннотацию и генератор
В четверке будут плагины. Во заживем!
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39173303
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanchpashaэто дописать свою аннотацию и генератор
В четверке будут плагины. Во заживем!
да будет удобно. хотя я уже давно форкнул и свою версию пилю, но с плагинами будет действительно круче.
...
Рейтинг: 0 / 0
AndroidAnnotations
    #39173658
Фотография Джибс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а глуппый вопрос,
аннотации. на скорость как влияют,

или это настолько незначительно, что можно пренебречь ?
...
Рейтинг: 0 / 0
25 сообщений из 41, страница 1 из 2
Форумы / Android [игнор отключен] [закрыт для гостей] / AndroidAnnotations
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]