<rss version="2.0">

<channel>
 <title>Освой программирование играючи!</title>
 <link>http://developer.alexanderklimov.ru/</link>
 <description>Сайт для программистов</description>
 <language>ru-ru</language>
<webMaster>terminator2@mail.ru (Александр Климов)</webMaster>

<item>
<title>Kotlin: Настраиваем проект под себя</title>
<link>http://developer.alexanderklimov.ru/android/kotlin/</link>
<description>
&lt;p&gt;Лайфхак: Файлы с кодом на Kotlin смотрятся странно в папке &lt;b&gt;java&lt;/b&gt; в проекте студии. Переключаемся в режим &lt;b&gt;Project&lt;/b&gt;, выбираем из контекстного меню папки &lt;b&gt;main&lt;/b&gt; меню &lt;b&gt;New | Directory&lt;/b&gt; и создаём папку &lt;b&gt;kotlin&lt;/b&gt;. Перетаскиваем в папку все файлы классов из папки вашего пакета, например, &lt;b&gt;main/com.example.kitty&lt;/b&gt;. Папку &lt;b&gt;java&lt;/b&gt; с пустой подпапкой можно удалять. Приложение будет работать по-прежнему.&lt;/p&gt;
</description>
<guid>http://developer.alexanderklimov.ru/android/kotlin/</guid>
</item>


<item>
<title>Адаптивные значки</title>
<link>http://developer.alexanderklimov.ru/android/theory/adaptive_icons.php</link>
<description>
&lt;p&gt;В Android 8.0 Oreo появилась поддержка адаптивных значков.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://developer.android.com/guide/practices/ui_guidelines/images/Single_Icon_Parallax_Demo_01_2x_ext.gif&quot; width=&quot;300&quot;&gt;&lt;/p&gt;

&lt;p&gt;Для работы с адаптивными значками следует использовать API 26 и выше. Адаптивные значки состоят из двух слоёв: фон и основная часть.&lt;/p&gt;

&lt;p&gt;В манифесте по-прежнему остаётся старая запись о значке.&lt;/p&gt;

&lt;pre class=&quot;bg-light&quot;&gt;&lt;code&gt;
&amp;lt;application
    android:icon=&amp;quot;@mipmap/ic_launcher&amp;quot;
    android:roundIcon=&amp;quot;@mipmap/ic_launcher_round&amp;quot;
&amp;lt;/application&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;http://developer.alexanderklimov.ru/android/theory/adaptive_icons.php&quot;&gt;Читать на сайте&lt;/a&gt;&lt;/p&gt;
</description>
<guid>http://developer.alexanderklimov.ru/android/theory/adaptive_icons.php</guid>
</item>

<item>
<title>Библиотека CatLoadingView</title>
<link>http://developer.alexanderklimov.ru/android/library/catloadingview.php</link>
<description>
&lt;p&gt;&lt;b&gt;CatLoadingView&lt;/b&gt; основана на &lt;b&gt;DialogFragment&lt;/b&gt; и выводит анимационное изображение кота, чтобы показать, что приложение работает и выполняет долгую операцию.&lt;/p&gt;

&lt;p&gt;Домашняя страница: &lt;a href=&quot;https://github.com/Rogero0o/CatLoadingView&quot;&gt;Гитхаб&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Установим зависимость в Gradle.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
compile 'com.roger.catloadinglibrary:catloadinglibrary:1.0.3'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Хотя автор на своей странице приводит пример с версией 1.0.1, есть более свежая версия 1.0.3, которая позволяет установить свой текст под анимацией. По умолчанию выводится текст &quot;LOADING...&quot;.&lt;/p&gt;

&lt;p&gt;Поместим на экране кнопку для запуска диалогового окна.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
package ru.alexanderklimov.cat;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

import com.roger.catloadinglibrary.CatLoadingView;

public class MainActivity extends AppCompatActivity  {

