среда, 20 февраля 2013 г.

Кастомизация интерфейса: Toast (Часть 1)

Кастомизация интерфейса: Toast (Часть 1)
Сегодня мы поговорим о всплывающих подсказках – Toast. Важным ограничением этого элемента является его время отображения, которое никак не регулируется. В этой статье я покажу как можно выводить Toast с заданным временем.


Практика

Эта статья будет решать два вопрос:

  • кастомизация;
  • регулирование времени отображения.
Кастомизация интерфейса: Toast (Часть 1)

Нам потребуются следующие строковые ресурсы:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">CustomToast</string>
    <string name="placeholder_txt">Введите текст сообщения</string>
    <string name="placeholder_time">Введите время отображения</string>
    <string name="btn_show">Показать</string>
</resources>

Чтобы изменить интерфейс Toast, разработаем новый макет, используя в качестве фона следующее изображение:

Наш Toast будет выглядеть как стандартный, но вы можете оперировать интерфейсом как пожелаете.

Исходный код (layout_toast.xml)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toast_layout_root"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/toast"
    android:orientation="horizontal"
    android:padding="8dp" >

    <TextView
        android:id="@+id/text"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginBottom="5dp"
        android:gravity="center"
        android:padding="8dp"
        android:textColor="#FFF"
        android:textSize="14sp" />

</LinearLayout>

Разработаем новый класс, который будет регулировать время отображения Toast: CustomToast.
private static void show(final long durationInMilliseconds,
   final Toast toast) {
  Thread t = new Thread() {
   long timeElapsed = 0l;

   public void run() {
    try {

     while (timeElapsed <= durationInMilliseconds) {
      long start = System.currentTimeMillis();
      toast.show();
      sleep(250);
      timeElapsed += System.currentTimeMillis() - start;
     }

    } catch (InterruptedException e) {
    }
   }
  };
  t.start();
 }

Также нам потребуется статический метод, который будет создавать Toast с нужным макетом.
private static void showToast(Context context, View view, long duration) {
  Toast toast = new Toast(context);

  toast.setView(view);
  toast.setDuration(Toast.LENGTH_SHORT);

  show(duration * 1000, toast);
 }

Завершающей частью разработки нового класса являются методы, которые будут создавать и отображать кастомизированный Toast с заданным текстом и временем.
В качестве параметров указывается:

  • сообщение (может быть как строка (String), либо идентификатор строкого ресурса (int));
  • время отображения Toast (в секундах).

public static void makeToast(Context context, String msg, long duration) {

  LayoutInflater inflater = (LayoutInflater) context
    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  View view = inflater.inflate(R.layout.layout_toast, null);

  ((TextView) view.findViewById(R.id.text)).setText(msg);

  showToast(context, view, duration);
 }

public static void makeToast(Context context, int msg, long duration) {

  LayoutInflater inflater = (LayoutInflater) context
    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  View view = inflater.inflate(R.layout.layout_toast, null);

  ((TextView) view.findViewById(R.id.text)).setText(msg);

  showToast(context, view, duration);
 }

Теперь разработаем макет для основного окна, чтобы протестировать созданый класс. Интерфейс окна будет состоять из двух полей для ввода (ввод выводимого сообщения и времени отображения) и кнопки для отображения Toast.
Исходный код (main.xml)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/ed_txt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/placeholder_txt" />

    <EditText
        android:id="@+id/ed_time"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/placeholder_time" />

    <Button
        android:id="@+id/btn_show"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/btn_show" />

</LinearLayout>

Исходный код основного Activity
private EditText ed_txt, ed_time;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  
  ed_time = (EditText)findViewById(R.id.ed_time);
  ed_txt = (EditText)findViewById(R.id.ed_txt);
  
  final Context context = this;
  
  findViewById(R.id.btn_show).setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View v) {
    int duration = 1;
    try 
    {
     duration = Integer.parseInt(ed_time.getText().toString());
    } catch (Exception e) {
    }
    CustomToast.makeToast(context, ed_txt.getText().toString(), duration);
   }
  });
 }

Ссылки

  • Исходные коды данного проекта можно скачать отсюда: zip

Комментариев нет:

Отправить комментарий