Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Цифровые и аналоговые часы



Кроме элемента TimePicker Android поддерживает для отображения времени такие элементы как аналоговые и цифровые часы (элементы AnalogClock и DigitalClock):

<? xml version=" 1.0" encoding=" utf-8"? > < LinearLayout xmlns: android=" http: //schemas.android.com/apk/res/android"         android: orientation=" vertical"         android: layout_        android: layout_height=" match_parent" >    < DigitalClock    android: layout_   android: layout_height=" wrap_content" />    < AnalogClock    android: layout_   android: layout_height=" wrap_content" />  < /LinearLayout>



Ползунок SeekBar

Элемент SeekBar выполняет роль ползунка, то есть шкалу делений, на которой мы можем менять текущую отметку. Определим SeekBar в разметке layout:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 <? xml version=" 1.0" encoding=" utf-8"? > < LinearLayout xmlns: android=" http: //schemas.android.com/apk/res/android" android: orientation=" vertical" android: layout_width=" match_parent" android: layout_height=" match_parent" >   < SeekBar android: id=" @+id/seekBar" android: layout_width=" match_parent" android: layout_height=" wrap_content" android: progress=" 20" android: max=" 50" />   < /LinearLayout>

Атрибут android: progress позволяет задать текущее значение ползунка, а атрибут android: max - максимально возможное значение. В итоге мы получим следующий элемент:

Среди функционала элемента SeekBar следует отметить метод setOnSeekBarChangeListener(), который позволяет установить обработчики событий изменения значения ползунка. Воспользуемся этой функциональностью и определим в файле layout следующий код:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <? xml version=" 1.0" encoding=" utf-8"? > < LinearLayout xmlns: android=" http: //schemas.android.com/apk/res/android" android: orientation=" vertical" android: layout_width=" match_parent" android: layout_height=" match_parent" > < TextView android: id=" @+id/txtView" android: layout_width=" match_parent" android: layout_height=" wrap_content" android: textAlignment=" center" android: layout_centerHorizontal=" true" android: gravity=" center_horizontal" android: textSize=" 30sp" /> < SeekBar android: id=" @+id/seekBar" android: layout_width=" match_parent" android: layout_height=" wrap_content" android: progress=" 20" android: max=" 50" />   < /LinearLayout>

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

И изменим код MainActivity:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.SeekBar; import android.widget.TextView;   public class MainActivity extends AppCompatActivity {   TextView textView; SeekBar seekBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); seekBar = (SeekBar) findViewById(R.id.seekBar); textView = (TextView) findViewById(R.id.txtView); seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {   textView.setText(String.valueOf(progress)); }   @Override public void onStartTrackingTouch(SeekBar seekBar) {   }   @Override public void onStopTrackingTouch(SeekBar seekBar) {   } }); } }

В метод setOnSeekBarChangeListener() передается объект SeekBar.OnSeekBarChangeListener, который позволяет установить три метода-обработчика:

  • onProgressChanged: срабатывает при перетаскивании ползунка по шкале. Передаваемый в метод параметр progress позволяет получить новое значение ползунка, которое в данном случае передается в TextView для отображения на экране
  • onStartTrackingTouch: срабатывает при начале перетаскивания ползунка по шкале
  • onStopTrackingTouch: срабатывает при завершении перетаскивания ползунка по шкале

Также мы можем получить текущее значение ползунка, использовав метод getProgress():

1 2 3 4 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {   textView.setText(String.valueOf(seekBar.getProgress())); }

 Ресурсы


Работа с ресурсами

Ресурс в приложении Android представляет собой файл, например, файл разметки интерфейса или некоторое значение, например, простую строку. То есть ресурсы представляют собой и файлы разметки, и отдельные строки, и звуковые файлы, файлы изображений и т.д. Все ресурсы находятся в проекте в каталоге res. Для различных типов ресурсов, определенных в проекте, в каталоге res создаются подкаталоги. Поддерживаемые подкаталоги:

· animator/: xml-файлы, определяющие анимацию свойств

· anim/: xml-файлы, определяющие tween-анимацию

