Android disable all view

Программное добавление и удаление виджета

Обычно мы размещаем виджеты через XML. Но можно это делать и программно. Такой подход используется при динамическом размещении, когда неизвестно, сколько элементов должно быть на экране.

Добавляем виджет

Допустим у нас есть простейшая разметка.

Пустая компоновка LinearLayout с идентификатором mainlayout не содержит вложенных виджетов. Через метод addView(view) класса LinearLayout мы можем добавить нужный нам элемент.

Удаляем виджет

Существует и обратный метод для удаления вида — removeView(), а также метод removeAllViews(), удаляющий все дочерние элементы родителя. Рассмотрим следующий пример. Создадим разметку, где компонент LinearLayout с идентификатором master будет родителем для будущих элементов, которые мы будем добавлять или удалять:

activity_main.xml

Создадим пару дополнительных макетов, которые будет дочерними элементами для FrameLayout. Мы будем управлять ими программно.

layer1.xml

layer2.xml

Напишем код, который будет добавлять или удалять компоновки через флажки.

Обратите внимание, что добавление идёт в том порядке, как мы отмечаем флажки. Если мы отметим флажком второй CheckBox, то сначала на экране появится блок с компоновкой layer2.xml, а уже ниже компоновка layer1.xml. На скриншоте представлен этот вариант.

Получить доступ к дочерним элементам можно через методы getChildCount() и getChildAt().

Источник

Темы и стили в Android-приложениях

Каждому Android-разработчику так или иначе приходилось работать со стилями. Кто-то чувствует себя с ними уверенно, у кого-то есть только поверхностные знания, которые зачастую не позволяют самостоятельно решить поставленную задачу.

В преддверии выхода темной темы было решено освежить в памяти всю информацию, касающуюся тем и стилей в Android-приложениях.

О чем пойдет речь:

Начнем с основ

По своей структуре темы и стили имеют общее строение:

Для создания используется тег style . У каждого cтиля есть имя и он хранит в себе параметры key-value .

Все достаточно просто. Но в чем же разница между темой и стилем?

Единственное отличие заключается в том, как мы их используем.

Тема — это набор параметров, которые применяются ко всему приложению, Activity или View-компоненту. Она содержит базовые цвета приложения, стили для отрисовки всех компонентов приложения и различные настройки.

В теме переопределены основные цвета приложения ( colorPrimary , colorSecondary ), стиль для текста ( textAppearanceHeadline1 ) и некоторых стандартных компонентов приложения, а также параметр для прозрачного статус-бара.

Для того чтобы стиль стал настоящей темой, необходимо отнаследоваться (о наследовании мы поговорим чуть позже) от дефолтной реализации темы.

Стиль

Стиль — это набор параметров для стилизации одного View-компонента.

Атрибут

Атрибутом принято называть ключ стиля или темы. Это маленькие кирпичики из которых все строится:

Все эти ключи являются стандартными атрибутами.

Мы можем создавать свои атрибуты:

Атрибут myFavoriteColor будет указывать на цвет или ссылку на ресурс цвета.

В формате мы можем указать вполне стандартные значения:

По своей природе атрибут является интерфейсом. Его необходимо реализовать в теме:

Теперь мы можем на него ссылаться. Общая структура обращения выглядит так:

Ну и, наконец, давайте поменяем, например, цвет текста у поля:

Благодаря атрибутам мы можем добавлять какие-угодно абстракции, которые будут изменяться внутри темы.

Наследование тем и стилей

Как и в ООП, мы можем перенимать функционал существующей реализации. Сделать это можно двумя способами:

При явном наследовании мы указываем родителя с помощью ключевого слова parent :

При неявном наследовании мы используем dot-notation для указания родителя:

Никакой разницы в работе этих подходов нет.

Очень часто мы можем встретить подобные стили:

Может показаться, что стиль создан путем двойного наследования. На самом деле это не так. Множественное наследование запрещено. В таком определении явное наследование всегда выигрывает.

То есть будет создан стиль с именем Widget.MyApp.Snackbar , который является наследником Widget.MaterialComponents.Snackbar .

ThemeOverlay

