Ответы пользователя по тегу Android
  • Каким образом реализовать красивый вывод неизвестного количества 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
    Нет, нельзя.
    Ответ написан
    Комментировать
  • Как выполнить такую верстку в android xml?

    @YuryBorodkin
    Android dev
    activity_main.xml
    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.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"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        tools:context=".MainActivity"
        tools:showIn="@layout/activity_main">
    
    
        <View
            android:layout_width="match_parent"
            android:layout_height="4dp"
            android:background="@drawable/shadow_4dp"
            app:layout_constraintBottom_toTopOf="@+id/buttons_background"
            />
    
        <View
            android:id="@+id/buttons_background"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:background="#dadada"
            app:layout_constraintBottom_toBottomOf="parent" />
    
    
        <ImageButton
            android:id="@+id/red_ibtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="?selectableItemBackgroundBorderless"
            android:src="@drawable/ic_circle_solid_red_72dp"
            android:translationY="8dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />
    
        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
    
            android:background="?selectableItemBackgroundBorderless"
            android:src="@drawable/ic_android_black_24dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@id/red_ibtn"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="@id/buttons_background" />
    
        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
    
            android:background="?selectableItemBackgroundBorderless"
            android:src="@drawable/ic_android_black_24dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@id/red_ibtn"
            app:layout_constraintTop_toTopOf="@id/buttons_background" />
    </android.support.constraint.ConstraintLayout>

    ic_circle_solid_red_72dp xml
    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="oval" android:visible="true">
        <size
            android:width="72dp"
            android:height="72dp" />
        <solid android:color="#cb253d" />
    
    </shape>

    shadow_4dp xml
    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <size android:width="0dp" android:height="4dp"/>
        <gradient
            android:angle="90"
            android:endColor="#02000000"
            android:startColor="#32000000" />
    
    </shape>
    Ответ написан
    Комментировать
  • Как отрисовать пройденный маршрут в google maps api (android)?

    @YuryBorodkin
    Android dev
    PolylineOptions rectOptions = new PolylineOptions()
    .add(new LatLng(37.35, -122.0))//добавляем точки
    .add(new LatLng(37.45, -122.0))
    .add(new LatLng(37.45, -122.2))
    .add(new LatLng(37.35, -122.2))
    .add(new LatLng(37.35, -122.0));

    Polyline polyline = myMap.addPolyline(rectOptions);
    Ответ написан
    Комментировать
  • Как из класса добавить картинку на экран?

    @YuryBorodkin
    Android dev
    ну для таких целей используются assets.
    Создается папке assets в основной папке приложения (где src,buid, config) - туда кладутся картинки. Их имена и надо хранить в sqlite.
    Потом
    InputStream ims = getAssets().open("my_image.jpg");
       
        Drawable d = Drawable.createFromStream(ims, null);

    и готово.
    Ответ написан
    Комментировать
  • Как отключить реакцию на касание для EditText в Android?

    @YuryBorodkin
    Android dev
    Для таких случаев пригодиться метод onInterceptTouchEvent(MotionEvent) класса viewgroup.
    Создадим класс-наследник вьюгрупп
    public class InterceptableConstraintLayout extends ConstraintLayout {
        private Set<View> mIntercepatbleViews = new HashSet<>();
    
        public InterceptableConstraintLayout(Context context) {
            super(context);
        }
    
        public InterceptableConstraintLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public InterceptableConstraintLayout(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        public void addViewToIntercept(View v) {
            if (v == null) return;
            mIntercepatbleViews.add(v);
        }
    
        public void removeViewFromInterception(View v) {
            if (v == null) return;
            mIntercepatbleViews.remove(v);
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            if (ev.getAction() == MotionEvent.ACTION_DOWN
                    && mIntercepatbleViews.size() > 0
                    && getChildCount() > 0) {
                int x = (int) ev.getX();
                int y = (int) ev.getY();
                Rect hitRect = new Rect();
                for (int i = 0; i < getChildCount(); i++) {
                    View child = getChildAt(i);
                    child.getHitRect(hitRect);
                    if (hitRect.contains(x, y) && mIntercepatbleViews.contains(child)) return true;
                }
                return super.onInterceptTouchEvent(ev);
            } else return super.onInterceptTouchEvent(ev);
        }
    }


    в activity берем нужные вью и передаем их в метод addViewToIntercept(View)
    InterceptableConstraintLayout mLo = findViewById(R.id.fragment_phone_registration_profile_box);
            View mEt = findViewById(R.id.fragment_fio_input_surname_info);
            mLo.addViewToIntercept(mEt);
    
            mLo.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.e("mLo", "clicked");
                }
            });

    В результате клики на нужные вьюхи перехватываются.
    Добиться чего-то похожего через xml - я хз как. android:descendantFocusability="beforeDescendants" и clickable = true тоже не помогут.
    Ответ написан
    Комментировать
  • Стоит ли тщательно исправлять все ошибки(предупреждения) в Android Lint?

    @YuryBorodkin
    Android dev
    Максима: на линтер, встроенный в IDEA нужно обращаться внимание всегда. Он реально советует хорошие вещи.
    но, если твердо знаешь что делаешь и при этом сроки горят, можно проигнорить (увы, жизнь не совершенна).
    При работе в команде лучше деражть список предупреждений чистым, конечно если он бесогонит - сделать supress чего-то, но зато всегда будешь видеть чей-то говнокод при сборке.
    Ответ написан
    1 комментарий
  • Какие анимации смены Activity сейчас тренде?

    @YuryBorodkin
    Android dev
    самые популярные аппы юзают slide-from right slide-to-left и fade in-fade out, все без изысков
    Ответ написан
    2 комментария
  • Как удалить базу Sqlite из приложения, если решил отказаться от её использования?

    @YuryBorodkin
    Android dev
    ну да через shared prefs и делается обычно.
    Ответ написан
    Комментировать