Во время написания оболочки программы стало очевидно, что очень многие элементы описания повторяются, и зачастую, я создаю абсолютно одинаковые элементы многократно повторяя их стиль. Стало интересно, можно ли создать отдельный файл со стилями для оболочки, как используются CSS для стилизации HTML страниц. Как оказалось - можно, и даже нужно. Подробнее об этом можно почитать здесь и здесь.
Вот файл оболочки программы - main.xml:
Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="@drawable/bg">
<LinearLayout style="@style/main_LL_rows">
<TextView
style="@style/labels"
android:text="@string/ID"/>
<EditText
style="@style/EditText_Number"
android:layout_width="60dp"
android:id="@+id/etID"/>
<Button style="@style/btn_120dp"
android:text="@string/Edit"
android:id="@+id/btnEdit"/>
<Button style="@style/btn_120dp"
android:text="@string/Delete"
android:id="@+id/btnDelete"/>
</LinearLayout>
<LinearLayout style="@style/main_LL_rows">
<TextView
style="@style/labels"
android:text="@string/Name"/>
<EditText
style="@style/EditText_Text"
android:layout_width="match_parent"
android:id="@+id/etName"/>
</LinearLayout>
<LinearLayout style="@style/main_LL_rows">
<TextView
style="@style/labels"
android:text="@string/Age"/>
<EditText
style="@style/EditText_Number"
android:layout_width="60dp"
android:id="@+id/etAge"/>
</LinearLayout>
<LinearLayout style="@style/main_LL_rows">
<TextView
style="@style/labels"
android:text="@string/Sex"/>
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:id="@+id/rgSex">
<RadioButton style="@style/Text"
android:text="@string/Male"
android:id="@+id/rbMale"
android:checked="true"
android:layout_marginLeft="15dp"/>
<RadioButton style="@style/Text"
android:text="@string/Female"
android:id="@+id/rbFemale"
android:layout_marginLeft="15dp"/>
</RadioGroup>
</LinearLayout>
<LinearLayout style="@style/main_LL_rows">
<Button style="@style/Button"
android:text="@string/Add"
android:id="@+id/btnAdd"
android:layout_weight="1"/>
<Button style="@style/Button"
android:text="@string/View"
android:id="@+id/btnView"
android:layout_weight="1"/>
<Button style="@style/Button"
android:text="@string/Clear"
android:id="@+id/btnClear"
android:layout_weight="1"/>
</LinearLayout>
</LinearLayout>
Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- ************************************************************ -->
<!-- Основные классы стилей -->
<style name="Text">
<item name="android:textColor">#404040</item>
</style>
<style name="Button">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
</style>
<style name="EditText">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
</style>
<!-- ************************************************************ -->
<style name="EditText_Number" parent="EditText">
<item name="android:inputType">number</item>
</style>
<style name="EditText_Text" parent="EditText">
<item name="android:inputType">text</item>
</style>
<!-- ************************************************************ -->
<style name="main_LL_rows">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:orientation">horizontal</item>
<item name="android:gravity">center_vertical</item>
<item name="android:layout_marginTop">15dp</item>
</style>
<style name="labels" parent="@style/Text">
<item name="android:textSize">20dp</item>
<item name="android:layout_width">60dp</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:gravity">center</item>
</style>
<style name="btn_120dp" parent="@style/Button">
<item name="android:layout_width">95dp</item>
</style>
</resources>
Сначала я создал несколько основных классов стилей, свойства которых будут наследоваться остальными классами. По умолчанию я установил ширину и высоту для кнопок(Button) и полей ввода(EditText) равными wrap_content. Это совсем не значит, что это значение будет постоянно для всех элементов перечисленных типов, а лишь то, что если эти свойства не будут изменены, они останутся равными wrap_content. Всему тексту по умолчанию я установил цвет #404040.
Затем, так как у нас поля ввода будут двух типов - цифровые и текстовые, я создал два подкласса - EditText_Number и EditText_Text, которые наследуют свойства класса EditText (строка parent="EditText" означает, что класс this наследует свойство класса EditText). Теперь, если поле ввода будет иметь стиль класса EditText_Number, то этому элементу будут добавлены сразу 3 свойства:
Код: Выделить всё
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:inputType">number</item>
Код: Выделить всё
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:orientation = "horizontal"
android:gravity = "center_vertical"
android:layout_marginTop = "15dp"
Код: Выделить всё
<LinearLayout style="@style/main_LL_rows">
...
</LinearLayout>
Содержимое файла strings.xml:
Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, MainActivity!</string>
<string name="app_name">UsingDatabase2</string>
<string name="Name">Name</string>
<string name="ID">ID</string>
<string name="Sex">Sex</string>
<string name="Male">Male</string>
<string name="Female">Female</string>
<string name="Age">Age</string>
<string name="Edit">Edit</string>
<string name="Delete">Delete</string>
<string name="Add">Add</string>
<string name="View">View</string>
<string name="Clear">Clear</string>
</resources>