· color/: xml-файлы, определяющие список цветов

· drawable/: Графические файлы (.png, .jpg, .gif)

· mipmap/: Графические файлы, используемые для иконок приложения под различные разрешения экранов

· layout/: xml-файлы, определяющие пользовательский интерфейс приложения

· menu/: xml-файлы, определяющие меню приложения

· raw/: различные файлы, которые сохраняются в исходном виде

· values/: xml-файлы, которые содержат различные используемые в приложении значения, например, ресурсы строк

· xml/: Произвольные xml-файлы

В общей сложности мы можем определить следующие типы ресурсов:

Ресурс Каталог проекта Файл элемент в файле
Строки /res/values/ strings.xml < string>
Plurals /res/values/ strings.xml < plurals>
Массивы строк /res/values/ strings.xml или arrays.xml < string-array>
Логические значения Boolean /res/values/ bools.xml < bool>
Цвета /res/values/ colors.xml < color>
Список цветов /res/color/ Произвольное название < selector>
Размеры (Dimensions) /res/values/ dimens.xml < dimen>
Идентификаторы ID /res/values/ ids.xml < item>
Целые числа /res/values/ integers.xml < integer>
Массив целых чисел /res/values/ integers.xml < integer-array>
Графические файлы /res/drawable/ Файлы с расширением jpg и png -
Tween-анимация /res/anim/ Файл xml с произвольным названием < set>, < alpha>, < rotate>, < scale>, < translate>
Покадровая анимация /res/drawable/ Файл xml с произвольным названием < animation-list>
Анимация свойств /res/animator/ Файл xml с произвольным названием < set>, < objectAnimator>, < valueAnimator>
Меню /res/menu/ Файл xml с произвольным названием < menu>
XML-файлы /res/xml/ Файл xml с произвольным названием  
Бинарные и текстовые ресурсы /res/raw/ Файлы мультимедиа (mp3, mp4), текстовые и другие файлы  
Разметка графического интерфейса /res/layout/ Файл xml с произвольным названием  
Стили и темы /res/values/ styles.xml, themes.xml < style>

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

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

Когда происходит компиляция проекта сведения обо всех ресурсах добавляются в специальный файл R.java, который можно найти в проекте по пути app\build\generated\source\r\debug\[пакет_приложения]. Для его просмотра надо переключиться в полноценный вид проекта:

В этом файле будут храниться все определения ресурсов в виде числовых констант. К примеру, в проекте по умолчанию есть ресурс разметки интерфейса - файл activity_main.xml в папке res/layout. Для этого ресурса в классе R будет создаваться примерно следующая константа:

public final class R {................................public static final class layout {   public static final int activity_main=0x7f030001; }........................................

Применение ресурсов

Существует два способа доступа к ресурсам: в файле исходного кода и в файле xml.

Ссылка на ресурсы в коде

Тип ресурса в данной записи ссылается на одно из пространств (внутренних классов), определенных в файле R.java, которые имеют соответствующие им типы в xml:

· R.drawable (ему соответствует тип в xml drawable)

· R.id (id)

· R.layout (layout)

· R.string (string)

· R.attr (attr)

· R.plural (plurals)

· R.array (string-array)

Например, для установки ресурса activity_main.xml в качестве графического интерфейса в коде MainActivity в методе onCreate() есть такая строка:

setContentView(R.layout.activity_main);

Через выражение R.layout.activity_main мы и ссылаемся на ресурс activity_main.xml, где layout - тип ресурса, а activity_main - имя ресурса.

Подобным образом мы можем получать другие ресурсы. Например, в файле res/values/strings.xml определен ресурс app_name:

< resources> < string name=" app_name" > ViewsApplication< /string> < /resources>

Этот ресурс ссылается на строку. Чтобы получить ссылку на данный ресурс в коде java, мы можем использовать выражение R.string.app_name.

Доступ в файле xml

Нередко возникает необходимость ссылаться на ресурс в файле xml, например, в файле, который определяет визуальный интерфейс, к примеру, в activity_main.xml. Ссылки на ресурсы в файлах xml имеют следующую формализованную форму: @[имя_пакета: ]тип_ресурса/имя_ресурса

· имя_пакета представляет имя пакета, в котором ресурс находится (указывать необязательно, если ресурс находится в том же пакете)

· тип_ресурса представляет подкласс, определенный в классе R для типа ресурса

· имя_ресурса имя файла ресурса без расширения или значение атрибута android: name в XML-элементе (для простых значений).

Например, мы хотим вывести в элемент TextView строку, которая определена в виде ресурса в файле strings.xml:

Метод getResources

Для получения ресурсов в классе Activity мы можем использовать метод getResources(), который возвращает объект android.content.res.Resources. Но чтобы получить сам ресурс, нам надо у полученного объекта Resources вызвать один из методов:

· getString(): получает строку из файла strings.xml по числовому идентификатору

· getDimension(): получает числовое значение - ресурс dimen

· getDrawable(): получает графический файл

· getBoolean(): получает значение boolean

Это только некоторые методы. Но вкратце рассмотрим их применение. Возьмем тот же файл res/values/strings.xml в качестве источника ресурсов. Пусть файл strings.xml выглядит так:

< resources> < string name=" app_name" > ViewsApplication< /string> < /resources>

И изменим код MainActivity:

package com.example.eugene.viewsapplication; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);    // получение ресурсов из файла values/strings.xml   String app_name = getResources().getString(R.string.app_name);    TextView textView = new TextView(this);    textView.setText(app_name);    setContentView(textView); }}

