2012-01-20 4 views
2

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

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

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

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

ответ

6

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

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

чтения this это поможет вам много

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

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

1

Да, вы можете. Это просто! Я делаю это, потому что устаревшие (pre API Level 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); 
} 

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

+0

но какой из них был выбран «R.layout.my_layout_qvga»? один в «макете»? или 'макет-земля'? –

0

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

У меня есть fragment_detail.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 будет соответствующим образом выбирать как обычно.