Страницы

Поиск по вопросам

воскресенье, 1 декабря 2019 г.

Как выбираются ресурсы для разных размеров экранов?

#android #android_layout


Имеется приложение, которое написано под определенный экран. Поставлена задача сделать
так, чтобы приложение корректно отображалось на всех экранах.
Читала мануал на developer.android.com, поместила в drawable папки с разной плотностью,
напихала туда 9patch картинок - хорошо, фон растягивается, картинки более менее адекватны.
Wrap_content используется, кое где жестко прописаны отступы, но они в dp - это тоже
неплохо.
Проблема на небольших экранах в том, что контента как будто слишком много и он накладывается
друг на друга, и текстовые поля не помещаются.
Для примера разметка одной активити














    



    

    
    
        
    






У меня возникает мысль, что надо переписать конкретную разметку под экраны. Читала,
что надо плодить папки layout-small, layout-midium, layout-large, и в них создавать
хмл. Правильная ли это мысль? Или можно как то по другому решить проблему?
    


Ответы

Ответ 1



Так как существует огромное количество Android-устройств с самыми разными параметрами конфигурации экрана - физический размер, плотность пикселей, ориентация (альбомная или портретная и тд.), то требуется какое-то решение, позволяющее программисту наиболее просто учесть все это многообразие, чтобы на всех типах устройств вашим приложением было комфортно пользоваться. В Android для решения этой проблемы используется система квалификаторов ресурсов. Программист указывает в коде одно определенное имя ресурса, а система, с помощью квалификаторов, подбирает наиболее подходящий для конкретной конфигурации текущего устройства ресурс, например, разметку экрана. Система квалификаторов действует следующим образом - есть список заранее определенных квалификаторов, определяющих определенные параметры экрана, такие, как размер, плотность, ориентация и тд. Задача программиста, создать дополнительные папки ресурсов с постфиксами квалификаторов, для которых необходимо иное, чем по умолчанию (папка без каких-либо квалификаторов - будет использоваться, если никакое специфичное расположение не подходит под текущюю конфигурацию), расположение элементов, отступы и прочее, что позволит отобразить в данной конфигурации экран наиболее корректно. Имя файла ресурса указывается такое же, как и для состояния по умолчанию, чтобы система понимала, что требуется тот же самый файл, но для определенных параметров. В одной папке может быть указано более одного квалификатора, для указания нескольких специфичных параметров одновременно. Например: /res/layout/main_screen.xml - разметка экрана по умолчанию, для всех не указанных специально конфигураций. /res/layout-small/main_screen.xml - разметка для экранов с маленьким физическим размером. /res/layout-large-land/main_screen.xml - разметка для экранов с большим физическим размером и в альбомной ориентации. Как можно заметить, имя файла ресурса одно и то же, оно же указывается и в коде для определенно экрана, без каких-либо дополнительных указаний о параметрах конфигурации устройства. Система сама определит, на основе текущей конфигурации, где запущенно приложение и указанных квалификаторов, какой из множества разметок с таким именем подходит для данного устройства. При этом разметки конкретных конфигураций могут значительно отличаться от дефолтной, размерами элементов, компоновкой, отступами и тд., чтобы именно в текущей конфигурации все выглядело удобным для использования - единственное условие, все виджеты (элементы разметки), к которым обращаются из кода, должны присутствовать на этой разметке, иначе приложение попросту "упадет" не найдя нужного элемента. Так же, для файлов разметки принято указывать квалификаторы физических размеров (-small, -large, -sw<> и тп.). Для графических файлов (картинок) - плотности (-hdpi, -mdpi и тп.) Выбор конкретного квалификатора осуществляется иногда по довольно запутанной схеме. Общее правило такое, что производится сканирование по иерархии, указанной в таблице - сверху - вниз, до первого совпадения, наиболее приближенного к текущей конфигурации устройства. Если ничего не найдено - используется ресурс по умолчанию (без квалификаторов). Конкретное действие каждого квалификатора, какую часть конфигураций он "контролирует", указано в таблице. Наиболее полно данный материал изложен в официальной документации Android

Ответ 2



Да, если много компонентов - то для маленьких экранов придется сделать отдельную разметку, перенести xml файл с тем же именем в папку layout-small. либо как вариант оберните ваш LinearLayout в SwipeLayout, чтобы он скроллился

Комментариев нет:

Отправить комментарий