2015-08-20 6 views
1

У меня есть огромный файл макета с именем visit_registration.xml. Чтобы поддерживать разные размеры экрана, я продублировал файл и создал файлы layout-sw600dp/visit_registration.xml и layout-sw720dp/visit_registration.xml.Android - Избегайте дублирования макета

Существует одна небольшая разница между раскладок:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:paddingLeft="@dimen/app_margin" 
    android:paddingRight="@dimen/app_margin"> 

    <TextView 
     android:id="@+id/visitRegistrationTextView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/visit_registration" /> 

    <!-- TONS of UI elements here! --> 
</LinearLayout> 

Исходный файл макета (выше) показывает TextView с идентификатором «visitRegistrationTextView».

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:paddingLeft="@dimen/app_margin" 
    android:paddingRight="@dimen/app_margin"> 

    <TextView 
     android:id="@+id/visitRegistrationTextView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:visibility="gone" 
     android:text="@string/visit_registration" /> 

    <!-- TONS of UI elements here! --> 
</LinearLayout> 

В каждой копии используется другая видимость. В приведенном выше примере используется «ушел». Иногда изменения разные, но небольшие, как элемент пользовательского интерфейса, перемещаются в другое место в макете. Остальная часть кода остается прежней.

Главный вопрос о дублировании макета. Я не хочу поддерживать три разных макета из-за классических проблем с дублированием, таких как «Что произойдет, если мне нужно изменить общий элемент пользовательского интерфейса, присутствующий в трех файлах, и забудьте изменить его в одном месте?»

Возможно ли иметь единую «базовую компоновку» с общими элементами пользовательского интерфейса и включать в нее небольшие изменения макета соответственно с текущим размером экрана?

ответ

2

Попробуйте создать файл ресурсов, например. values-sw600dp/strings.xml, values-sw720dp/strings.xml с

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string name="visibility">gone</string> 
</resources> 

или

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string name="visibility">visible</string> 
</resources> 

и файл макета (только один):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:paddingLeft="@dimen/app_margin" 
    android:paddingRight="@dimen/app_margin"> 

    <TextView 
     android:id="@+id/visitRegistrationTextView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:visibility="@string/visibility" 
     android:text="@string/visit_registration" /> 

    <!-- TONS of UI elements here! --> 
</LinearLayout> 
0

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

Назовем его text_layout, по одному на каждый размер экрана.

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

    <TextView 
     android:id="@+id/visitRegistrationTextView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:visibility="gone" 
     android:text="@string/visit_registration" /> 
</LinearLayout> 

Затем вы создаете основной макет, один для всех размеров экрана.

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:paddingLeft="@dimen/app_margin" 
    android:paddingRight="@dimen/app_margin"> 

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

    <!-- TONS of UI elements here! --> 

</LinearLayout> 

Все, меньше дублирования, больше обслуживания.

+0

С вашим предложением, нужно ли создать файл для каждого изменения и включить его в основной макет? –

+0

Да, это точно. Где-то вы должны определить разницу для различных конфигураций. – Stefano

+0

Но могу ли я определить различия в одном файле? –