Могу ли я программно выбрать папку макета Android? - PullRequest
4 голосов
/ 20 января 2012

Я создаю приложение для Android, которое изменяет размеры в зависимости от размера экрана, используя разные папки макетов (например, большие, большие и т. Д.).

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

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

Возможно ли это?

Ответы [ 3 ]

6 голосов
/ 20 января 2012

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

layout-small для устройств с маленькими экранами layout-ldpi для устройств с низкой плотностью layout-en для локалей ...

read this это поможет ваммного

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

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

2 голосов
/ 17 сентября 2013

Да, вы можете.Это просто!Я делаю это потому, что устаревшие (до API уровня 13) системы не поддерживают более новые фильтры папок макета.В частности, мне нужно отличать QVGA (маленькое) от WQVGA (обычное) и других обычных разрешений.

Просто добавьте различные файлы макетов в папки макетов и макетов, например

layout
    my_layout_default.xml
    my_layout_qvga.xml
layout-land
    my_layout_default.xml
    my_layout_qvga.xml

Затем выберите соответствующий макет во время выполнения:

protected void onCreate(Bundle savedInstanceState)
{
    // Some code that uses DisplayMetrics to determine the screen type
    ScreenType st = Util.getScreenType(this);
    super.onCreate(savedInstanceState);
    setContentView(st == ScreenType.ST_QVGA ? R.layout.my_layout_qvga : R.layout.my_layout_default);
    // ...

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

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/my_root_view"
    android:tag="st_port_QVGA"

FrameLayout flRoot = (FrameLayout)findViewById(R.id.my_root_view);
Object objTag = flRoot.getTag();
if (objTag instanceof String)
{
    String strTag = (String)objTag;
    System.out.println("Tag = " + strTag);
}

Кстати, нет причины, по которой вы не можете комбинировать эту технику с обычными квалификаторами ресурсов, например, добавлять файлы, такие как my_layout_default.xml, в другие папки.

1 голос
/ 31 июля 2016

Я столкнулся с довольно похожей ситуацией. Мой фрагмент детализации обычно отображается в полноэкранном режиме, но на планшетах он иногда может занимать только 70% ширины экрана (в потоке мастер-детализации). Когда фрагмент детализации полноэкранный на планшетах, он должен использовать большой макет. Когда фрагмент детали составляет всего 70% ширины, он должен использовать меньшую раскладку телефона. Вот как я справляюсь с этим.

У меня есть фрагмент_детали.xml вот так

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include layout="@layout/fragment_detail_force_phone" />

</LinearLayout>

с fragment_detail_force_phone.xml, содержащим фактический макет для небольшого экрана (или когда он отображается на планшете с шириной всего 70%). Это позволяет избежать дублирования кода.

Большой макет в sw600dp/fragment_detail.xml. Когда я надуваю фрагмент детали, я проверяю getActivity(), чтобы увидеть, загружается ли этот фрагмент в узком пространстве, что означает, что я хочу принудительно настроить макет телефона. Если это так, я раздуваю R.layout.fragment_detail_force_phone. Поскольку нет такой версии для планшета, он всегда загружает код телефона, если я укажу это. В противном случае я раздуваю R.layout.fragment_detail и Android соответственно выберет как обычно.

...