Даєш кастомізацію всієї програми під ОС Android!
З таким гаслом хочеться розповісти сьогодні про кастомізацію спливаючого повідомлення (Toast) в ОС Android. У будь-якому додатку, який проектується і розробляється з особливою ретельністю, може постати питання кастомізації навіть такого елемента, як спливаюче повідомлення. Адже успіх додатків залежить не тільки від ідеї та корисності, але також і від реалізації зовнішнього вигляду деталей, навіть найдрібніших і, здавалося б, не дуже важливих. Що вже говорити про програми з вирвиглазним дизайном.
Структура проекта
У цьому уроці пропонується написати програму, яка виводитиме на екран кастомізоване спливаюче повідомлення натисканням кнопки, яка не піддаватиметься кастомізації.
У Проекті є два класи:
- Основна діяльність
- MyListAdapter – який відповідає за передачу даних у форму елемента списку
Також у проекті присутні такі файли ресурсів:
- діяльність_main.xml
- toast_info.xml - розмітка спливаючого повідомлення
- toast_border:xml - додаткова розмітка для background`а спливаючого повідомлення
- ic_info.png -зображення інформаційного значка, який буде застосовуватися у спливаючому повідомленні
- string.xml – файл рядкових констант
Формування розмітки програми
діяльність_main.xml
Розмітка основної активіті, звідки буде викликати спливаюче повідомлення
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:paddingTop="@dimen/activity_vertical_margin"
- android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
- android:background="#ffffff"
- android:orientation="vertical">
- <TextView android:text="@string/check_toast"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="30sp"/>
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/push_me"
- android:id="@+id/button"
- android:layout_gravity="center_horizontal"
- android:textSize="30sp"/>
- </LinearLayout>
тост \ _info.xml
Файл розмітки спливаючого повідомлення. У цьому файлі визначається верстка двох елементів:
- ImageView - до якого буде поміщено зображення інформаційного значка;
- TextView - елемент, який буде поміщатися текст повідомлення.
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="240dp"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:padding="8dp"
- android:layout_gravity="center_horizontal"
- android:background="@drawable/toast_border">
- <ImageView
- android:id="@+id/imageView1"
- android:src="@mipmap/ic_info"
- android:padding="4dp"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:layout_marginLeft="8dp"
- android:layout_marginRight="8dp"
- android:layout_gravity="center_vertical"
- android:contentDescription="ToastPicture" />
- <TextView
- android:id="@+id/textView1"
- android:layout_width="match_parent"
- android:maxWidth="260dp"
- android:layout_height="wrap_content"
- android:layout_margin="8dp"
- android:text="Android Tutorial Custom Toast"
- android:textColor="#fff"
- android:textSize="24sp"
- android:layout_gravity="center_vertical"/>
- </LinearLayout>
тост_border.xml
XML-файл, в якому налаштовується відображення меж та заокруглення кутів спливаючого повідомлення.
- <?xml version="1.0" encoding="utf-8"?>
- <shape xmlns:android="http://schemas.android.com/apk/res/android">
- <padding android:left="8dp" android:top="8dp"
- android:right="8dp" android:bottom="8dp" />
- <corners android:radius="10dp" />
- <solid android:color="#661f1f21"/>
- </shape>
Основний клас проекту - MainActivity.java
У цьому класі проводиться запуск основної активіті проекту, з якої буде викликатися кастомізований Toast. Проект створювався в Android Studio відразу з готової активіті (Blank Activity Project).
У цьому класі імплементується метод OnClickListener і його перевизначення @Override. У цьому методі і відбувається виклик спливаючого повідомлення, причому одним рядком.
- package ru.evileg.customtoast;
- import android.support.v7.app.ActionBarActivity;
- import android.os.Bundle;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.view.View;
- import android.widget.Button;
- public class MainActivity extends ActionBarActivity implements View.OnClickListener {
- private static Button button;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- /*
- * Инициализация кнопки, по нажатию на которую будет вызываться
- * всплывающее сообщение
- */
- button = (Button) this.findViewById(R.id.button);
- button.setOnClickListener(this);
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.menu_main, menu);
- return true;
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- // Handle action bar item clicks here. The action bar will
- // automatically handle clicks on the Home/Up button, so long
- // as you specify a parent activity in AndroidManifest.xml.
- int id = item.getItemId();
- //noinspection SimplifiableIfStatement
- if (id == R.id.action_settings) {
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
- @Override
- public void onClick(View v) {
- /*
- * Вызов всплывающего сообщения
- */
- CustomToast.makeText(this, R.string.toast_message).show();
- }
- }
Клас CustomToast.java
Цей клас служить на формування кастомизированного повідомлення. Суть кастомізації Toast у цьому уроці зводиться до успадкування існуючого класу Toast, з наступною ініціалізацією власної розмітки спливаючого повідомлення та встановлення зображення значка інформації. Також у класі є кілька методів для встановлення тексту в повідомлення. Виклик повідомлення здійснюється успадкованим методом show() батьківського класу Toast, що показано в лістингу класу MainActivity.
- package ru.evileg.customtoast;
- import android.app.Activity;
- import android.app.Application;
- import android.content.Context;
- import android.content.res.Resources;
- import android.view.Gravity;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.widget.ImageView;
- import android.widget.TextView;
- import android.widget.Toast;
- /**
- * Application FinancialAccounting
- * Created by EvILeg on 26.07.2015.
- */
- public class CustomToast extends Toast {
- private static TextView toastText;
- /**
- * Construct an empty Toast object. You must call {@link #setView} before you
- * can call {@link #show}.
- *
- * @param context The context to use. Usually your {@link Application}
- * or {@link Activity} object.
- */
- public CustomToast(Context context) {
- super(context);
- LayoutInflater inflater = (LayoutInflater)
- context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- /*
- * Производится инициализация разметки всплывающего сообщения,
- * устанавливается изображение значка информации в всплывающее сообщение
- */
- View rootView = inflater.inflate(R.layout.toast_info, null);
- ImageView toastImage = (ImageView) rootView.findViewById(R.id.imageView1);
- toastImage.setImageResource(R.mipmap.ic_info);
- toastText = (TextView) rootView.findViewById(R.id.textView1);
- /*
- * Устанавливается инициализированный внешний вид,
- * местоположение всплывающего сообщения на экране устройства,
- * а также длительность существованая сообщения
- */
- this.setView(rootView);
- this.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL, 0, 0);
- this.setDuration(Toast.LENGTH_SHORT);
- }
- /*
- * Метод вызова сообщения без установки длительности существования
- * с передачей сообщению текстовой информации в качестве последовательности
- * текстовых символов или строки
- */
- public static CustomToast makeText(Context context, CharSequence text) {
- CustomToast result = new CustomToast(context);
- toastText.setText(text);
- return result;
- }
- /*
- * Метод вызова сообщения с установкой длительности существования и
- * с передачей сообщению текстовой информации в качестве последовательности
- * текстовых символов или строки
- */
- public static CustomToast makeText(Context context, CharSequence text, int duration) {
- CustomToast result = new CustomToast(context);
- result.setDuration(duration);
- toastText.setText(text);
- return result;
- }
- /*
- * Метод вызова сообщения без установки длительности существования
- * с передачей сообщению ID текстового ресурса
- */
- public static Toast makeText(Context context, int resId)
- throws Resources.NotFoundException {
- return makeText(context, context.getResources().getText(resId));
- }
- /*
- * Метод вызова сообщения с установкой длительности существования и
- * с передачей сообщению ID текстового ресурса
- */
- public static Toast makeText(Context context, int resId, int duration)
- throws Resources.NotFoundException {
- return makeText(context, context.getResources().getText(resId), duration);
- }
- }
Підсумок
Якщо в процесі вивчення матеріалу не виникло жодних проблем та помилок, то після натискання кнопки має з'явитися спливаюче повідомлення наступного вигляду.
Натисніть кнопку, щоб побачити спливаюче повідомлення
А ось і спливаюче повідомлення