    CatLoadingView mView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mView = new CatLoadingView();
    }


    public void onClick(View view) {
        mView.show(getSupportFragmentManager(), &quot;&quot;);
        // Установим свой текст
        mView.setText(&quot;М Я У ...&quot;);
    }

}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Если не устанавливать свой текст, то увидим следующую картинку.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://camo.githubusercontent.com/762015246e027b7d46df51faa51fd669e44f974b/687474703a2f2f7777342e73696e61696d672e636e2f6d773639302f61363935616364656a7731663268626d66787a6b3567323038753061326173732e676966&quot;&gt;&lt;/p&gt;

&lt;p&gt;Стоит отметить, что на некоторых устройствах вы можете не увидеть надпись. Это связано с не очень удачным макетом для фрагмента. Поэтому вы можете форкнуть проект и переделать под себя.&lt;/p&gt;
</description>
<guid>http://developer.alexanderklimov.ru/android/library/catloadingview.php</guid>
</item>

<item>
<title>Android: WebP</title>
<link>http://developer.alexanderklimov.ru/android/studio/webp.php</link>
<description>
&lt;p&gt;&lt;b&gt;WebP&lt;/b&gt; - новый графический формат, разработанный в Google. По словам разработчиков формата, WebP сочетает возможности JPEG и PNG, поддерживая прозрачность и лучшую компрессию (25-34%).&lt;/p&gt;

&lt;p&gt;Изображения формата WebP поддерживаются с Android 4.0 (API 14) и с Android 4.3 (API 18) для прозрачных изображений.&lt;/p&gt;

&lt;p&gt;В Android Studio 2.3 появилась встроенная конвертация форматов PNG, JPG, BMP, статических GIF в WebP (9 Patch не поддерживаются).&lt;/p&gt; 

&lt;p&gt;Щёлкните правой кнопкой мыши на файле картинки в ресурсах и выберите команду &lt;b&gt;Convert to WebP...&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;Появится диалоговое окно.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://developer.alexanderklimov.ru/android/studio/webp1.png&quot; alt=&quot;WebP&quot;&gt;&lt;/p&gt;

&lt;p&gt;В следующем окне будет показана информация, насколько уменьшится размер файла. Нажимаем на кнопки &lt;b&gt;Finish&lt;/b&gt;, чтобы завершить процесс.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://developer.alexanderklimov.ru/android/studio/webp2.png&quot; alt=&quot;WebP&quot; class=&quot;img-responsive&quot;&gt;&lt;/p&gt;

&lt;p&gt;Возможен и обратный процесс - щелкаем правой кнопкой мыши на файле WebP и выбираем команду &lt;b&gt;Convert to PNG...&lt;/b&gt;.&lt;/p&gt;
</description>
<guid>http://developer.alexanderklimov.ru/android/studio/webp.php</guid>
</item>

<item>
<title>Android Studio: Перевод на новую строку</title>
<link>http://developer.alexanderklimov.ru/android/studio/code_editor.php#new_line</link>
<description>
&lt;p&gt;Если курсор находится в середине выражения и вы хотите начать новую строку, не обязательно гнать курсор в конец строки. Просто нажмите комбинацию &lt;b&gt;Shift+Enter&lt;/b&gt;.&lt;/p&gt;
</description>
<guid>http://developer.alexanderklimov.ru/android/studio/code_editor.php#new_line</guid>
</item>

<item>
<title>TextInputEditText</title>
<link>http://developer.alexanderklimov.ru/android/views/textinputedittext.php</link>
<description>
&lt;p&gt;В одном из обновлений Android Support Library 24.2.0 появилась интересная возможность использовать новый компонент &lt;b&gt;android.support.design.widget.TextInputEditText&lt;/b&gt;, построенный на основе &lt;b&gt;AppCompatEditText&lt;/b&gt;, который в свою очередь является родственником стандартного &lt;b&gt;EditText&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;Компонент специально разработан для работы в связке с &lt;a href=&quot;http://developer.alexanderklimov.ru/android/layout/textinputlayout.php&quot; &gt;TextInputLayout (Android Design Support Library)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Особый интерес представляет режим ввода пароля. Посмотрим на примере.&lt;/p&gt;