Здесь, используя метод getResources() получаем все ресурсы. Числовые ресурсы устанавливаем из в качестве отступов внутри элемента TextView, а строковый ресурс - в качестве текста. При запуске приложения мы увидим применение этого ресурса:



Ресурсы строк

Ресурсы строк - один из важных компонентов приложения. Мы используем их при выведении названия приложения, различного текста, например, текста кнопок и т.д.

XML-файлы, представляющие собой ресурсы строк, находятся в проекте в папке res/values. По умолчанию ресурсы строк находятся в файле strings.xml, который может выглядеть следующим образом:

< resources> < string name=" app_name" > ViewsApplication< /string> < /resources>

В самом простом виде этот файл определяет один ресурс " app_name", который устанавливает название приложения. Но естественно мы можем определить любые строковые ресурсы. Каждый отдельный ресурс определяется с помощью элемента string, а его атрибут name содержит название ресурса.

Для ресурсов строк в классе R определяется внутренний класс static final class string. Этот класс используется в качестве пространства для хранения идентификаторов ресурсов строк:

public static final class string { public static final int app_name=0x7f040000; }

Константа app_name имеет тип не String, а int, а ее значение - числовой идентификатор ресурса.

Затем в приложении в файлах кода мы можем ссылаться на эти ресурсы:

R.string.app_name

А ОС Android сама сопоставит данные числовые идентификаторы с соответствующими ресурсами строк. Например:

String application_name = getResources().getString(R.string.app_name);

Либо в xml-файле:

@string/app_name

Например, изменим файл res/values/strings.xml следующим образом:

< resources> < string name=" app_name" > ViewsApplication< /string> < string name=" message" > Hello Android Nougat! < /string> < /resources>

Здесь добавлен ресурс message со значением " Hello Android Nougat! ".

Теперь используем ресурс в файле activity_main.xml:

<? xml version=" 1.0" encoding=" utf-8"? > < RelativeLayout xmlns: android=" http: //schemas.android.com/apk/res/android" android: id=" @+id/activity_main" android: layout_width=" match_parent" android: layout_height=" match_parent" android: paddingBottom=" @dimen/activity_vertical_margin" android: paddingLeft=" @dimen/activity_horizontal_margin" android: paddingRight=" @dimen/activity_horizontal_margin" android: paddingTop=" @dimen/activity_vertical_margin" > < TextView   android: id=" @+id/welcome"    android: layout_width=" wrap_content"    android: layout_height=" wrap_content"    android: text=" @string/message" /> < /RelativeLayout>

С помощью выражения @string/message передаем атрибуту android: text значение из ресурса.

