Задать вопрос
  • Как использовать SharedPreferences для Position, Switch, Spinner?

    RATlius
    @RATlius
    Разработчик Android
    1 код - получение строки выбранного `spinner`
    2 код - чтение из `SharedPreferences`
    3 код - чтение и запись `SharedPreferences`
    Вам нужно:
    1: взять значение из `Spinner`
    2: положить значение в `SharedPreferences`
    Ответ написан
  • Как настроить связь сайта и приложения на андроид?

    RATlius
    @RATlius
    Разработчик Android
    Выведи сайт через webview в самом приложении
    Ответ написан
    2 комментария
  • Как сделать так, чтобы Telegram bot работал для каждого пользователя отдельно (JAVA)?

    RATlius
    @RATlius
    Разработчик Android
    Сталкивался с похожей проблемой в разработке своего бота. Исправил эту проблему так:
    Создал поле Map userMap; и Набор состояний отдельным классом State (можно реализовать через enum или иным удобным образом)
    при обращении пользователя к боту вносил его в это поле, когда приходил новый запрос к боту - проверял есть ли пользователя в userMap. Если есть пользователь в списке - продолжить с его State, если нету - начать со стартового state
    Код
    @Override
        public void onUpdateReceived(Update update) {
            if (update.hasMessage()) {
                Message inMessage = update.getMessage();
                long chatId = inMessage.getChatId();
                botState = switchBot(inMessage.getFrom());
    
                if (botState == State.main) {
                    if (inMessage.hasText()) {
                    ...
                } else if (botState == State.newOrder) {//заявка записаться
                    String positiveAnswer = "Спасибо, мы Вам перезвоним";
                    String messageAdminsText = "";
                    ...
                } else if (botState == State.dev) { //команды разработчика
                    if (inMessage.hasText() && inMessage.getFrom().getUserName().equals(Const.DEV)) {
                    ...


    Это не лучший способ, можно сделать лучше и через потоки, но я не стал сильно заморачиваться с этим
    Ответ написан
    Комментировать
  • Жизненный цикл onResume() как место для всех операций, связанных с действием пользователя с текущей Activity?

    RATlius
    @RATlius
    Разработчик Android
    Логику Вы можете прописывать где Вам удобно, я ставлю обработчики кнопкам в onCreate().
    Методы onCreate() и onResume() очень похожи, но имеют небольшое отличие. onStart() вызывается когда Activity готова, а onResume() когда она возобновляется. Прочитайте про ЖЦ Activity. А что где прописывать зависит от логики приложения. Если Вам нужно считать количество показов экрана то тут будут отличия, в зависимости от того, где Вы установите инкремент:
    Примеры

    onResume(): Запуск+1, свернул-развернул приложение+1, показал-скрыл диалоговое окно+1
    onStart(): Запуск+1, свернул-развернул приложение+1, показал-скрыл диалоговое окно+0
    onCreate(): Запуск+1, свернул-развернул приложение+0, показал-скрыл диалоговое окно+0
    Ответ написан
    4 комментария
  • Должен ли тулбра и владки быть в фрагменте?

    RATlius
    @RATlius
    Разработчик Android
    Поддерживаю Денис Загаевский, потому что Вам проще сделать обработку нажатий в каждом отдельном фрагменте, чем писать огромную кучу обработчиков в Activity, которая по большей части не будет использоваться. В ней будет использоваться 10% от всех обработчиков (просто на каждом фрагменте каждый раз разные 10%)
    Ответ написан
    Комментировать
  • Как вызвать метод фрагмента во фрагменте?

    RATlius
    @RATlius
    Разработчик Android
    В Вашем фрагменте метод fetchData.execute(); вообще не вызывается
    Ответ написан
  • Как скопировать имена (сигнатуры) всех выделенных методов?

    RATlius
    @RATlius
    Разработчик Android
    в Android Studio есть возможность многокурсорности. Т.е. когда в одном текстовом файле есть несколько курсоров. Это делается Комбинацией Alt + J для последовательного выделения одинаковых значений. Либо в ручную: Alt + Shift + ЛКМ.
    Вы можете свернуть все свои методы (Ctrl + Shift + "-");
    Вручную выставить множество курсоров возле всех методов;
    Разворачиваете все методы (Ctrl + Shift + "+") <Если не развернуть, тогда методы скопируются вместе с телами>;
    Нажать Shift + End (у вас выделится множество строк в одном файле);
    Ctrl + C (все в буфере);
    Ctrl + V в нужном месте;
    Profit;
    5bef160441709126517066.png
    Ответ написан
    Комментировать
  • Как сделать прокрутку в виджете?

    RATlius
    @RATlius
    Разработчик Android
    Как и на любой другой разметке: положите Ваш TextView в NestedScrollView
    Ответ написан
    2 комментария
  • Как передать параметры в doInBackground?

    RATlius
    @RATlius
    Разработчик Android
    В Вашем случае Вы не правильно объявляете класс. Он должен быть у Вас как
    public class Sender extends AsyncTask<String, Void, String>

    Эта картинка поможет Вам разобраться как работает AsyncTask
    5bee7fa98048f650054032.png

    И эта статья
    Ответ написан
    3 комментария
  • При каком условии должен завершиться массив?

    RATlius
    @RATlius
    Разработчик Android
    У Вас 2 ошибки в коде:
    1 - Не верно проверяется количество ячеек. Нужно вот так:
    int cells = list.size() % rows == 0 ? list.size() / rows : (list.size() / rows) + 1;

    2 - Вам вообще блок "else if{}" - не нужен

    P.S. Упрощенная реализация Вашего метода:
    public class  ConvertList2Array {
        public int[][] toArray(List<Integer> list, int rows) {
            int cells = list.size() % rows == 0 ? list.size() / rows : (list.size() / rows) + 1;
            int[][] array = new int[rows][cells];
            int index = 0;
            for (int c=0; c<cells; c++) //проход по столбцу
                for (int r=0; r<rows; r++) //проход по строкам
                    array[r][c] = index++
                    if (index == list.size()) break; //проверка на выход за предел list
            return array;
        }
    }
    Ответ написан
  • Сколько стоит дизайн мобильного приложения на пример 1-3 экран?

    RATlius
    @RATlius
    Разработчик Android
    Вы не сможете оценить стоимость 1 экрана в связи с 2мя важными условиями:
    1: Экраны разные. Для примера есть экран заставки (приложение Youtube: "белый фон, красная иконка") и экран с картой (GoogleMaps: " карта, элементы управления картой, дополнительные отображения, связь с сервером и т. п.). Было бы глупо оценивать 2 эти экрана одинаково. Это для Вас как для заказчика сказать: "Заплатите мне 5000 рублей, 10-ти рублевыми купюрами. Какая разница что так 5т.р, что так 5т.р.?"
    2: Каждый исполнитель оценивает свою работу по разному, в зависимости от своих навыков. Можно нанять пьющего дядю Васю на должность водителя грузовой газели, а можно профессионального гонщика, у которого несколько золотых кубков. Да, работу они выполнят одну и ту же, но насколько качественно, в срок, и количеством издержек?
    Ответ написан
  • Как сделать сортировку от первой даты до второй?

    RATlius
    @RATlius
    Разработчик Android
    Если Вы храните дату миллисекундах типа long, то просто сортируйте любым удобным способом эти числа
    Ответ написан
    Комментировать
  • Как сделать в IntelliJ IDEA форматирование кода по моим критериям?

    RATlius
    @RATlius
    Разработчик Android
    Не нужно ничего менять. Эти функции уже есть. В Вашем случае это:
    Ctrl + "+" - развернуть метод;
    Ctrl + "-" - свернуть метод;

    Вам будет лучше выполнить по предложенной схеме, потому что если Вы переделаете чтобы весь код так сокращался, тогда даже большие методы, которые состоят больше чем из одной строки будут форматироваться по указанной выше схеме, что приведет к запутыванию
    Ответ написан
    Комментировать
  • Откуда менять фрагмент?

    RATlius
    @RATlius
    Разработчик Android
    В вашей логике используется подход, когда Вы назначаете одной и той же кнопке разные обработчики в каждом фрагменте.
    Для целей смены фрагментов есть хорошее руководство от самого Google, которое говорит реализовывать Callback'и. Это проще в поддержке и масштабируемости Вашего приложения.
    Это суть того вопроса который Вы задали (заменяйте мысленно "операция" на Activity).
    Очень рекомендую ознакомиться со всей статьей. И вообще с общими методами разработки приложений от Google, потому что многие разработчики им следуют как негласному стандарту, а если Вам в будущем придется поддерживать/изменять чужой проект, велика вероятность того, что Вы уже будете знакомы с используемыми приемами.
    Ответ написан
    Комментировать
  • Как быстро выучить Java?

    RATlius
    @RATlius
    Разработчик Android
    Так же как и Вы был когда-то участником олимпиад.
    так как на Олимпиаде больше всего интересует верное выполнение задачи, а не грамотное исполнение (как в реальной разработке, где нужно будет потом свою программу еще изменять), и учитывая, что Вам дано 4 языка - то условия задач на всех 4 будут одинаковыми и простыми.
    Курс.
    Этого курса Вам хватит вполне для получения основ языка для выполнения примитивных задач, как на олимпиаде (врядли от Вас будет требоваться правильная архитектура приложения и т. п.)
    Ответ написан
  • Получение данных с сервера Android без нажатий на кнопку, как организовать?

    RATlius
    @RATlius
    Разработчик Android
    Создать фоновый таймер для загрузки данных:
    AsyncLoaderTimer bgTimer = new AsyncLoaderTimer(); //новое поле класса MainActivity
    
        class AsyncLoaderTimer extends AsyncTask<Long, Void, Void> {//класс фонового таймера
    
            @Override
            protected Void doInBackground(Long... longs) {
                while (isCancelled()) {
                    try {
                        Thread.sleep(longs[0]);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    publishProgress();
                }
                return null;
            }
    
            @Override
            protected void onProgressUpdate(Void... values) {
                getWeb();
            }
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            bgTimer.execute(2_000L); //интервал миллисекунд
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            bgTimer.cancel(false);
        }


    То как Вы хотите реализовать обновление данных - не лучшая практика. Вам лучше посмотреть как реализовывать такие клиент-серверные решения.
    Ответ написан
    Комментировать
  • Как исправить ошибку в android studio?

    RATlius
    @RATlius
    Разработчик Android
    Суть Вашей ошибки в том, что у какого-то элемента на xml-разметке не установлено прикрепление по горизонтали/вертикали
    т. е. Нужно каждый элементы привязать к чему-то (родительский контейнер / другой элемент) и обязательно 2 привязки должны быть горизонтальная (левая/правая сторона) и вертикальная(верхняя/нижняя сторона)
    Ответ написан
    Комментировать
  • Почему AsynkTask.onProgressUpdate() не разрешает менять текст TextView?

    RATlius
    @RATlius Автор вопроса
    Разработчик Android
    Проблема решилась банально.
    Вызов метода AsyncTask.onProgressUpdate() осуществляется через AsyncTask.publishProgress();
    Ответ написан
    Комментировать
  • Почему не выполняется условие?

    RATlius
    @RATlius
    Разработчик Android
    Пересобирите проект
    как сделать
    Ответ написан
    Комментировать
  • Какой картографический сервис выбрать для мобильного приложения?

    RATlius
    @RATlius
    Разработчик Android
    Почему не подходят GoogleMap?
    Там есть все запрошенный возможности (редактирование установленных меток, создание кастомных поинтов, подгрузка на карту всплывающих уведомлений)
    Могу помочь с этим вопросом
    Ответ написан
    Комментировать