&lt;p&gt;На панели инструментов его пока нет, поэтому пишем вручную.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;xml&quot;&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;LinearLayout
    xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;
    xmlns:app=&amp;quot;http://schemas.android.com/apk/res-auto&amp;quot;
    android:layout_width=&amp;quot;match_parent&amp;quot;
    android:layout_height=&amp;quot;match_parent&amp;quot;
    android:orientation=&amp;quot;vertical&amp;quot;&amp;gt;

    &amp;lt;android.support.design.widget.TextInputLayout
        android:layout_width=&amp;quot;match_parent&amp;quot;
        android:layout_height=&amp;quot;wrap_content&amp;quot;
        app:passwordToggleContentDescription=&amp;quot;description&amp;quot;
        app:passwordToggleEnabled=&amp;quot;true&amp;quot;
        app:passwordToggleTint=&amp;quot;@color/colorAccent&amp;quot;&amp;gt;

        &amp;lt;android.support.design.widget.TextInputEditText
            android:layout_width=&amp;quot;match_parent&amp;quot;
            android:layout_height=&amp;quot;wrap_content&amp;quot;
            android:hint=&amp;quot;Пароль&amp;quot;
            android:inputType=&amp;quot;textPassword&amp;quot;/&amp;gt;

    &amp;lt;/android.support.design.widget.TextInputLayout&amp;gt;
&amp;lt;/LinearLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Никакого кода писать не будем, а сразу запустим пример. Начинаем вводить пароль. Как обычно, вводимый символ сначала показывается, а потом заменяется на символ точки.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://developer.alexanderklimov.ru/android/views/textinputedittext1.png&quot; alt=&quot;TextInputEditText&quot;&gt;&lt;/p&gt;

&lt;p&gt;Справа видим значок глаза. Нажимаем на него, и пароль весь как на ладони.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://developer.alexanderklimov.ru/android/views/textinputedittext2.png&quot; alt=&quot;TextInputEditText&quot;&gt;&lt;/p&gt;

&lt;p&gt;Можно попробовать заменить значок глаза на свой через атрибут &lt;b&gt;app:passwordToggleDrawable=&quot;@drawable/another_toggle_drawable&quot;&lt;/b&gt; (я не пробовал).&lt;/p&gt;

&lt;p&gt;Данный режим включится при использовании в &lt;b&gt;android:inputType&lt;/b&gt; значений &lt;b&gt;textPassword&lt;/b&gt;, &lt;b&gt;numberPassword&lt;/b&gt;, &lt;b&gt;textWebPassword&lt;/b&gt;, не действует для &lt;b&gt;textVisiblePassword&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;Обратите также внимание на атрибуты у &lt;b&gt;TextInputLayout&lt;/b&gt;: &lt;b&gt;passwordToggleContentDescription&lt;/b&gt;, &lt;b&gt;passwordToggleDrawable&lt;/b&gt; (см. выше), &lt;b&gt;passwordToggleEnabled&lt;/b&gt;, &lt;b&gt;passwordToggleTint&lt;/b&gt;, &lt;b&gt;passwordToggleTintMode&lt;/b&gt; - разберитесь с ними сами. Естественно, они также доступны и программным способом.&lt;/p&gt;
</description>
<guid>http://developer.alexanderklimov.ru/android/views/textinputedittext.php</guid>
</item>

