Практика
Эта статья будет решать два вопрос:
- кастомизация;
- регулирование времени отображения.
<?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


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