Ответы пользователя по тегу Android
  • Есть ли нативная ORM для Android?

    artemgapchenko
    @artemgapchenko
    И не появилось ли для андройда нормального NoSQL хранилища, типа MongoDB?

    Понятие "нормальность" может варьироваться, но в голову сразу приходят Realm и ObjectBox.
    Ответ написан
    Комментировать
  • Как создать кнопку возврата в ActionBar'е?

    artemgapchenko
    @artemgapchenko
    Вешайте обработчик нажатия на item с id android.R.id.home.
    Есть ещё вариант не обработчик вешать, а указать в манифесте родительскую активность - тогда при нажатии на up кнопку у вас будет происходить возврат на родительскую активити безо всякого дополнительного кода.
    Ответ написан
    Комментировать
  • Немного о правильности написания кода. Какой вариант выбрать?

    artemgapchenko
    @artemgapchenko
    Много уровней вложенности плохо читаются. Попробуйте добавить внутрь условия

    if (rulesField.isChecked()) {
        register(numberField.getText().toString(), codeField.getText().toString());
    }

    Ещё парочку вложенных if-else, чтобы получилось вот такое:

    @Override
        public void onButtonClick() {
            if (isRequested()) {
                if (rulesField.isChecked()) {
                        if (canProceed()) {
                             register(numberField.getText().toString(), codeField.getText().toString());
                        } else if (isExtraRequestRequired()) {
                            doSomething();
                         } else if (oneMoreCondition()) {
                             doSmomethingOnExtraCondition();
                         } else {
                              Log.e("Unexpected condition");
                         }
                } else {
                    showMessage(R.string.error_rules);
                }
            } else {
                requestRegister(numberField.getText().toString());
            }
        }

    и вы поймёте, что удерживать в голове ту ветку, которая вам интересна (сначала if, потом вложенный в него else, потом второй if-else из вложенных в else первого if'а) становится решительно невозможно. Поэтому и стараются так структурировать код, чтобы он был "плоским", то есть без вложенности. Это, конечно идеал, и иногда труднодостижимый, но стремиться к нему стоит - человек, который после вас будет читать ваш листинг (а чаще всего это будете вы сами недели через две после того, как вы его написали, и успешно забыли всю структуру), скажет вам спасибо.
    Ответ написан
    2 комментария
  • Как посмотреть данные в sqlite на эмуляторе андроид?

    artemgapchenko
    @artemgapchenko
    Подключите Stetho и смотрите через него.
    Ответ написан
    Комментировать
  • Изменить дату Calendar в андроиде?

    artemgapchenko
    @artemgapchenko
    calendar.add(Calendar.DAY_OF_YEAR, 10);
    forDate.setText(calendar.getTime());
    Ответ написан
  • Как конфигурировать параметры приложения в зависимости от типа build'a?

    artemgapchenko
    @artemgapchenko
    Привет.

    для debug билда url API должен указывать на локальную виртуалку, для release - url указывает на продакшн-сервер

    Тут лучше всего подойдут т.н. build config fields. Описываете его в build.gradle файле, а потом используете его как BuildConfig.API_URL. Пример здесь.

    для debug билда отключен Crash Reporting, для release - репорт ошибок включен

    Просто инициализируете свой крэш репортинг через if вот так:
    if (!BuildConfig.DEBUG) {
        // инициализируем
    }

    В идеале хотлесь бы еще конфигурировать классы (например в debug вместо AnalyticTracker использовать AnalyticTrackerStub).

    Для разных билд типов можно задавать свои наборы исходников. На том же уровне, на котором находится главный набор исходников (main), определите ещё пару наборов - debug и release. Внутри них и размещаете свой AnalyticTracker: debug/java/com/myapp/utils/AnalyticTracker.java и release/java/com/myapp/utils/AnalyticTracker.java. В зависимости от того, какой у вас сейчас выбран build variant (debug или release), Android Studio будет использовать или первую или вторую версию класса AnalyticTracker. Да, из главного набора исходников AnalyticTracker.java нужно будет удалить, иначе Android Studio не сумеет выбрать нужный класс. Более подробная документация тут.
    Ответ написан
    1 комментарий
  • Как получить размер ImageView?

    artemgapchenko
    @artemgapchenko
    ViewTreeObserver даёт возможность подцепиться к определённым этапам в "жизненном цикле" View, в том числе к этапу, когда размеры View были определены:

    imageview.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            //
            // Тут вы пишите ваш код, который завязан на знание размера View
            //
    
            // А тут отсоединяете OnGlobalLayoutListener
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                imageview.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            } else {
                imageview.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
        } 
    });
    Ответ написан
    2 комментария
  • Как правильно сделать клик по item?

    artemgapchenko
    @artemgapchenko
    Добавьте следующее к корневому ViewGroup вашего item'a:
    android:descendantFocusability="blocksDescendants"
    Ответ написан
    Комментировать
  • Как в одном активити использовать android.support.v4.app.Fragment и android.app.Fragment?

    artemgapchenko
    @artemgapchenko
    Нельзя.
    AppCompatActivity порождает FragmentManager из support библиотеки, который, в свою очередь, умеет работать только с Fragment из support библиотеки.
    Обычный Activity порождает FragmentManager из SDK, который, в свою очередь, умеет работать только с Fragment из SDK.
    Ответ написан
    Комментировать
  • Зачем нужен Dependency Injection в Android разработке?

    artemgapchenko
    @artemgapchenko
    Начать неплохо бы с понимания того, что такое DI. Обратимся к википедии:

    Внедрение зависимости (англ. Dependency injection, DI) — процесс предоставления внешней зависимости программному компоненту.

    Если выражаться не канцеляритом, а обычным русским языком, то DI - это когда вы своему компоненту (например, классу) предоставляете нужные для него зависимости извне, а не создаете их сами в конструкторе, или через инициализацию в месте объявления поля. То есть не так:

    public class Api {
    	....
    	private final HttpClient client = new OkClient();
    }

    А, например, так:

    public class Api {
    	....
    	private final HttpClient client;
    
    	public Api(@NonNull HttpClient client) {
    		this.client = client;
    	}
    }


    И что нам это даёт?

    Ну, очевидно, нам теперь проще менять зависимости. Нужна вам другая реализация абстрактного класса HttpClient - взяли, и передали её через конструктор, или через метод-setter. В случае с первым куском кода, вам пришлось бы ещё и класс Api переписывать, что в случаях, отличных от тривиальных, может привести к ошибкам. Получается, что ваш класс теперь закрыт от изменений (смотрим Open/Closed Principle).

    Окей, а на практике-то какие бенефиты?

    Во-первых, вы теперь можете написать инициализацию вашей программы через конфигурационные файлы. Скажем, на старте будет читаться простенький текстовый файл, который определяет, какой httpclient использовать, какие настройки доступа к бд применять и так далее, и, исходя из этого, будут определяться зависимости.
    Во-вторых, вам теперь существенно проще писать тесты. Написали вы, скажем, какой-нибудь парсер, который принимает InputStream, содержащий в себе данные json-объекта, как-то хитро его парсит, и выдаёт вам объект вашей бизнес-модели. В приложении этот парсер будет принимать на вход реализацию InputStream'а, которая берёт данные из сети, а в тестах - реализацию, которая просто читает файл с диска (потому что тесты должны выполняться часто и быстро, и ваша задача в тесте - протестировать ваш парсер, а не скорость сетевого соединения).

    Вот, в общем-то, и всё. А Dagger - это просто библиотека, которая автоматизирует ручное внедрение зависимостей, равно как и другие DI-библиотеки.

    P.S. В некоторых случаях чрезмерное увлечение DI может привести к нежелательным эффектам, вроде чрезмерного усложнения кода, поэтому внедряйте аккуратно. Понимание приходит с опытом.
    Ответ написан
    Комментировать
  • Не возвращается список файлов на карте памяти?

    artemgapchenko
    @artemgapchenko
    Наверняка на Android 6 запускаете. Разрешения, начиная с этой версии, должны запрашиваться на стадии выполнения. Вот вам статейка для изучения.
    Ответ написан
  • Как предотвратить случайный pull-to-refresh при скроллинге вниз?

    artemgapchenko
    @artemgapchenko
    внутри ScrollView есть RecyclerView.
    Зачем? RecyclerView/ListView/GridView не предназначены для того, чтобы их внутрь ScrollView засовывать, у вас из-за этого всё переиспользование дочерних виджетов к чертям летит. Начните с исправления этой проблемы, а потом беритесь за траблу с pull-to-refresh (хотя вангую, что она после исправления первой проблемы исчезнет).
    Ответ написан
    2 комментария
  • Стоит ли продолжать изучать Android develop?

    artemgapchenko
    @artemgapchenko
    Здравствуйте, как многие знают, Google готовит замену Android

    Откуда вы всё это берёте? Есть проект на Гитхабе с таким вот README:

    Pink + Purple == Fuchsia (a new Operating System)

    Всё. Ни про замену Android, ни про предназначение проекта ничего не сказано. К проекту подключено 3 (три) человека, развивается он без году неделя, никаких официальных анонсов не было.
    Прекращайте читать советские газеты перед обедом и вместо первоисточников и не занимайтесь домыслами того, чего нет. Изучайте Android и выбросите Фуксию из головы на ближайшие года два, пока не станет понятно, что это такое и кому это нужно.
    Ответ написан
    Комментировать
  • Насколько это "кошерно" сохранять объекты в базу с помощью ORM вместо реализации интерфейса Parcelable?

    artemgapchenko
    @artemgapchenko
    Собственно цель лишь в том, чтобы оградить код от лишней грязи

    Конкретизируйте, где возникает "лишняя грязь".

    от неприятных ошибок, которые могут возникнуть при использовании Parcelable

    Вроде того, что новое поле добавили, а в writeToParcel() и createFromParcel() указать его забыли? Ну так это, AutoValue + AutoParcel, и нет больше такой проблемы.

    Пользуетесь ли вы ORM для того, чтобы сохранять объекты?

    Чтобы сохранять - да. Чтобы передавать объект из одной Activity в другую - нет. Но могу себе представить варианты, когда какая-нибудь отличная от Parcelable сериализация будет необходима. Например, объект вашего класса содержит Bitmap, или же просто byte array. При попытке положить этот объект в Bundle как Parcelableу вас упадёт исключение (могу соврать, но у меня вроде на Bitmap-ах весом около 1.5-2 мегабайта падало). Возможный выход - сохранить этот Bitmap на карточку как файл, и пробросить путь к файлу в следующую Activity.
    Ответ написан
    7 комментариев
  • Где лучше взаимодействовать с view?

    artemgapchenko
    @artemgapchenko
    В методе onPostExecute(). Метод get() блокирует работу потока, вызвавшего этот метод (в вашем случае это будет ui-поток, если вы хотите взаимодействовать со View) пока doInBackground() не закончит свою работу.
    Ответ написан
    Комментировать
  • Мультиязычность в android приложении?

    artemgapchenko
    @artemgapchenko
    Не совсем понятно, зачем вам вообще что-то определять, а затем менять. По умолчанию Android будет подгружать строковые значения из файла values/strings.xml. Если у пользователя на устройстве установлена русская локаль, то будут подгружаться значения из values-ru/strings.xml (при условии, конечно, что такой файл есть, в противном случае всё так же будут подгружаться значения из values/strings.xml). Если немецкая - values-de/strings.xml. Ну и так далее. Правила разрешения конкретного файла посмотреть можно тут.
    Ответ написан
    4 комментария
  • Как скрыть кнопки в Navigation Bar?

    artemgapchenko
    @artemgapchenko
    Если я вас правильно понял, вам нужен флаг View.SYSTEM_UI_FLAG_LOW_PROFILE.
    Ответ написан
    Комментировать
  • Здравствуйте! У меня появилась такая ошибка рендеринга. Что мне делать, чтобы исправить ее?

    artemgapchenko
    @artemgapchenko
    Написано английским по белому:

    Tip: Try to build the project

    Соберите проект.
    Ответ написан
    Комментировать
  • Android: как ловить Broadcast'ы в AsyncTask'е?

    artemgapchenko
    @artemgapchenko
    Вопрос: как правильно использовать Broadcast в классе AsyncTask?

    Ответ: никак. После завершения работы AsyncTask тут же прибивается системой, с выполнением метода onPostExecute, в котором ваши broadcast receivers отвязываются от broadcast manager'a. А так как широковещательное сообщение может прийти в BroadcastReceiver с задержкой, то у вас и получается, что AsyncTask отработал, broadcast receivers отвязались, сообщение пришло, но обработать его некому.

    Вынесите свои broadcast receivers на уровень Activity, и отключайте их в onPause().
    Ответ написан
    Комментировать
  • Как сделать такую анимацию?

    artemgapchenko
    @artemgapchenko
    Копайте в сторону Activity Transitions с shared elements.
    Ответ написан
    Комментировать