<item>
<title>Android. TextView: Выделить текст для копирования</title>
<link>http://developer.alexanderklimov.ru/android/views/textview.php#selectable</link>
<description>
&lt;p&gt;По умолчанию, текст в &lt;b&gt;TextView&lt;/b&gt; нельзя выделить для копирования. Но в API 11 появилась такая возможность, которая может пригодиться. Делается либо при помощи XML-атрибута &lt;b&gt;android:textIsSelectable&lt;/b&gt;, либо через метод &lt;b&gt;setTextIsSelectable()&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;Добавьте в разметку два компонента &lt;b&gt;TextView&lt;/b&gt; и одно текстовое поле &lt;b&gt;EditText&lt;/b&gt; для вставки скопированного текста. У первой текстовой метки установим возможность выделения текста декларативно.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;xml&quot;&gt;
&amp;lt;TextView
    android:id=&amp;quot;@+id/textView&amp;quot;
    android:layout_width=&amp;quot;match_parent&amp;quot;
    android:layout_height=&amp;quot;wrap_content&amp;quot;
    android:text=&amp;quot;Выдели слово Кот для проверки&amp;quot;
    &lt;b&gt;android:textIsSelectable=&amp;quot;true&amp;quot;&lt;/b&gt;
    android:textSize=&amp;quot;26sp&amp;quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Для второго компонента возможность выделения создадим программно.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;
TextView secondTextView = (TextView) findViewById(R.id.textView2);
secondTextView.setTextIsSelectable(true);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Сделайте долгий тап на тексте в любом &lt;b&gt;TextView&lt;/b&gt;. Увидите стандартные ползунки для выбора длины текста. Скопируйте текст, сделайте длинный тап в &lt;b&gt;EditText&lt;/b&gt; и вставьте текст.&lt;/p&gt;
</description>
<guid>http://developer.alexanderklimov.ru/android/views/textview.php#selectable</guid>
</item>

<item>
<title>SwitchCompat</title>
<link>http://developer.alexanderklimov.ru/android/views/switch.php#switchcompat</link>
<description>
&lt;p&gt;Если вы разрабатываете приложение под Material Design, то используйте &lt;b&gt;SwitchCompat&lt;/b&gt;, который специально переработали под новые требования. Сравните внешний вид двух компонентов, чтобы увидеть разницу.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;xml&quot;&gt;
&amp;lt;android.support.v7.widget.SwitchCompat
    android:id=&amp;quot;@+id/switch_compat&amp;quot;
    android:layout_width=&amp;quot;wrap_content&amp;quot;
    android:layout_height=&amp;quot;wrap_content&amp;quot;
    android:layout_centerHorizontal=&amp;quot;true&amp;quot;
    android:layout_centerVertical=&amp;quot;true&amp;quot;
    android:layout_marginLeft=&amp;quot;50dp&amp;quot;
    android:checked=&amp;quot;false&amp;quot;
    android:text=&amp;quot;SwitchCompat&amp;quot;
    android:textOff=&amp;quot;OFF&amp;quot;
    android:textOn=&amp;quot;ON&amp;quot;
    app:showText=&amp;quot;true&amp;quot;/&amp;gt;

&amp;lt;Switch
    android:id=&amp;quot;@+id/switch1&amp;quot;
    android:layout_width=&amp;quot;wrap_content&amp;quot;
    android:layout_height=&amp;quot;wrap_content&amp;quot;
    android:layout_below=&amp;quot;@+id/switch_compat&amp;quot;
    android:layout_centerHorizontal=&amp;quot;true&amp;quot;
    android:layout_marginTop=&amp;quot;55dp&amp;quot;
    android:checked=&amp;quot;false&amp;quot;
    android:text=&amp;quot;Switch&amp;quot;
    android:textOff=&amp;quot;Кошка&amp;quot;
    android:textOn=&amp;quot;Кот&amp;quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src=&quot;http://developer.alexanderklimov.ru/android/views/switch2.png&quot; alt=&quot;SwitchCompat&quot;&gt; &lt;img src=&quot;http://developer.alexanderklimov.ru/android/views/switch3.png&quot; alt=&quot;Switch&quot;&gt;&lt;/p&gt;