Аналогично мы могли бы использовать ресурс в коде Activity:

import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   // устанавливаем в качестве интерфейса файл second_layout.xml   setContentView(R.layout.activity_main);    // получаем элемент textView   TextView textView = (TextView) findViewById(R.id.welcome);    // получаем ресурс   String message = getResources().getString(R.string.message);    // переустанавливаем у него текст   textView.setText(message); }}

Хотя по умолчанию для ресурсов строк применяется файл strings.xml, но разработчики могут добавлять дополнительные файлы ресурсов в каталог проекта res/values. При этом достаточно соблюдать структуру файла: он должен иметь корневой узел < resources> и иметь один или несколько элементов < string>.

Так, нажмем на папку res/values правой кнопкой мыши и в появившемся списке выберем пункт New -> Value Resource File:

Причем следует отметить, что данный тип файлов будет характерен для любого типа ресурсов, который добавляется в папку res/values.

После этого нам будет предложено определить для файла имя:

Назовем, к примеру, main, и в папку res/values будет добавлен новый файл main.xml. Определим в нем пару ресурсов:

<? xml version=" 1.0" encoding=" utf-8"? > < resources> < string name=" welcome" > Добро пожаловать< /string> < string name=" click_button" > Нажмите на кнопку< /string> < /resources>

И после этого мы сможем использовать определенные здесь ресурсы в коде Activity или в файле layout.

Ресурсы Plurals

Plurals представляют еще один вид набора строк. Он предназначен для описания количества элементов. Для чего это надо? К примеру, возьмем существительное: нередко оно изменяет окончание в зависимости от числительного, которое с ним употребляется: 1 цветок, 2 цветка, 5 цветков. Для подобных случаев и используется ресурс plurals.

Посмотрим на примере. Добавим в папку res/values новый ресурс. Назовем его flowers:

Изменим его содержимое следующим образом:

<? xml version=" 1.0" encoding=" utf-8"? > < resources> < plurals name=" flowers" >    < item quantity=" one" > %d цветок< /item>    < item quantity=" few" > %d цветка< /item>    < item quantity=" many" > %d цветков< /item> < /plurals> < /resources>

Для задания ресурса используется элемент < plurals>, для которого существует атрибут name, получающий в качестве значения произвольное название, по которому потом ссылаются на данный ресурс.

Сами наборы строк вводятся дочерними элементами < item>. Этот элемент имеет атрибут quantity, который имеет значение, указывающее, когда эта строка используется. Данный атрибут может принимать следующие значения:

· zero: строка для количества в размере 0

· one: строка для количества в размере 1 (для русского языка - для задания всех количеств, оканчивающихся на 1, кроме 11)

· two: строка для количества в размере 2

· few: строка для небольшого количества

· many: строка для больших количеств

· other: все остальные случаи

Причем в данном случае многое зависит от конкретного языка. А система сама позволяет определить, какое значение брать для того или иного числа.

Использование данного ресурса возможно толко в коде java. Поэтому изменим код MainActivity:

package com.example.eugene.viewsapplication; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);    String rose = getResources().getQuantityString(R.plurals.flowers, 21, 21);    TextView textView = new TextView(this);    textView.setText(rose);    textView.setTextSize(26);    setContentView(textView); }}

С помощью метода getQuantityString мы получаем значение ресурса. Первым параметром передаем идентификатор ресурса. Вторым параметром идет значение. для которого нужно найти нужную строку. Третий параметр представляет собой значение, которое будет вставляться на место плейсхолдера %d. То есть мы получаем строку для числа 21.



Ресурсы dimension

Определение размеров должно находиться в папке res/values в файле с любым произвольным именем. Общий синтаксис определения ресурса следующий:

<? xml version=" 1.0" encoding=" utf-8"? > < resources> < dimen name=" имя_ресурса" > используемый_размер< /dimen> < /resources>

Как и другие ресурсы, ресурс dimension определяется в корневом элементе < resources>. Тег < dimen> обозначает ресурс и в качестве значния принимает некоторое значение размера в одной из принятых единиц измерения (dp, sp, pt, px, mm, in).

