Форматирование разметки в AndroidStudio 3.5
Обновил AndroidStudio до версии 3.5 и столкнулся с такой проблемой, при форматировании текста в разметке (Ctrl+Alt+L), IDE перемещает layout, в ранних версиях таких проблем не наблюдалось. Можно отключить данную функцию, сняв галку: Rerrange Code. Но тогда IDE перестаёт форматировать текст внутри View. Может кто знает как отключить перемещение полей при форматировании кода? UPD: По прозьбе коллег на данном ресурсе, уточнение: у нас есть разметка, например корневым будет ConstraintLayout , Кладём в него несколько вьюшек, Layout-ов и что я заметил любит особенно путешевствовать include . Include кладём гдето в начале файла, ничего не выделяем, дальше жмакаем Ctrl+Alt+L , если ничего не заметили нажимаем Ctrl+Alt+Shift+L и в диалоговом окне проверяем включён ли Rerrange Code , включаем, повторяем предыдущее действие. Итог, елементы принимаю определённый порядок, что нарушает их отображение задуманное разработчиком. Отлично можно наблюдать если у вас есть такой файл отформатированный в прошлой версии AS и закомичен. Если бы не VCS я бы не сразу понял что произошло.
- android-studio
- intellij-idea
Отслеживать
5,084 1 1 золотой знак 5 5 серебряных знаков 24 24 бронзовых знака
задан 17 сен 2019 в 13:20
1,197 9 9 серебряных знаков 19 19 бронзовых знаков
у меня такая же проблема, единственное решение проблемы — ждать патч)) а пока терпеть и не причесывать код этой комбинацией
17 сен 2019 в 18:23
@AndrewGoroshko, то есть вы тоже считаете что это бага, а не фича? Подумываю обновиться до Canary версии
17 сен 2019 в 18:48
@Valeriy а можно носом ткнуть, а то я не понял что именно не так форматируется ?
17 сен 2019 в 20:22
@keekkenen, обновил
18 сен 2019 в 6:09
я думаю что это на текущий момент баг в фиче)) раньше до обновления ведь все работало как нужно? у меня во всяком случае все работало корректно)
18 сен 2019 в 6:09
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Тоже столкнулся с такой проблемой. В настройка -> Code Styles -> XML в шаблонах помимо Default появился Default copy, выбрав который проблему решил. Доступные для настройки в графическом интерфейсе настройки у них особо не отличаются, но если экспортировать файлы отличаются капитально. Не дошли пока руки разобраться что к чему. Посмотрите, если ли у вас такой стиль, ибо не уверен появился он сам или я его создал. Еще рекомендуют в комментах сделать следующее:
Там же, на вкладке Android (возможно переход на вкладкуне обязателен), справа есть текск синего цвета (Set from. ), жмакаем -> Predefined Style -> Android. Apply.
Вполне верю, что может помочь. Если нет, попробуйте мой конфиг(Это экспорт настроек стиля XML кода. Сохранить как .xml и импортировать на соответствующей вкладке настроек):
true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true true xmlns:android ^$ xmlns:.* ^$ BY_NAME .*:id http://schemas.android.com/apk/res/android .*:name http://schemas.android.com/apk/res/android name ^$ style ^$ .* ^$ BY_NAME .* http://schemas.android.com/apk/res/android ANDROID_ATTRIBUTE_ORDER .* .* BY_NAME
Автоматический Code Improvement при коммите в Android Studio
Работать с гитом в Android Studio, как известно, можно двумя способами.
Первый способ классический — использовать консоль. Плюсом такого подхода являются в первую очередь надежность. GUI может залагать и например, зависнуть на этапе rebase так, что abort/continue/переключение на другую ветку не поможет. Консольные команды вам в помощь, они всегда безотказны.
Второй способ — использовать GUI, предоставляемый Android Studio. Плюсы очевидны — меньший порог входа, более понятно, что вообще можно делать. А также есть различные плюшки от самой студии для удобства работы с гитом. Об одном из них и пойдет речь. Кстати, используя GUI, тоже можно оставлять в покое мышку и использовать hotkey
Используемые Hotkey в статье
Shift+Shift (двойное нажатие shift) — Окно поиска. Позволяет искать как код/ресурсы, так и различные действия и настройки.
Ctrl+Alt+L (⌘+⌥+L) → Форматирование кода
Shift+Ctrl+Alt+L (⇧+⌘+⌥+L) → Форматирование кода → Форматирование кода с параметрами.
вызывает данное окно