&lt;p&gt;Как видите, новый компонент из библиотеки использует цвета темы (&lt;b&gt;colorAccent&lt;/b&gt;).&lt;/p&gt;
</description>
<guid>http://developer.alexanderklimov.ru/android/views/switch.php#switchcompat</guid>
</item>

<item>
<title>Библиотека Android Support Design</title>
<link>http://developer.alexanderklimov.ru/android/android-support-design.php</link>
<description>
&lt;p&gt;Библиотека &lt;b&gt;Android Support Design&lt;/b&gt; была представлена одновременно с новой версией Android Marshmallow, но её можно использовать на устройствах, начиная с версии Android 2.1. Библиотека была специально спроектирована под новый дизайн Material Design и позволяет использовать готовые компоненты в новом стиле.&lt;/p&gt;

&lt;h2 class=&quot;text-warning&quot; id=&quot;old&quot;&gt;Для старых проектов&lt;/h2&gt;

&lt;p&gt;Если вы вручную будете переводить старые проекты под новый дизайн и использовать библиотеку, то установите через SDK Manager репозиторий &lt;b&gt;Android Support Repository&lt;/b&gt; последней версии. Далее в Gradle пропишите зависимость. Первая версия имела номер 22.2.0. В проектах используйте свежую версию.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
compile 'com.android.support:design:23.0.1'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Также желательно прописать в другом Gradle-файле, который отвечает за проект в целом, поддержку версии Gradle не ниже 1.2.3. Данная зависимость устранит некоторые ошибки при отрисовке компонентов в редакторе разметки в режиме дизайна.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
dependencies {
    classpath 'com.android.tools.build:gradle:1.3.0'
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 class=&quot;text-warning&quot; id=&quot;blankactivity&quot;&gt;Используем новый шаблон&lt;/h2&gt;

&lt;p&gt;В новых проектах всё уже настроено. Вам достаточно создать проект при помощи шаблона &lt;b&gt;Blank Activity&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;images/blankactivity.png&quot;&gt;&lt;/p&gt;

&lt;p&gt;При использовании нового шаблона будут задействованы четыре компонента библиотеки: &lt;b&gt;CoordinatorLayout&lt;/b&gt;, &lt;b&gt;AppBarLayout&lt;/b&gt;, &lt;b&gt;FloatingActionButton&lt;/b&gt;, &lt;b&gt;Snackbar&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;Первые три компонента доступны через XML-разметку, а &lt;b&gt;Snackbar&lt;/b&gt; вызывается программно.&lt;/p&gt;

&lt;p&gt;Изучим разметку активности.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;xml&quot;&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;android.support.design.widget.CoordinatorLayout
    xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;
    xmlns:app=&amp;quot;http://schemas.android.com/apk/res-auto&amp;quot;
    xmlns:tools=&amp;quot;http://schemas.android.com/tools&amp;quot;
    android:layout_width=&amp;quot;match_parent&amp;quot;
    android:layout_height=&amp;quot;match_parent&amp;quot;
    android:fitsSystemWindows=&amp;quot;true&amp;quot;
    tools:context=&amp;quot;.MainActivity&amp;quot;&amp;gt;

    &amp;lt;android.support.design.widget.AppBarLayout
        android:layout_width=&amp;quot;match_parent&amp;quot;
        android:layout_height=&amp;quot;wrap_content&amp;quot;
        android:theme=&amp;quot;@style/AppTheme.AppBarOverlay&amp;quot;&amp;gt;

        &amp;lt;android.support.v7.widget.Toolbar
            android:id=&amp;quot;@+id/toolbar&amp;quot;
            android:layout_width=&amp;quot;match_parent&amp;quot;
            android:layout_height=&amp;quot;?attr/actionBarSize&amp;quot;
            android:background=&amp;quot;?attr/colorPrimary&amp;quot;
            app:popupTheme=&amp;quot;@style/AppTheme.PopupOverlay&amp;quot;/&amp;gt;

    &amp;lt;/android.support.design.widget.AppBarLayout&amp;gt;

    &amp;lt;include layout=&amp;quot;@layout/content_main&amp;quot;/&amp;gt;

    &amp;lt;android.support.design.widget.FloatingActionButton
        android:id=&amp;quot;@+id/fab&amp;quot;
        android:layout_width=&amp;quot;wrap_content&amp;quot;
        android:layout_height=&amp;quot;wrap_content&amp;quot;
        android:layout_gravity=&amp;quot;bottom|end&amp;quot;
        android:layout_margin=&amp;quot;@dimen/fab_margin&amp;quot;
        android:src=&amp;quot;@android:drawable/ic_dialog_email&amp;quot;/&amp;gt;

&amp;lt;/android.support.design.widget.CoordinatorLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Корневым элементов разметки служит новый компонент &lt;b&gt;CoordinatorLayout&lt;/b&gt;, который является наследником стандартного &lt;a href=&quot;http://developer.alexanderklimov.ru/android/layout/framelayout.php&quot;&gt;FrameLayout&lt;/a&gt;. Но если обычный &lt;b&gt;FrameLayout&lt;/b&gt; позволяет просто накладывать один компонент поверх другого, то &lt;b&gt;CoordinatorLayout&lt;/b&gt; позволяет координировать определённые зависимости между дочерними компонентами. Сейчас мы не будем вдаваться в тонкости. Этой теме можно посвятить отдельную статью.&lt;/p&gt;

&lt;p&gt;Далее идёт &lt;b&gt;AppBarLayout&lt;/b&gt; с вложенным &lt;b&gt;Toolbar&lt;/b&gt;. Связка компонентов образуют внешний вид и поведение продвинутого заголовка экрана активности, который пришёл на смену &lt;b&gt;ActionBar&lt;/b&gt; из Android 4.x, который в свою очередь заменил стандартный заголовок (Title) в Android 2.x. Опять оставляем их пока без внимания.&lt;/p&gt;

&lt;p&gt;Далее следует интересный приём, который вам может впоследствии пригодиться. В существующую разметку вставляется ещё одна разметка при помощи тега &lt;b&gt;include&lt;/b&gt; и с указанием вставляемой разметки - &lt;b&gt;layout/content_main.xml&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;Завершает основную разметку красивая кнопка &lt;b&gt;FloatingActionButton&lt;/b&gt;, которая на самом деле является продвинутым вариантом &lt;b&gt;ImageView&lt;/b&gt;. Но в спецификации &lt;b&gt;Material Design&lt;/b&gt; кнопке отводится большая роль и практически является визитной карточкой нового дизайна. Наверняка, вы уже видели её на различных картинках.&lt;/p&gt;

&lt;p&gt;Подробнее о возможностях кнопки также в других материалах. Обратите внимание, что кнопка &quot;пришпилена&quot; к нижнему правому углу экрана при помощи &lt;b&gt;layout_gravity&lt;/b&gt;. В качестве значка используется изображение из системных ресурсов &lt;b&gt;@android:drawable/ic_dialog_email&lt;/b&gt;. Вы можете установить собственное изображение, подходящее по контексту. На данный момент Гугл рекомендует отказываться от растровых изображений и активно использовать векторные изображения.&lt;/p&gt;

&lt;p&gt;Заменим значок электронной почты на изображение лапы кота.&lt;/p&gt;

&lt;p&gt;Переходим к программной части.&lt;/p&gt;

&lt;h2 class=&quot;text-warning&quot; id=&quot;snackbar&quot;&gt;Закусывать надо! Базовый пример с Snackbar&lt;/h2&gt;

&lt;p&gt;Если раньше для всплывающих сообщений использовались хлебные тосты &lt;b&gt;Toast&lt;/b&gt;, то теперь можно использовать новый класс &lt;b&gt;Snackbar&lt;/b&gt;,  который переводится как &quot;Закусочная&quot;.&lt;/p&gt;

&lt;p&gt;Новый класс &lt;b&gt;Snackbar&lt;/b&gt; имеет много общего с классом &lt;b&gt;Toast&lt;/b&gt; и имеет практически тот же синтаксис.&lt;/p&gt;

&lt;p&gt;Объявим объект класса &lt;b&gt;FloatingActionButton&lt;/b&gt; и напишем код для сообщения при щелчке.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Snackbar.make(view, &quot;Replace with your own action&quot;, Snackbar.LENGTH_LONG)
                .setAction(&quot;Action&quot;, null).show();
    }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Как видите, код очень похож. Но есть и различия. Если &lt;b&gt;Toast&lt;/b&gt; является частью активности и выводится поверх неё в нижней части по умолчанию, если не заданы другие параметры, то &lt;b&gt;Snackbar&lt;/b&gt; выводится в &quot;подвале&quot; родительского элемента. В первом параметре указывается подходящий компонент, по которому система попытается найти родителя, обычно им является &lt;b&gt;CoordinatorLayout&lt;/b&gt;. В некоторых примерах я видел код, когда родитель указывается явно.&lt;/p&gt;