ThemeOverlay — это специальные «легковесные» темы, которые позволяют переопределить атрибуты основной темы для View-компонента.

За примером далеко ходить не будем, а возьмем кейс из нашего приложения. Дизайнеры решили, что нам нужно сделать стандартное поле для ввода логина, которое будет иметь отличный от основного стиля цвет.

Читайте также:  Java для android отличия

С основной темой поле ввода выглядит так:

Выглядит отлично, но дизайнеры настаивают на том, чтобы поле было в коричневом стиле.

Окей, как мы можем решить такую задачу?

Да, мы можем переопределить стиль и вручную поменять основные цвета вьюшки, но для этого нужно будет писать много кода, да и есть шанс, что мы про что-нибудь забудем.

Написать свою вьюшку по гайдлайнам и с кастомными параметрами?

Хороший вариант, так мы сможем удовлетворить любые хотелки дизайнеров и заодно прокачать скилл, но все это трудозатратно и может привести к нежелательным багам.

Переопределить основной цвет в теме?

Мы выяснили, что для нужного нам вида достаточно поменять colorPrimary в теме. Рабочий вариант, но так мы затронем внешний вид остальных компонентов, а нам это не нужно.

Правильное решение — это использовать ThemeOverlay.

Создаем ThemeOverlay и переопределяем основной цвет темы:

Далее указываем его с помощью специального тега android:theme в наш TextInputLayout :

Все работает так, как нам и нужно.

Конечно же возникает вопрос — как это работает под капотом?

Эту магию позволяет провернуть ContextThemeWrapper . При создании View в LayoutInflater будет создан контекст, где за основу будет взята текущая тема и в ней будут переопределены параметры, которые мы указали в нашей Overlay теме.

Аналогичным образом мы можем самостоятельно переопределить любой параметр темы в приложении.

Последовательность применения тем и стилей ко View-компоненту

Главный приоритет имеет файл разметки. Если в нем определен параметр, то далее все аналогичные параметры будут игнорироваться.

Следующий приоритет имеет стиль View:

Далее используются предопределенные стили для компонента:

Если параметры не были найдены, то используются атрибуты темы:

В общем-то это все, что нужно знать для того чтобы начать работу с темами. Теперь кратко посмотрим на обновленную дизайн-библиотеку Material Components.

Да прибудет с нами Material Components

Material Сomponents была представлена на Google I/O 2018 и является заменой Design Support Library.

Библиотека дает нам возможность использовать обновленные компоненты из Material Design 2.0. Кроме того, в ней появилось множество интересных настроек по кастомизации. Все это позволяет писать яркие и уникальные приложения.

Вот некоторые примеры приложений в новом стиле: Owl, Reply, Crane.

Перейдем к практике

Для создания темы нужно отнаследоваться от базовой темы:

Все они очень похожи на AppCompat темы, но имеют дополнительные атрибуты и настройки.

Подробнее с новыми атрибутами можно познакомиться на material.io.

Если по каким-то причинам вы сейчас не можете переключиться на новую тему, то вам подойдут Bridge темы. Они наследуются от AppCompat тем и имеют все новые атрибуты Material Components. Нужно всего лишь добавить постфикс Bridge и использовать все возможности без опасений:

А вот и наша тема:

Важно понимать, что когда вы переопределяете стиль в теме, он применится ко всем View этого типа в приложении (Activity).

Если же вы хотите применить стиль только к одной конкретной View, то нужно использовать тег style в файле с разметкой:

Одно из нововведений, которое меня действительно впечатлило — это ShapeAppearance. Оно позволяет изменять форму компонентов прямо в теме!

Каждый View-компонент относится к определенной группе:

shapeAppearanceSmallComponent

shapeAppearanceMediumComponent

shapeAppearanceLargeComponent

Как мы можем понять из названия, в группах вьюшки разных размеров.

Проверим на практике:

Мы создали Widget.MyApp.SmallShapeAppearance для «маленьких» компонентов. Закруглили верхний левый угол на 20dp и правый нижний угол срезали на 15dp .

Получили такой результат:

Выглядит интересно. Будет ли это работать в реальной жизни? Время покажет.

Как и для стилей, мы можем применить ShapeAppearance только для одного View-компонента.