О чем вообще речь и где найти?
Неактуальные импорты, пустые строки, пробелы вместо табов — эти вещи бесят, если они попадают в готовый код, предназначенный для pull request. Исправить это легко, используя hotkey Ctrl+Alt+L, однако часто мы забываем это делать.
Idea/AndroidStudio позволяет проводить эти действия автоматически, в последний момент перед коммитом

При использовании commit’а через Android Studio можно увидеть такого вида окно:
Нас интересуют галочки, которые находятся справа от списка файлов, в блоке Before Commit. При активации этих помощников, они будут автоматически применяться при каждом коммите
Чем именно мне помогут эти галочки?
✓ Reformat code
Данное улучшение приводит код в соответствии с вашим code style. Действие полностью аналогично ctrl+shift+alt+L с включенным clean up.
Настроить code style можно здесь Settings → Editor → Code Style
Tab and Indents
Применяет отступы строк в соответствии с code style (Подробно в Code Style, в одноименном разделе)
В примере пробелы, используемые для формирования отступа (отмечены точками), будут замены табами (отмечены стрелкой)
class CleanTab(context: Context)
class CleanTab(context: Context) < ->val date = Date() -> val button = Button(context) -> val textView = TextView(context) -> val ratingBar = RatingBar(context) -> val imageView = ImageView(context) >
Spaces
Форматирует все пробелы в коде в соответствии с code-style.
Будут удалены лишние пробелы в конструкторе Date, добавлены пробелы между объявлением переменной button и =, а также между списком аргументов args в main и
class CleanSpaces(context:Context) < val date = Date( ) val button= Button(context) fun main(arg: Args)< >>class CleanSpaces(context: Context) < val date = Date() val button = Button(context) fun main(arg: Args) < >>Wrapping and Braces
Этот блок управляет переносом строк. Переносятся как сами строки кода, так и закрывающие/открывающие скобки.
Строчка else, а также строчка catch должны располагаться на той же линии, что и закрывающая скобка (так настроено в code style)
Общее количество символов на строке с функцией manyArguments вышло за 80 знаков(настроено в code style), поэтому аргументы будут перенесены на новую строкуclass CleanWrappingAndBraces < fun condition() < if (liveData != null) < > else < > > fun catching() < try < > catch (e: Exception) < > > fun manyArguments(userId: Int, issuerCountryId: String, sendingCountryId: String, receivingCountryId: String) < >>class CleanWrappingAndBraces < fun condition() < if (liveData != null) < > else < > > fun catching() < try < > catch (e: Exception) < > > fun manyArguments(userId: Int, issuerCountryId: String, sendingCountryId: String, receivingCountryId: String)Blank Lines
Регулирует максимальное и минимальное количество пустых строчек в коде. (Подробно в Code Style, в одноименном разделе)
В данном примере удалит лишние строки от последней функции до >, а также 2 лишних пустых строчки между функциями
class CleanBlank < fun foo() < >fun bar() < >>class CleanBlank < fun foo() < >fun bar() < >>Rearrange code
Располагает атрибуты и элементы в том порядке, который соответствует код-стайлу. Работает в XML и HTML файлах. Настроить расположение можно в Setting → Editor → CodeStyle → XML/HTML → Arrangement
Внимание! неправильная настройка может привести к печальным последствиям. Rearrange может влиять на очередность элементов, что может привести к неправильной работе в файлах, чувствительных к расположению. Пример: в LinearLayout, при сортировке по алфавитному порядку, элемент Button может переместится выше TextView, хотя по дизайну такого быть не должно. Выход — настраивать расположение ТОЛЬКО атрибутов
Сортировка
В данном примере xmlns расположились в трех первых строчках и строго по порядку, определенному в code-style(xmlns:android на первой строчке, остальные xmlns: <. >в алфавитном порядке.
Обратите внимание, xmlns:tools и xmlns:app не были удалены даже несмотря на то, что нет случаев их использования. Это говорит о том, что rearrange влияет только на расположение элементовСортировка
В данном примере блок с атрибутами android:padding изменит порядок в соответствии с code-style. Также атрибут style расположится сразу за android:id
Optimize import
Следит за чистотой блока импортов и приводит в правильный вид, а также проверяет на соответствие code style. Само действие полностью аналогично ctrl+shift+alt+L с включенным optimize import.
Удаление неиспользуемых импортов
В данном примере при optimize imports import java.util.* будет удален, так как нет полей или методов, нуждающихся в нем
import android.content.Context import android.widget.Button import java.util.* class RemoveUnused(context: Context)import android.content.Context import android.widget.Button class RemoveUnused(context: Context)Объединение импортов
Если n или более классов импортируются из одного пакета, то такой импорт будет заменен импортом всего пакета.
Если m или более enum или java static импортируется из одного класса, то такой импорт будет заменен на импорт всего классаОба параметра задаются в Settings → Editor → Code Style → Kotlin → Imports
В данном примере множественные импорты из пакета android.widget будут заменены на android.widget.*
import android.content.Context import android.widget.Button import android.widget.ImageButton import android.widget.ImageView import android.widget.TextView import android.widget.RatingBar import java.util.* class MergeImport(context: Context) < >import android.content.Context import android.widget.* import java.util.* class MergeImport(context: Context) < >В том случае, если стоит настройка не объединять импорты(m = 0, n=0), объединенные импорты(импорт пакета) будут заменены импортом каждого класса/функции/поля отдельно.
В случае ниже import android.widget. и import java.util. будут упраздненыimport android.content.Context import android.widget.* import java.util.* class MergeImport(context: Context)import android.content.Context import android.widget.Button import android.widget.ImageButton import android.widget.ImageView import android.widget.TextView import android.widget.RatingBar import java.util.* class MergeImport(context: Context) < >Расположение по алфавиту
После применения, все импорты отсортируются, и будут удобно располагаться в алфавитном порядке
import android.content.Context import android.widget.Button import android.widget.ImageView import android.widget.TextView import java.util.* import android.widget.RatingBar class SortImport(context: Context) < >import android.content.Context import android.widget.Button import android.widget.ImageView import android.widget.RatingBar import android.widget.TextView import java.util.* class SortImport(context: Context) < >Perform code analysis
Помогает находить проблемные места. Носит информационный характер и никак не меняет код. Самые частые случаи — неиспользуемые параметры, переменные, использование кода, помеченного как Deprecated
Пример кода с множествеными нарушениями
fun TextView.format(message: String)
Перед коммитом студия подскажет, что есть проблемы с кодом и предложит их посмотреть внимательнее:
При нажатии на Review покажется список найденных предупреждений:
Check TODO
Очень полезная галочка, помогает не забыть о новых TODO, которые были поставлены именно в этом коммите. Более того, студия позволяет отслеживать не только //TODO, но и //FIXME, а также любые собственные todo, которые были добавлены через Setting → Editor → TODO.
Также можно фильтровать список todo, которые студия будет проверять.
Так выглядит подсказка студии, что был добавлен todo. При нажатии на review он покажет список всех новых todo и предложит их пересмотреть
Clean up
Очень помогает держать код в чистоте. Удаляет избыточный код (см. примеры), заменяет deprecated функции. Действие полностью аналогично Actions → Code cleanup. Достаточно интересная функция, но вместе с этим может быть и опасной.
Из замеченных особенностей можно выделить две основные:
- замена deprecated методов (подробнее ниже)
- непонятную замену вызова методов view в презентере в одном из личных случаев
! Обязательно пересматривайте получившийся коммит, если используете данную функцию!
Redutant code
После применения удалятся элвис-операторы, т.к. были применены к non-nullable переменным
data class User(val firstName: String, val secondName: String) val user = User("Василий", "Пупкин") fun getUserFullName(): Stringdata class User(val firstName: String, val secondName: String) val user = User("Василий", "Пупкин") fun getUserFullName(): StringПосле применения удалится оператор public, т.к. конкретно в этом случае лишний
data class User(val firstName: String, val secondName: String) val user = User("Василий", "Пупкин") public fun getUserFullName(): Stringdata class User(val firstName: String, val secondName: String) val user = User("Василий", "Пупкин") fun getUserFullName(): StringПосле применения удалится вызов конструктора
class ExecutionClass(val exec: () -> Unit) val exec = ExecutionClass()class ExecutionClass(val exec: () -> Unit) val exec = ExecutionClassDeprecated код
Если в аннотации deprecated указан ReplaceWith(), то при cleanup старые методы и классы будут заменены в соответствии с этой пометкой. Надо быть очень внимательным с применением этой возможности, так как работает все очень банально — название старого метода меняется ровно на то, что было указано в ReplaceWith(). Анализатор не проверят даже существует ли такой код. Поэтому неправильно указание нового класса/метода может привести к невозможности компиляции кода. И даже если такая функция/класс существует, даже если у нее одинаковая сигнатура(что анализатор также НЕ проверяет), то это может привести к другой проблеме, необходимо было не просто заменить одну функцию на другую, но и изменить сценарий использования. Код в таком случае скомпилируется, но не будет правильно работать
Заменит старый метод и класс на новые
@Deprecated("Будет удален", ReplaceWith("newMethod()")) fun oldMethod() = Unit fun newMethod() = Unit @Deprecated("Будет удален", ReplaceWith("NewClass")) class OldClass class NewClass class GetDeprecatedCodeUseCase(val clazz: OldClass) < init < val initData = oldMethod() >>@Deprecated("Будет удален", ReplaceWith("newMethod()")) fun oldMethod() = Unit fun newMethod() = Unit @Deprecated("Будет удален", ReplaceWith("NewClass")) class OldClass class NewClass class GetDeprecatedCodeUseCase(val clazz: NewClass) < init < val initData = newMethod() >>Выводы и рекомендация
Помощники, предоставленные Android Studio могут здорово облегчить жизнь вам и вашим коллегам. Да, все действия можно провести и вручную перед отправкой на коммит, но все же не имея привычки так делать, легко пропустить неправильной код дальше. Правильное использование может освободить вас от мыслей о том, что надо следить за каждой запятой и каждым пробелом.
Из приведенных выше примеров можно понять несколько моментов:
Optimize import и Reformat code можно использовать безбоязненно. Они влияют только на форматирование и явные огрехи.
Rearrange и Clean up необходимо использовать аккуратно. Да, они в целом могут хорошо помочь и выловить уже что-то посерьезнее, но при неправильной настройке (Rearrange) или неоднозначном коде (Clean up) помощники могут сильно ошибиться
Check TODO и Perform code analysis также можно использовать безбоязненно. Они никаким образом не влияют на код, только дают назойливые подсказки. Да, если у вас в проекте все полностью построено на TODO и Deprecated коде, то отбоя от них не будет, и они больше будут мозолить глаза. Но если у вас в проекте достаточно чистый код и такие моменты стараетесь минимизировать, то помощники будут давать отличный шанс пересмотреть код, где вы могли допустить упущение.
Горячие клавиши (hotkeys) в Android Studio
Примечание: Здесь перечислены основные клавиатурные комбинации Android Studio для раскладки клавиатуры по умолчанию. Чтобы изменить раскладку по умолчанию на Windows и Linux, перейдите в File > Settings > Keymap. Если вы используете Mac OS X, обновите вашу раскладку используя раскладку версии Mac OS X 10.5+ в Android Studio > Preferences > Keymap.
Таблица 1. Комбинации клавиш для программирования
Действие Комбинация клавиш Android Studio Завершение основного кода (имя любого класса, метода или переменной) CTRL + Space Умное завершение кода (фильтрует список методов и переменных по ожидаемому типу) CTRL + SHIFT + Space Оптимизация импорта CTRL + ALT + O Команда поиска (Автозаполнение имени команды) CTRL + SHIFT + A Быстрое исправление проекта (подсказки по ошибкам) ALT + ENTER Форматирование кода CTRL + ALT + L (Win)
OPTION + CMD + L (Mac)Показать документацию для выбранных API CTRL + Q (Win)
F1 (Mac)Показать параметры для выбранного метода CTRL + P Создать метод ALT + Insert (Win)
CMD + N (Mac)Перейти к источнику F4 (Win)
CMD + down-arrow (Mac)Удалить строку CTRL + Y (Win)
CMD + Backspace (Mac)Поиск по символу CTRL + ALT + SHIFT + N (Win)
OPTION + CMD + O (Mac)Таблица 2. Комбинации клавиш редактора проекта
Action Android Studio Key Command Построение проекта CTRL + F9 (Win)
CMD + F9 (Mac)Построение и запуск проекта SHIFT + F10 (Win)
CTRL + R (Mac)Переключение видимости окна проекта ALT + 1 (Win)
CMD + 1 (Mac)Переход между открытыми вкладками ALT + left-arrow; ALT + right-arrow (Win)
CTRL + left-arrow; CTRL + right-arrow (Mac)
Источник. Полный перечень горячих клавиш Android Studio для Windows, Linux и MacOS в документации IntelliJ IDEA.
Горячие клавиши Intellij IDEA
Как известно, чем лучше IDE, тем приятней в ней работать. Так вот Intellij IDEA предоставляет довольно большой список необходимы горячих клавиш, и сейчас я вас с ними познакомлю.
Список горячих клавиш можно найти на официальном сайте на английском.
1. Редактирование
Ctrl + Space Список компонентов (класса, метода, переменной) Ctrl + Shift + Space Smart code – фильтрует список из методов и переменных ожидаемого типа Ctrl + Alt + Space Название любого класса проекта независимо от импортируемых Ctrl + Shift + Enter Завершение оператора Ctrl + P Сведения о параметрах (в пределах аргументов вызоваемого метода) Ctrl + Q Быстрый поиск документации Shift + F1 Внешняя документация Ctrl + наведение мышью на фрагмент кода Краткая информация Ctrl + F1 Показать описания ошибки или предупреждения в каретку Alt + Insert Генерация кода (Getters, Setters, Constructors, hashCode/equals, toString) Ctrl + O Переопределение метода Ctrl + I Реализация методов Ctrl + Alt + T Поместить фрагмент кода в (if..else, try..catch, for, synchronized, etc.) Ctrl + / Однострочное комментирование / раскомментирование Ctrl + Shift + / Многострочное комментирование / раскомментирование Ctrl + W Выбирает последовательность возрастающих блоков кода Alt + Q Контекстная информация Alt + Enter Показать предлагаемое исправление Ctrl + Alt + L Форматирование кода Ctrl + Alt + O Удалить неиспользуемые импорты Ctrl + Alt + I Авто-отступ линии Tab / Shift + Tab Отступ / удаление отступа выбранному фрагменту кода Ctrl + X or Shift + Delete Вырезать фрагмент кода Ctrl + C or Ctrl + Insert Копировать фрагмент кода Ctrl + V or Shift + Insert Вставить фрагмент кода из буфера обмена Ctrl + Shift + V Вставить последний фрагмент кода из буфера обмена Ctrl + D Дублирование строки Ctrl + Y Удаление строки Ctrl + Shift + J Объединение строк Ctrl + Enter Разделение строки Shift + Enter Начать с новой строки Ctrl + Shift + U Переключить стоящее слово рядом с кареткой в нижний / верхний регистр Ctrl + Shift + ] / [ Выделить код до конца / начала блока Ctrl + Delete Удалить слово после каретки Ctrl + Backspace Удалить слово перед каретки Ctrl + NumPad+/- Развернуть / свернуть блок кода Ctrl + Shift + NumPad+ Развернуть все Ctrl + Shift + NumPad- Свернуть все Ctrl + F4 Закрыть активное окно редактора 2. Поиск / замена
Ctrl + F Поиск F3 Искать дальше Shift + F3 Искать назад Ctrl + R Замена Ctrl + Shift + F Искать по проекту Ctrl + Shift + R Заменить по проекту Ctrl + Shift + S Поиск по шаблону Ctrl + Shift + M Замена по шаблону 3. Поиск Использования кода
Alt + F7 / Ctrl + F7 Найти использования / Найти использования в файле Ctrl + Shift + F7 Выделить используемое в файле Ctrl + Alt + F7 Показать использования 4. Компиляция и выполнение
Ctrl + F9 Структурирование проекта и сборка измененных файлов Ctrl + Shift + F9 Компиляция выбранного файла пакета или модуля Alt + Shift + F10 Выбрать конфигурацию и запустить Alt + Shift + F9 Выбрать конфигурацию и запустить в debug режиме Shift + F10 Запустить Shift + F9 Запустить в debug режиме Ctrl + Shift + F10 Выполнить в контексте конфигурации из редактора 5. Отладка
F8 Шаг обхода F7 Шаг Shift + F7 Умный шаг Shift + F8 Выйти Alt + F9 Запуск до курсора Alt + F8 Вычисление выражения F9 Резюме программы Ctrl + F8 Переключить точку останова Ctrl + Shift + F8 Показать точки останова 6. Навигация
Ctrl + N Перейти к классу Ctrl + Shift + N Перейти к файлу Ctrl + Alt + Shift + N Перейти к символу Alt + Right/Left Переход к следующей / предыдущей вкладки редактора F12 Вернуться к предыдущему окну инструмента Esc Перейти к редактору (от окна инструментов) Shift + Esc Скрыть активное или последнее активное окно Ctrl + Shift + F4 Закрыть активное run/messages/find/… окно Ctrl + G Перейти к номеру строки Ctrl + E Последние файлы Ctrl + Alt + Left/Right Перейдите назад / вперед Ctrl + Shift + Backspace Перейдите в последнее местоположение Редактора Alt + F1 Выберите текущий файл или символ в любом режиме Ctrl + B or Ctrl + Click Перейти к объявлению Ctrl + Alt + B Перейти к реализации Ctrl + Shift + I Открыть быстрый поиск по определению Ctrl + Shift + B Перейти к объявления типа Ctrl + U Перейти к супер методу или классу Alt + Up/Down Переход к предыдущему / следующему методу Ctrl + ] / [ Перейти в конец / начало блока Ctrl + F12 Файловая структура Ctrl + H Иерархии Типа Ctrl + Shift + H Иерархия метода Ctrl + Alt + H Иерархии вызовов F2 / Shift + F2 Следующий / предыдущий выделенные ошибки F4 / Ctrl + Enter Редактировать исходник / Просмотр Alt + Home Показать панель навигации F11 Переключить закладку Ctrl + Shift + F11 Переключить закладку с мнемонические Ctrl + #[0-9] Перейти к номером закладки Shift + F11 Показать закладки 7. Рефакторинг
F5 Копирование F6 Переместить Alt + Delete Безопасное удаление Shift + F6 Переименовать Ctrl + F6 Изменить сигнатуру Ctrl + Alt + N Встроить Ctrl + Alt + M Поместить в метод Ctrl + Alt + V Поместить в переменную Ctrl + Alt + F Поместить в поле Ctrl + Alt + C Поместить в константу Ctrl + Alt + P Поместить в параметр 8. VCS
Ctrl + K Коммит проекта в VCS Ctrl + T Обновить проект из VCS Alt + Shift + C Посмотреть последние изменения Alt + BackQuote (`) Быстрый VCS 9. Интерактивные шаблоны
Ctrl + Alt + J Окружение с живым шаблоном Ctrl + J Вставьте живой шаблон iter Итерация в Java SDK 1.5 стиле inst Проверяет тип объекта с InstanceOf itco Итерация элементов java.util.Collection itit Итерация элементов java.util.Iterator itli Итерация элементов java.util.List psf public static final thr throw new sout System.out.println() 10. Общие
Alt + #[0-9] Откройте соответствующее окно инструмента Ctrl + S Сохранить все Ctrl + Alt + Y Cинхронизировать Ctrl + Alt + F11 Переключение полноэкранного режима Ctrl + Shift + F12 Переключить максимизацию редактору Alt + Shift + F Добавить в избранное Alt + Shift + I Проверьте текущий файл с текущим профилем Ctrl + BackQuote (`) Быстрое переключение текущей схемы Ctrl + Alt + S Открытые окна Параметры Ctrl + Alt + Shift + S Открыть диалоговое Структура проекта Ctrl + Shift + A Найти Действие Ctrl + Tab Переключение между вкладками и окна инструментов