&lt;p&gt;Код можно немного упростить, если убрать вызов метода &lt;b&gt;setAction()&lt;/b&gt;, который сейчас не используется.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;
Snackbar.make(view, &quot;Replace with your own action&quot;, Snackbar.LENGTH_LONG).show();
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Сообщение появляется на несколько секунд с указанным текстом и исчезает через несколько секунд. Практически аналогичное поведение у старого &lt;b&gt;Toast&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;Но есть и небольшие отличия. Например, когда выводится сообщение, его можно смахнуть с экрана слева направо, не дожидаясь, когда оно само исчезнет.&lt;/p&gt;

&lt;p&gt;В версии 22.2.1 появилась новая константа &lt;b&gt;Snackbar.LENGTH_INDEFINITE&lt;/b&gt; (неопределённая длительность). В этом случае компонент не исчезает самостоятельно.&lt;/p&gt;

&lt;h3 class=&quot;text-warning&quot; id=&quot;dismiss&quot;&gt;Метод dismiss()&lt;/h3&gt;

&lt;p&gt;Метод &lt;b&gt;dismiss()&lt;/b&gt;закрывает сообщение. Может пригодиться при использовании &lt;b&gt;LENGTH_INDEFINITE&lt;/b&gt;, когда сообщение будет висеть на экране вечно. Добавим кнопку для закрытия сообщения и напишем код.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;
private Snackbar mSnackbar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mSnackbar = Snackbar.make(view, &quot;Пора кормить кота!&quot;, Snackbar.LENGTH_INDEFINITE)
                    .setAction(&quot;Action&quot;, null);
            mSnackbar.show();
        }
    });

    Button dismissButton = (Button) findViewById(R.id.buttonDismiss);
    dismissButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mSnackbar.dismiss();
        }
    });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 class=&quot;text-warning&quot; id=&quot;color&quot;&gt;Меняем цвет текста и фона&lt;/h3&gt;

