Ответы пользователя по тегу Android
  • Одна Activity и множество Fragment, best practices?

    @alaershov
    Android-developer
    Я бы на вашем месте отказался от архитектуры "Одно Activity на всё приложение", и сделал всё на обычных Activity.
    Проблема у вас, судя по всему, в разбиении функций приложения на слабо связанные модули. Разрисуйте и распишите ваши экраны и функции, которые принадлежат каждому из них, и подумайте, какие из функций зависят друг от друга, а какие нет.
    Почитайте про принципы SOLID, которые помогут понять, как лучше разделять ответственность классов между друг другом: https://realm.io/news/donn-felker-solid-part-1/
    Отделите бизнес-логику от UI-логики и логики хранения данных с помощью архитектуры Clean: fernandocejas.com/2014/09/03/architecting-android-...
    Организуйте связь UI и бизнес-логики с помощью подхода MVP, где Model - это UseCases (они же Interactors) из Clean: antonioleiva.com/mvp-android
    Попробуйте Moxy (https://github.com/Arello-Mobile/Moxy) в качестве библиотеки для реализации MVP, она избавит вас от написания большого количества boilerplate-кода и части проблем с переворотом экрана.
    Ответ написан
    Комментировать
  • В каких случаях лучше использовать фрагменты, а в каких активити?

    @alaershov
    Android-developer
    Если возникает требование закрыть полностью родительский экран, то стоит задуматься о том, что это, на самом деле, отдельный экран. Единственный легитимный случай, когда можно закрыть части родительского экрана - это диалог.
    Пердавать данные между Activity приложения, действительно, не всегда удобно. Однако поддержка такой связи между экранами позволит вам, например, открывать экран карты из совершенно другого места (например, Push-уведомления, или вообще другого приложения), используя тот же самый протокол, Extras в Intent. Это принцип организации Android-приложения. Слабо связанные между собой экраны-модули приложения. Для того, чтобы уйти на какой-то экран специально с целью вернуть оттуда данные, есть механизм startActivityForResult.
    Ответ написан
    4 комментария
  • Dagger 2: можно ли настроить ленивое создание по умолчанию?

    @alaershov
    Android-developer
    Это невозможно с точки зрения самого языка. Если у вас есть поле обычного объектного типа - оно или null, если инъекция ещё не отработала, или не null, если инъекция уже сработала. Нельзя в принципе сделать так, чтобы поле было не null, и лениво инициализировалось при первом к нему обращении.
    То есть, ответ на ваш вопрос - "нельзя". И Dagger тут ни при чём :)
    Возникает другой вопрос: а вам точно нужно, чтобы они все создавались по требованию? Вы ощущаете заметную просадку производительности при инициализации графа объектов? В чём реально проблема неленивой инициализации?
    Ответ написан
  • Как сделать правильно разметку ListView, по типу - чат?

    @alaershov
    Android-developer
    Не используйте ListView, используйте RecyclerView.
    В адаптере у него есть отличный метод:
    getItemViewType(int position);
    Он по номеру элемента определяет, к какому виду относится этот элемент, и возвращает его числовой код. Код и реализацию этого метода нужно сделать вам самостоятельно.
    Потом этот код подаётся (системой) в
    createViewHolder(ViewGroup parent, int viewType)
    В этом методе вы можете создавать нужный вам View из нужного layout. Не нужно этого:
    if(!myIDfromList.equals(LV_USID)) { 
        layout.setGravity(Gravity.RIGHT);
        layoutBg.setBackground(getResources().getDrawable(R.drawable.user_style_msg));
    } else {
        layout.setGravity(Gravity.LEFT);
        layoutBg.setBackground(getResources().getDrawable(R.drawable.my_style_msg));
    }


    Просто сделайте два класса ViewHolder и разные layout для них.
    Ответ написан
    Комментировать
  • Влияют ли версии buildTools и compileSdk использованные при сборке сторонней библиотеки на успешность сборки моего проекта?

    @alaershov
    Android-developer
    По умолчанию такого происходить не должно. В гайдах андроида рекомендуется всегда использовать последние версии build tools и compile SDK. Это просто версия компилятора, грубо говоря, а на успешность сборки может повлиять только исходный код. Конечно, могут быть какие-нибудь баги в новых версиях компилятора, но это исключительные случаи. Обратная совместимость - одно из главных требований к средствам сборки.
    Ответ написан
    Комментировать
  • Как ускорить открытие приложения?

    @alaershov
    Android-developer
    В документации есть целый раздел, посвящённый тому, как ускорить загрузку приложения, и найти причины медленного старта: https://developer.android.com/topic/performance/la...
    Ответ написан
    Комментировать
  • Andoird tabs создать табы?

    @alaershov
    Android-developer
    У вас Android Studio не просто подсвечивать это должна, а при наведении курсора подсказывать, что именно вы делаете не так. Мне не нравится разрыв между именем конструктора и открывающей скобкой, но не уверен точно, что в этом проблема.
    Ответ написан
    Комментировать
  • Как хранить идентификатор изображения?

    @alaershov
    Android-developer
    Если статья будет открываться только локально (например, это страница раздела "Помощь" в приложении), то я бы сделал или класс-транслятор, который бы некоторый константный текстовый ID, хранящийся в базе и придуманный вами, переводил в Android Resource ID, и по нему показывал изображение. Доставать изображение по имени файла - тоже вполне приемлемый вариант, если оно у вас не в ресурсах лежит, а в assets, например.
    Ответ написан
    Комментировать
  • Как устранить утечку памяти при замене фрагментов?

    @alaershov
    Android-developer
    Добейтесь состояния, когда память, как вы думаете, утекла. Пару раз запустите сборщик мусора, для верности. Если памяти всё ещё занято неадекватно много - сделайте дамп памяти. Потом воспользуйтесь анализатором дампов, например, Memory Analyzer Tool от Eclipse, и там будет видно, какие объекты занимают память, и почемеу они не удалены сборщиком мусора.
    Ответ написан
    Комментировать
  • Размеры экранов мобильных и планшетов?

    @alaershov
    Android-developer
    Плотность пикселей на экране определяется не только разрешением, но и размером экрана.
    Например, если макет 1080x1920 свёрстан в расчёте на 5-дюймовый экран Nexus 5, то да, это xxhdpi. А если вы рассчитывали на огромный планшет - то плотность пикселей будет ниже.
    Почитайте официальную документацию про размеры экранов: https://developer.android.com/guide/practices/scre...
    Для конвертации разных размеров удобно пользоваться инструментами, вроде этого: https://pixplicity.com/dp-px-converter/
    Ответ написан
    Комментировать
  • Реально ли начать писать программы под андроид на C#? Или проще начать изучать Java?

    @alaershov
    Android-developer
    Как и говорят остальные отвечающие, это вполне возможно. Вопрос в другом, нужно ли? Разрабатывая под Android не на родной платформе вы неизбежно столкнётесь с различными костылями, а то и вовсе не работающими вещами. Изучить Java будет намного полезнее и эффективнее, а после C# это сделать будет нетрудно. Хотя и придётся отказаться от некоторых привычных конструкций вроде лямбда-выражений, которые появились только в Java 8, а на Android используется Java 7.
    Ответ написан
    Комментировать
  • Linux + Android Studio стоит ли?

    @alaershov
    Android-developer
    Я пользуюсь Android Studio на Xubuntu 14.10, и очень ей доволен. Раньше использовал её на Windows 7, и из отличий могу отметить только меньшую прозводительность и периодические проблемы с подключением устройств (точнее, с запуском на них приложений - этого просто иногда не происходило. Возможно, причина в том, что это была ещё бета-версия Android Studio).
    На Linux вам, правда, потребуется чуть больше подготовки для работы. Например, чтобы udev допустил устройство для подключения, вам ему нужно руками прописать vendor ID этого устройства (в интернете есть гайды, ничего сложного). Ещё у меня на Xubuntu были проблемы с отпаданием клавиатуры в студии, она как-то конфликтовала с IBus (тоже гуглится, как это решить).
    Для работы на не особо производительных машинах, вроде вашего ноутбука, советую установить Xubuntu 14.10 или 15.04. У меня всё работает отлично, а интернет поможет разобраться в возникающих проблемах - совсем без них обойтись, скорее всего, не получится:)
    Ответ написан
    Комментировать