Что там по темной теме?

Совсем скоро состоится релиз Android Q, а вместе с ним к нам придет и официальная темная тема.

Пожалуй, одна из самых интересных и эффектных возможностей новой версии Android — это автоматическое применение темной темы для всего приложения одной строчкой кода.

Звучит здорово, давайте пробовать. Предлагаю взять всеми любимый гитлаб клиент от terrakok.

Разрешаем перекрашивать приложение (по умолчанию запрещено):

Атрибут android:forceDarkAllowed доступен с API 29 (Android Q).

Запускаем, смотрим что получилось:

Согласитесь, что для одной строчки кода выглядит очень круто.

Конечно, есть проблемы — BottomNavigationBar сливается с фоном, лоадер остался белым, выделение кода страдает и, вроде бы, все, по крайне мере мне больше ничего серьезного в глаза не бросилось.

Читайте также:  Напоминалка для андроида для всего

Уверен, что потратив не так много времени, можно решить основные проблемы. Например, отключив автоматический темный режим для отдельных вьюшек (да, так тоже можно — android:forceDarkAllowed доступен для View в файле-разметке).

Следует помнить, что данный режим доступен только для светлых тем, если вы используете темную, то принудительная темная тема работать не будет.

Рекомендации по работе можно почитать в документации и на material.io.

А если мы хотим все делать самостоятельно?

Как бы не было просто использовать принудительную темную тему, этот режим лишен гибкости. Фактически, все работает по заранее определенным правилам, которые могут не устраивать нас и, что более важно, заказчика. Думаю, что такое решение можно рассматривать как временное, до тех пор пока мы не сделаем свою реализацию темной темы.

В API 8 (Froyo) был добавлен квалификатор -night , который и по сей день используется для применения темной темы. Он позволяет автоматически применять нужную тему в зависимости от времени суток.

В темах DayNight уже используется такая реализация, нам достаточно отнаследоваться от них.

Давайте попробуем написать свою:

Нам теперь на каждую версию API делать тему со всеми параметрами? Нет, конечно! Мы сделаем базовую тему, где будут определены базовые атрибуты, доступные для всех версий API и отнаследуемся от нее в нужной версии API:

9. Тема, стиль или… ?

При созданий собственных тем и стилей будет здорово, если вы укажите префикс, говорящий о том что это за стиль и для чего он определен. Такое именование позволит очень просто структурировать и расширять стили.

10. Использовать TextAppearance

Хорошим тоном будет расширить основные стили для текста и везде их использовать.

Много полезной информации можно найти на сайте Material Design: Typography, Typography Theming.

Заключение

В заключение хочется сказать, что стилизация приложения — это обязанность не только разработчиков, но и дизайнеров. Только благодаря тесному взаимодействию мы сможем получить по-настоящему хороший и красивый продукт. Дизайнеры должны иметь представления о платформе и возможностях Material Components. Ведь именно на их плечи ложится ответственность по поддержке визуальной составляющей приложения. Дизайнерам доступен специальный плагин для Sketch — Material Theme Editor. В нем очень просто выбирать цвета для приложения и строить экраны на основе стандартных компонентов. Если ваши дизайнеры еще не знают о нем, то обязательно расскажите им.

Начать изучать Material Components можно с репозитория на GitHub — Modular and customizable Material Design UI components for Android. В нем собрано очень много информации по стандартным стилям и их возможностям. Кроме того, там есть приложение — sample, чтобы все сразу попробовать на практике.

Источник

How to disable any pre-installed system app bloatware on Android without root

What we define as “bloatware” is subject to personal preference, but I think we can all agree that some manufacturers and carriers are more guilty of including it on their smartphones than others. Bloatware can, depending on your point of view, range from being a pre-installed app like Facebook to the stock, non-Google Photos gallery app. One person’s hated bloatware is another person’s beloved feature, but unfortunately for the person who classifies certain pre-installed apps as bloatware, they typically can’t uninstall it. Sometimes you can disable system apps, but not every system app will let you disable it.