&lt;p&gt;Класс &lt;b&gt;Snackbar&lt;/b&gt; является закрытым ящиком и мы не знаем, как он устроен. Но у него есть метод &lt;b&gt;getView()&lt;/b&gt;, который возвращает некий компонент &lt;b&gt;View&lt;/b&gt;. Получив его, мы можем поменять у него фоновый цвет.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;
fab.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        mSnackbar = Snackbar.make(view, &quot;Пора кормить кота!&quot;, Snackbar.LENGTH_INDEFINITE)
                .setAction(&quot;Action&quot;, null);

        View snackbarView = mSnackbar.getView();
        snackbarView.setBackgroundColor(Color.BLUE);
        mSnackbar.show();
    }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Если вам захочется поменять также и цвет текста в сообщении, то нужно получить доступ к &lt;b&gt;TextView&lt;/b&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;
mSnackbar = Snackbar.make(view, &quot;Пора кормить кота!&quot;, Snackbar.LENGTH_INDEFINITE)
        .setAction(&quot;Action&quot;, null);

View snackbarView = mSnackbar.getView();
snackbarView.setBackgroundColor(Color.BLUE);
&lt;b&gt;TextView snackTextView = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
snackTextView.setTextColor(Color.RED);&lt;/b&gt;
snackbar.show();
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;На практике, вы вряд ли будете часто менять эти цвета, но вдруг пригодится.&lt;/p&gt;

