• Какие данные можно получить через GPS в телефоне?

    @YuryBorodkin
    Android dev
    Gps в android возвращает обьект Location. Список его полей можно посмотреть тут
    Ответ написан
    Комментировать
  • Как сделать кнопки произвольной формы на Android?

    @YuryBorodkin
    Android dev
    Если ты хочешь иметь какие-то сегменты с разными обработчиками на клик, ну или на вид одна кнопка, а по факту там пять зон с разными обработчиками, это делается через viewgroup, т.е кнопки накладываются друга на друга или как-то еще сочетаются.
    В твоем случаем можно сделать что-то вроде
    код лэйаута, тебе нужно что в FrameLayout
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <FrameLayout
            android:layout_width="80dp"
            android:layout_height="80dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">
    
            <Button
                android:id="@+id/top_left"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:layout_gravity="top|start"
                android:background="@drawable/rect_black_stroke_40dp" />
    
            <Button
                android:id="@+id/top_right"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:layout_gravity="top|end"
                android:background="@drawable/rect_black_stroke_40dp" />
    
            <Button
                android:id="@+id/bottom_left"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:layout_gravity="bottom|start"
                android:background="@drawable/rect_black_stroke_40dp" />
    
            <Button
                android:id="@+id/bottom_right"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:layout_gravity="bottom|end"
                android:background="@drawable/rect_black_stroke_40dp" />
    
            <Button
                android:id="@+id/center"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:layout_gravity="center"
                android:background="@drawable/circle_black_stroke_40dp" />
        </FrameLayout>
    
    </androidx.constraintlayout.widget.ConstraintLayout>


    circle_black_stroke_40dp
    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="oval">
        <size
            android:width="40dp"
            android:height="40dp" />
        <stroke
            android:width="1dp"
            android:color="#000" />
    </shape>

    rect_black_stoke_40dp
    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <size
            android:width="40dp"
            android:height="40dp" />
        <stroke
            android:width="1dp"
            android:color="#000" />
    </shape>

    Потом ставишь обработчики на id частей кнопки и готово. Можно один на все части (ну или сразу на весь FrameLayout) тогда будет на тап по любой части одна реакции. Либо, на каждый сегмент свой обработчик.
    Ответ написан
  • Есть ли смысл читать эти исходники приложений от гугл?

    @YuryBorodkin
    Android dev
    Исходники приложении от google io читал все.
    Мнение - то что гуглеры считают модным очередной весной, так свою прилу и пишут, архитектуру такую никто в проде не использует (я не видел, во всяком случае). Изучить стоит, но это просто реклама очередного подхода, стоит воспринимать как пример использования гугловых компонентов.
    Мне кажется все эти "новые и лучшие" подходы и архитектуры гуглеры пилят исключительно чтоб засветится в отчетах и видосах.
    Ответ написан
    Комментировать
  • Что выбрать для кроссплатформенного мобильного приложения?

    @YuryBorodkin
    Android dev
    С кроссплатформой беда, теорема эскобара в действтии.
    React Native- очень бажный , на андроиде плохо работает. Всегда будет такой эффект, что на некоторых телефонах оно крашится или не работает, и при этом разработчик ничего не может поделать. Особенно обидно, если это девайс заказчика. Нырять в натив все равно придется.
    Ionic и прочие решения в нативном браузере - это некрасиво или медленно или некрасиво и медленно. Не тот экспириенс, что ожидаешь от приложения в 2к20. Нырять в натив все равно придется.
    Xamarin - малопопулярен, бажен. Не уверен что стоит связываться с платформой, помоему она все.
    Flutter - набирается популярность, но спецы пока редкие, опыта продакшна мало. Бажен как и все, но вроде меньше.
    В итоге все платформы страдают одинковыми болячками - редкие спецы, сложночинимые баги платформы, необходимость иметь экспертизу в нативщине, ибо еще не было проекта в котором хватило нужных компонентов.
    Думаю стоит отталкиваться от имеющихся компетенции, ну или возможности их нанять.
    Ответ написан
    Комментировать
  • Как в ListView при нажатие получить текст?

    @YuryBorodkin
    Android dev
    в адаптер передается список (ArrayList) данных, position соответсвует индексу в этом списке. Запросив данных по индексу можно понять куда было нажатие.
    Ответ написан
    1 комментарий
  • Какой выбрать ноутбук для работы в Intellij Idea?

    @YuryBorodkin
    Android dev
    За 50к и десктоп не купить толковый. Б.у можно на ebay поискать, XPS старенький - https://www.ebay.com/itm/Dell-Latitude-E6530-1000G... что-то типа того.
    Ответ написан
    Комментировать
  • Как бэкенд-разработчику поднять свой заработок?

    @YuryBorodkin
    Android dev
    Самый надежный способ - просто переехать в Москву, там зп, даже относительно расходов, выше в разы.
    Более сложный - но и более перспективный и денежный - удаленка на белого господина из США, но требования гораздо выше -нужен норм (b2)инглишь и уметь что-то промычать, а главное - не быть аутистом (cultural fit).
    Удаленки искать на hackernew, weworkremotely, например. Сейчас ее много, все хотят аутсорсить в бедный страны и лучше(дешевле!) без прокладок.
    Ответ написан
    Комментировать
  • Почему ошибка AppCompatActivity при запуске на Android 7x?

    @YuryBorodkin
    Android dev
    Панелька эта показывает результат для определенной темы.
    Там, где у тебя кнопка с надписью `AppTheme` выбери тему своего приложения (можно посмотреть как называется в res/values/styles.xml) и должно отобразиться то что у тебя будет при запуске.
    Ответ написан
  • Каким образом реализовать красивый вывод неизвестного количества TextView?

    @YuryBorodkin
    Android dev
    Можно вообще все в один TextView и ставить каждому тэгу URLSpan.
    Ответ написан
    Комментировать
  • Каким способом можно отобразить видео в активити и наложить сверху текст?

    @YuryBorodkin
    Android dev
    Для отображения видео - https://developer.android.com/guide/topics/media/e...
    Поверх view плеера можно наложить TextView в требуемых местах.
    Ответ написан
    Комментировать
  • Почему возникает ClassCastException в onBindViewHolder?

    @YuryBorodkin
    Android dev
    Очевидно, в классе-адаптере неверно описана логику работа с данным.
    Должна быть синхронность модели (того что у вас поле `dataSource`) и ViewHolder-а.
    Практически, это значит, что в методе (исходя из того, что используется RecyclerView)

    `getItemViewType` должен возвращаться уникальный идентификатор-int для каждого класса-модели. Например
    override fun getItemViewType(position: Int): Int {
            return when (val item = dataSource[position]) {
                is FirstLetter -> 1
                is Acronym ->2
                else -> throw IllegalArgumentException("unknown item type $item")
            }
        }

    а в `onCreateViewHolder` должен возвращаться такой ViewHolder, который соответсвует уникальному идентификатору для позиции (например для `viewType == 1` должен создаваться `FirstLetterViewHolder`)
    Таким образом будет организованность синхронность ViewHolder'ов и модели.
    Т.е, если в метод onBindViewHolder передался `AcronymViewHolder` то в dataSource[position] всегдя будет лежать `Acronym`
    Ответ написан
  • Как организовать структуру проекта с использованием паттерна MVP?

    @YuryBorodkin
    Android dev
    MVP - это организация для view части приложения. Она не описывает способ взаимодействия с domain, data частью приложения. Поэтому вполне можно иметь все компоненты в модуле с релевантным ui.
    А части не свзяанные с ui, логику работы приложения (бд, сеть, логика, модель) - можно отделять и хранить в своих модулях.
    Ответ написан
    Комментировать
  • Как сделать такой слайдер внутри CollapsingToolbar?

    @YuryBorodkin
    Android dev
    <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="@dimen/detail_backdrop_height"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            android:fitsSystemWindows="true">
    
            <android.support.design.widget.CollapsingToolbarLayout
                android:id="@+id/collapsing_toolbar"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_scrollFlags="scroll|exitUntilCollapsed"
                android:fitsSystemWindows="true"
                app:statusBarScrim="@android:color/transparent"
                app:contentScrim="@android:color/transparent">
    
                <ImageView
                    android:id="@+id/backdrop"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:scaleType="centerCrop"
                    android:fitsSystemWindows="true"
                    app:layout_collapseMode="parallax" />
    
                <android.support.v7.widget.Toolbar
                    android:id="@+id/toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="100dp"
                    android:background="@android:color/transparent"
                    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
                    app:layout_collapseMode="pin" />
    
            </android.support.design.widget.CollapsingToolbarLayout>
    
        </android.support.design.widget.AppBarLayout>

    Сделать обычный collapsing tollbar, ну и менять картинку в imageView.
    Ответ написан
  • Как поменять зависимости в build.gradle?

    @YuryBorodkin
    Android dev
    Это `selling point` градла вообще, способность просто прописать зависимости и все заведется. Но - градлу нужно иметь репозиторий, в котором эта зависимости будет находится.
    В дефолтной структуре проекта, созданного студией, в рутовом проекте, в `build.gradle` надо не забыть прописать
    allprojects {
        repositories {
            google()
            jcenter()
    //other repositories
        }
    }

    т.к либы джетпака все в `google()` репозитории.
    Ответ написан
    Комментировать
  • Можно ли сделать приложение ios/android не позволяющее себя закрыть?

    @YuryBorodkin
    Android dev
    Есть несколько решений, от простых к сложным.
    1)Дешево и сердито - для вашего приложения убрать все наэкранные контролы и в приложении переопределить `onBackPressed` . Минус - системе ничего не мешает убить приложение, юзеру перезагрузить девайс, при обновлении приложения с гугл плей надо опять запускать прилу.
    2)Сделать ваше приложение дефолтным лаунчером. При старте устройства будет стартовать приложение. Минус - можно путем манипуляций с загрузчиком, либо подключив устройство к ПК приложение убрать.
    3)Android for business, kiosk mode - https://developer.android.com/work/dpc/dedicated-d... . Путем манипуляций с утройством, можно ограничить функционирование девайса, вполне можно залочить на одном приложении. Минус - есть определенные сложности с автоматическим обновление приложения, сложнее с разработка, не мейнстрим, дорого.
    4)Своя прошивка. Можно сделать что угодно. Минус - дорого и долго.
    Ответ написан
    Комментировать
  • Как определить конец строки в TextView?

    @YuryBorodkin
    Android dev
    Если имеется ввиду таймстамп в сообщении - проще всего это сделать через неразрывный пробел , т.е добавлять в TextView помимо строки 10-15 пробелов неразрывныйх + сам таймстамп.
    Эффект - если место есть в строке, то таймстамп отобразится в конце строки. Если нет - на следующей строке в конце (если достаточно пробелов). Изменение размера тайстампа можно сделать с помощью AbsoluteSizeSpan, а цвета - ForegroundColorSpan.
    Ответ написан
    5 комментариев
  • Почему не меняется текст в fragment?

    @YuryBorodkin
    Android dev
     Два раза лэйаут создается потомучто. Надо на return view;  в последней строке исправить.
    Ответ написан
    2 комментария
  • Как устранить некорректное отображение избранных элементов в recyclerview?

    @YuryBorodkin
    Android dev
    хм, я бы посоветовал вам изучить как анонимные классы захватывают переменные - например тут.
    причина ошибки - вы ипользуете position, которые передается параметром метода onBindViewHolder. тут стоит использовать holder.getAdapterPosition() внутри анонимного класса-обработчика нажатия.
    Ответ написан
    1 комментарий
  • Приложение не отображается на экране на Android?

    @YuryBorodkin
    Android dev
    Надо вызвать setContentView() и передать в него id этого лэйаута.
    Удивительно, что аппа не падает при старте.
    Ответ написан
    1 комментарий
  • Может ли android приложение получить доступ к блокировке экрана?

    @YuryBorodkin
    Android dev
    Нет, нельзя.
    Ответ написан
    Комментировать