Evgenii Legotckoi
26 липня 2015 р. 20:12

Toast - спливаюче повідомлення про налаштування на Android

Даєш кастомізацію всієї програми під ОС Android!

З таким гаслом хочеться розповісти сьогодні про кастомізацію спливаючого повідомлення (Toast) в ОС Android. У будь-якому додатку, який проектується і розробляється з особливою ретельністю, може постати питання кастомізації навіть такого елемента, як спливаюче повідомлення. Адже успіх додатків залежить не тільки від ідеї та корисності, але також і від реалізації зовнішнього вигляду деталей, навіть найдрібніших і, здавалося б, не дуже важливих. Що вже говорити про програми з вирвиглазним дизайном.

Структура проекта

У цьому уроці пропонується написати програму, яка виводитиме на екран кастомізоване спливаюче повідомлення натисканням кнопки, яка не піддаватиметься кастомізації.

У Проекті є два класи:

  1. Основна діяльність
  2. MyListAdapter – який відповідає за передачу даних у форму елемента списку

Також у проекті присутні такі файли ресурсів:

  1. діяльність_main.xml
  2. toast_info.xml - розмітка спливаючого повідомлення
  3. toast_border:xml - додаткова розмітка для background`а спливаючого повідомлення
  4. ic_info.png -зображення інформаційного значка, який буде застосовуватися у спливаючому повідомленні
  5. string.xml – файл рядкових констант

Формування розмітки програми

діяльність_main.xml

Розмітка основної активіті, звідки буде викликати спливаюче повідомлення

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:paddingLeft="@dimen/activity_horizontal_margin"
  5. android:paddingRight="@dimen/activity_horizontal_margin"
  6. android:paddingTop="@dimen/activity_vertical_margin"
  7. android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
  8. android:background="#ffffff"
  9. android:orientation="vertical">
  10.  
  11. <TextView android:text="@string/check_toast"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:textSize="30sp"/>
  15.  
  16. <Button
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. android:text="@string/push_me"
  20. android:id="@+id/button"
  21. android:layout_gravity="center_horizontal"
  22. android:textSize="30sp"/>
  23.  
  24. </LinearLayout>

тост \ _info.xml

Файл розмітки спливаючого повідомлення. У цьому файлі визначається верстка двох елементів:

  • ImageView - до якого буде поміщено зображення інформаційного значка;
  • TextView - елемент, який буде поміщатися текст повідомлення.
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="240dp"
  4. android:layout_height="wrap_content"
  5. android:orientation="horizontal"
  6. android:padding="8dp"
  7. android:layout_gravity="center_horizontal"
  8. android:background="@drawable/toast_border">
  9.  
  10. <ImageView
  11. android:id="@+id/imageView1"
  12. android:src="@mipmap/ic_info"
  13. android:padding="4dp"
  14. android:layout_width="48dp"
  15. android:layout_height="48dp"
  16. android:layout_marginLeft="8dp"
  17. android:layout_marginRight="8dp"
  18. android:layout_gravity="center_vertical"
  19. android:contentDescription="ToastPicture" />
  20.  
  21. <TextView
  22. android:id="@+id/textView1"
  23. android:layout_width="match_parent"
  24. android:maxWidth="260dp"
  25. android:layout_height="wrap_content"
  26. android:layout_margin="8dp"
  27. android:text="Android Tutorial Custom Toast"
  28. android:textColor="#fff"
  29. android:textSize="24sp"
  30. android:layout_gravity="center_vertical"/>
  31.  
  32. </LinearLayout>

тост_border.xml

XML-файл, в якому налаштовується відображення меж та заокруглення кутів спливаючого повідомлення.

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android">
  3.  
  4. <padding android:left="8dp" android:top="8dp"
  5. android:right="8dp" android:bottom="8dp" />
  6.  
  7. <corners android:radius="10dp" />
  8.  
  9. <solid android:color="#661f1f21"/>
  10. </shape>

Основний клас проекту - MainActivity.java

У цьому класі проводиться запуск основної активіті проекту, з якої буде викликатися кастомізований Toast. Проект створювався в Android Studio відразу з готової активіті (Blank Activity Project).

У цьому класі імплементується метод OnClickListener і його перевизначення @Override. У цьому методі і відбувається виклик спливаючого повідомлення, причому одним рядком.

  1. package ru.evileg.customtoast;
  2.  
  3. import android.support.v7.app.ActionBarActivity;
  4. import android.os.Bundle;
  5. import android.view.Menu;
  6. import android.view.MenuItem;
  7. import android.view.View;
  8. import android.widget.Button;
  9.  
  10.  
  11. public class MainActivity extends ActionBarActivity implements View.OnClickListener {
  12.  
  13. private static Button button;
  14.  
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_main);
  19.  
  20. /*
  21. * Инициализация кнопки, по нажатию на которую будет вызываться
  22. * всплывающее сообщение
  23. */
  24. button = (Button) this.findViewById(R.id.button);
  25. button.setOnClickListener(this);
  26. }
  27.  
  28. @Override
  29. public boolean onCreateOptionsMenu(Menu menu) {
  30. // Inflate the menu; this adds items to the action bar if it is present.
  31. getMenuInflater().inflate(R.menu.menu_main, menu);
  32. return true;
  33. }
  34.  
  35. @Override
  36. public boolean onOptionsItemSelected(MenuItem item) {
  37. // Handle action bar item clicks here. The action bar will
  38. // automatically handle clicks on the Home/Up button, so long
  39. // as you specify a parent activity in AndroidManifest.xml.
  40. int id = item.getItemId();
  41.  
  42. //noinspection SimplifiableIfStatement
  43. if (id == R.id.action_settings) {
  44. return true;
  45. }
  46.  
  47. return super.onOptionsItemSelected(item);
  48. }
  49.  
  50. @Override
  51. public void onClick(View v) {
  52. /*
  53. * Вызов всплывающего сообщения
  54. */
  55. CustomToast.makeText(this, R.string.toast_message).show();
  56. }
  57. }

Клас CustomToast.java

Цей клас служить на формування кастомизированного повідомлення. Суть кастомізації Toast у цьому уроці зводиться до успадкування існуючого класу Toast, з наступною ініціалізацією власної розмітки спливаючого повідомлення та встановлення зображення значка інформації. Також у класі є кілька методів для встановлення тексту в повідомлення. Виклик повідомлення здійснюється успадкованим методом show() батьківського класу Toast, що показано в лістингу класу MainActivity.

  1. package ru.evileg.customtoast;
  2.  
  3. import android.app.Activity;
  4. import android.app.Application;
  5. import android.content.Context;
  6. import android.content.res.Resources;
  7. import android.view.Gravity;
  8. import android.view.LayoutInflater;
  9. import android.view.View;
  10. import android.widget.ImageView;
  11. import android.widget.TextView;
  12. import android.widget.Toast;
  13.  
  14. /**
  15. * Application FinancialAccounting
  16. * Created by EvILeg on 26.07.2015.
  17. */
  18. public class CustomToast extends Toast {
  19.  
  20. private static TextView toastText;
  21. /**
  22. * Construct an empty Toast object. You must call {@link #setView} before you
  23. * can call {@link #show}.
  24. *
  25. * @param context The context to use. Usually your {@link Application}
  26. * or {@link Activity} object.
  27. */
  28. public CustomToast(Context context) {
  29. super(context);
  30.  
  31. LayoutInflater inflater = (LayoutInflater)
  32. context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  33.  
  34. /*
  35. * Производится инициализация разметки всплывающего сообщения,
  36. * устанавливается изображение значка информации в всплывающее сообщение
  37. */
  38. View rootView = inflater.inflate(R.layout.toast_info, null);
  39. ImageView toastImage = (ImageView) rootView.findViewById(R.id.imageView1);
  40. toastImage.setImageResource(R.mipmap.ic_info);
  41. toastText = (TextView) rootView.findViewById(R.id.textView1);
  42.  
  43. /*
  44. * Устанавливается инициализированный внешний вид,
  45. * местоположение всплывающего сообщения на экране устройства,
  46. * а также длительность существованая сообщения
  47. */
  48. this.setView(rootView);
  49. this.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL, 0, 0);
  50. this.setDuration(Toast.LENGTH_SHORT);
  51. }
  52.  
  53. /*
  54. * Метод вызова сообщения без установки длительности существования
  55. * с передачей сообщению текстовой информации в качестве последовательности
  56. * текстовых символов или строки
  57. */
  58. public static CustomToast makeText(Context context, CharSequence text) {
  59. CustomToast result = new CustomToast(context);
  60. toastText.setText(text);
  61.  
  62. return result;
  63. }
  64.  
  65. /*
  66. * Метод вызова сообщения с установкой длительности существования и
  67. * с передачей сообщению текстовой информации в качестве последовательности
  68. * текстовых символов или строки
  69. */
  70. public static CustomToast makeText(Context context, CharSequence text, int duration) {
  71. CustomToast result = new CustomToast(context);
  72. result.setDuration(duration);
  73. toastText.setText(text);
  74.  
  75. return result;
  76. }
  77.  
  78. /*
  79. * Метод вызова сообщения без установки длительности существования
  80. * с передачей сообщению ID текстового ресурса
  81. */
  82. public static Toast makeText(Context context, int resId)
  83. throws Resources.NotFoundException {
  84. return makeText(context, context.getResources().getText(resId));
  85. }
  86.  
  87. /*
  88. * Метод вызова сообщения с установкой длительности существования и
  89. * с передачей сообщению ID текстового ресурса
  90. */
  91. public static Toast makeText(Context context, int resId, int duration)
  92. throws Resources.NotFoundException {
  93. return makeText(context, context.getResources().getText(resId), duration);
  94. }
  95. }

Підсумок

Якщо в процесі вивчення матеріалу не виникло жодних проблем та помилок, то після натискання кнопки має з'явитися спливаюче повідомлення наступного вигляду.

Натисніть кнопку, щоб побачити спливаюче повідомлення

А ось і спливаюче повідомлення

Рекомендовані статті на цю тему

По статті запитували0питання

0

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
  • Останні коментарі
  • Evgenii Legotckoi
    16 квітня 2025 р. 17:08
    Благодарю за отзыв. И вам желаю всяческих успехов!
  • IscanderChe
    12 квітня 2025 р. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    01 квітня 2025 р. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    09 березня 2025 р. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    09 березня 2025 р. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…