&lt;h2 class=&quot;text-warning&quot; id=&quot;action&quot;&gt;Добавляем кнопку действия&lt;/h2&gt;

&lt;p&gt;Ради вывода сообщения в подвале экрана не стоило создавать новый класс, &lt;b&gt;Toast&lt;/b&gt; вполне справлялся с этой задачей. Теперь рассмотрим существенное различие. На панели &lt;b&gt;Snackbar&lt;/b&gt; можно разместить кнопку действия с помощью метода &lt;b&gt;setAction()&lt;/b&gt;. В методе нужно указать текст для кнопки и обработчик для щелчка.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    ...

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mSnackbar = Snackbar.make(view, &quot;Покормил кота?&quot;, Snackbar.LENGTH_INDEFINITE)
                    &lt;b&gt;.setAction(&quot;Да&quot;, snackbarOnClickListener);&lt;/b&gt;
            mSnackbar.show();
        }
    });
}

&lt;b&gt;View.OnClickListener snackbarOnClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Toast.makeText(getApplicationContext(), &quot;Молодец!&quot;, Toast.LENGTH_LONG).show();
    }
};&lt;/b&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;В моём случае при нажатии на кнопку действия панель исчезала. Если этого не происходит, всегда можно добавить дополнительную строчку с вызовом метода &lt;b&gt;dismiss()&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;С помощью метода &lt;b&gt;setActionTextColor()&lt;/b&gt; можно поменять цвет текста у кнопки действия.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;
Snackbar
        .make(parent, &quot;Покормил кота?&quot;, Snackbar.LENGTH_LONG)
        .setAction(&quot;Да&quot;, snackOnClickListener)
        &lt;b&gt;.setActionTextColor(Color.MAGENTA)&lt;/b&gt; // цвет текста у кнопки действия
        .show();
&lt;/code&gt;&lt;/pre&gt;

</description>
<guid>http://developer.alexanderklimov.ru/android/android-support-design.php</guid>
</item>

<item>
<title>Переопределяем внешний вид стандартного значка меню в виде трёх точек по вертикальной линии</title>
<link>http://developer.alexanderklimov.ru/android/theory/styles.php</link>
<description>
&lt;p&gt;Переопределяем внешний вид стандартного значка меню в виде трёх точек по вертикальной линии.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;xml&quot;&gt;
&amp;lt;style name=&amp;quot;AppTheme&amp;quot; parent=&amp;quot;Theme.AppCompat.Light.DarkActionBar&amp;quot;&amp;gt;
    &amp;lt;!-- Customize your theme here. --&amp;gt;
    &amp;lt;item name=&amp;quot;android:actionOverflowButtonStyle&amp;quot;&amp;gt;@style/MyActionButtonOverflow&amp;lt;/item&amp;gt;
&amp;lt;/style&amp;gt;

&amp;lt;!-- Стиль для замены значка меню в ActionBar. Установите 'android:actionOverflowButtonStyle' в AppTheme --&amp;gt;
&amp;lt;style name=&amp;quot;MyActionButtonOverflow&amp;quot; parent=&amp;quot;android:style/Widget.Holo.Light.ActionButton.Overflow&amp;quot;&amp;gt;
    &amp;lt;item name=&amp;quot;android:src&amp;quot;&amp;gt;@mipmap/ic_launcher&amp;lt;/item&amp;gt;
&amp;lt;/style&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</description>
<guid>http://developer.alexanderklimov.ru/android/theory/styles.php</guid>
</item>

</channel>
</rss>