There are ways around these limitations, though. We wrote a guide a while back that taught you how to “uninstall” any pre-installed system app on your Android smartphone or tablet. The problem with that method is twofold: it doesn’t actually fully uninstall the app and return space to the user and reverting the change requires you to either sideload the APK (if you can find it) or factory reset. Still, that method is quite useful and we’ve seen dozens of forum posts and user scripts taking advantage of it to debloat their new Android devices. To help users debloat their devices in a safer way, we would like to turn your attention towards another method that will not only disable the pre-installed bloatware of your choosing but also make it super easy to re-enable them at your convenience, making any mistake a lot easier to recover from. We’ll still be using ADB commands to mess with system applications so be sure you don’t disable anything absolutely critical (use your best judgment), but this method is a lot friendlier in case you disable the wrong app.

Читайте также:  Андроид для создания афиш

Disable Any Pre-Installed System App On Android Without Root

  1. Follow this tutorial to get ADB up and running on your Windows, Mac, or Linux PC. ADB, or Android Debug Bridge, is a developer tool that lets you issue some powerful commands to control your device. We use it a lot in our tutorials to do things that you otherwise can’t do without a rooted device.
  2. Download an app like App Inspector from the Google Play Store.
  3. Get the package name of the app you want to disable using App Inspector. Here are screenshots showing you how:

Opening command window on Windows 10

Windows PowerShell: .\adb shell pm disable-user —user 0

Mac/Linux Terminal: ./adb shell pm disable-user —user 0

  • For example, here’s what it looks like if you wanted to remove Cleanmaster (com.miui.cleanmaster) which comes preinstalled as part of MIUI on the Xiaomi Mi Mix 2S:
    Windows Command Prompt: adb shell pm disable-user —user 0 com.miui.cleanmaster
    Windows PowerShell: .\adb shell pm disable-user —user 0 com.miui.cleanmaster
    Mac/Linux Terminal: ./adb shell pm disable-user —user 0 com.miui.cleanmaster
  • And we’re done! The app should immediately become disabled and will disappear from your launcher. Do note that on rare occasions, some apps may automatically be re-enabled if the system has a function to re-enable it. For example, disabling the stock EMUI 9 launcher on Chinese Huawei or Honor devices will result in the stock launcher become automatically re-enabled after some time. If that bothers you, try the “uninstall” method.

    Re-enable Any Disabled Pre-installed System App

    What if you disabled an app and want it back? It’s very easy to re-enable the app! First, go to Settings > AppsВ and look at the “All apps” list (it may be located somewhere different on your device.) Usually, you can filter here to see the names of all disabled apps. Once you know what app you want to re-enable, follow these steps:

    1. Open a command prompt or terminal window and run the following command:
      Windows Command Prompt: adb shell pm list packages -d
      Windows PowerShell: .\adb shell pm list packages -d
      Mac/Linux Terminal: ./adb shell pm list packages -d
    2. This command lists all disabled packages. Find the package name that corresponds to the app you want to re-enable. Now, just run the following command to re-enable one of them:
      Windows Command Prompt: adb shell pm enable

    Windows PowerShell: .\adb shell pm enable

    Mac/Linux Terminal: ./adb shell pm enable

  • If you have any issues, try rebooting after re-enabling the app.
  • What did we do?

    First of all, it’s important to differentiate what this command does and why it’s superior to the method that we used in our previousВ bloatware removal tutorial. In that tutorial, we uninstalled an application at a user level, which means it was still installed on the device in the system partition but not for the primary user (user 0). This is why to get it back you either needed to factory reset or sideload the APK. In this tutorial, we areВ disabling the app for the primary user rather than uninstalling it, which means that we can enable it without re-installing it again.

    The pm disable-user command has been around for years, but it’s been overlooked in favor of pm disable. You would think that both pm disable-user and pm disable –user 0 would be identical, but you would be wrong. For some reason, the disable-user command lets you disable basically any application you want while the regular disable command is quite limited.

    The best part about this method is that if you mess up and disable an application that you shouldn’t, it’s a really easy fix. You’ll also still receive OTA updates as you aren’t actually modifying any system files. That’s why we need the “–user 0” part of our command, which specifies that the app will only be disabled for the current user, not all users, which would require root access.

    Источник

    Оцените статью