Так, добавим в Android Studio в папку res/values новый файл, который назовем dimens.xml. Определим в нем следующее содержимое:

< resources> < dimen name=" activity_horizontal_margin" > 16dp< /dimen> < dimen name=" activity_vertical_margin" > 16dp< /dimen> < dimen name=" text_size" > 16sp< /dimen> < /resources>

Здесь определены два ресурса для отступов activity_horizontal_margin и activity_vertical_margin, которые хранят значение 16 dp, и ресурс text_size, который хранит высоту шрифта - 16sp. Названия ресурсов могут быть произвольными.

Используем ресурс в файле activity_main.xml:

<? xml version=" 1.0" encoding=" utf-8"? > < RelativeLayout xmlns: android=" http: //schemas.android.com/apk/res/android" android: id=" @+id/activity_main" android: layout_width=" match_parent" android: layout_height=" match_parent" android: paddingBottom=" @dimen/activity_vertical_margin" android: paddingLeft=" @dimen/activity_horizontal_margin" android: paddingRight=" @dimen/activity_horizontal_margin" android: paddingTop=" @dimen/activity_vertical_margin" > < TextView   android: textSize=" @dimen/text_size"    android: layout_width=" wrap_content"    android: text=" Hello Android Nougat! " /> < /RelativeLayout>

Ресурсы dimension используются для таких атриубтов визуальных элементов, которые в качестве значения требуют указание числового значения. Например, атриубут android: layout_height или android: textSize. Для получения ресурса в xml после " @dimen/" указывается имя ресурса.

Для получения ресурсов в коде java применяется метод getDimension() класса Resources:

package com.example.eugene.viewsapplication; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);    float textSize = getResources().getDimension(R.dimen.text_size);    int leftPadding = (int)getResources().getDimension(R.dimen.activity_horizontal_margin);    int topPadding = (int)getResources().getDimension(R.dimen.activity_vertical_margin);    TextView textView = new TextView(this);    textView.setText(" Hello Android Nougat! " );    textView.setTextSize(textSize);    textView.setPadding(leftPadding, topPadding, leftPadding, topPadding);    setContentView(textView); }}

Перевод из dip в пиксели

В случае выше мы использовали преимущественно единицы dip. Но что, если мы хотим динамически перейти от одних единиц измерения к другим, например, от dip к пикселям. Для этого мы можем применить класс android.util.TypedValue:

package com.example.eugene.viewsapplication; package com.example.eugene.layoutapp; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.LinearLayout; import android.widget.TextView; import android.util.TypedValue; public class MainActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);    // условное значение в dp   int textViewHeight = 100;    LinearLayout linearLayout = new LinearLayout(this);    linearLayout.setOrientation(LinearLayout.VERTICAL);    TextView textView1 = new TextView(this);    textView1.setText(" Hello Android Nougat! " );    textView1.setTextSize(26);    textView1.setBackgroundColor(0xffc5cae9);    // преобразуем размер из dp в физические пиксели   int height = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,            textViewHeight, getResources().getDisplayMetrics());    textView1.setHeight(height);    linearLayout.addView(textView1);    TextView textView2 = new TextView(this);    textView2.setText(" Hello Android Nougat! " );    textView2.setTextSize(26);    textView2.setBackgroundColor(0xffbbdefb);    textView2.setHeight(textViewHeight);    linearLayout.addView(textView2);    setContentView(linearLayout); }}

С помощью метода TypedValue.applyDimension() осуществляется перевод из одних единиц в другие. Первый параметр - тип исходных единиц измерения (в данном случае dip), второй параметр - количество для конвертации, а третий параметр - параметр DisplayMetrics, который позволяет произвести конвертацию.

В данном случае создается 2 элемента TextView. Для установки высоты для обоих элементов используется значение из переменной textViewHeight, однако в первом случае это значение подвергается преоразованию из dp в пиксели, и соответственно оба элемента будут иметь различную итоговую высоту:



Activity


Поделиться:



Последнее изменение этой страницы: 2019-05-04; Просмотров: 306; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.051 с.)
Главная | Случайная страница | Обратная связь