Всегда есть возможность создать собственный макет.Был один факт, который мне не понравился: он нарушает пользовательский интерфейс системы по умолчанию.Это может отличаться на разных платформах и реализациях.Нет простого способа использовать системный ресурс по умолчанию, поэтому я решил взломать тост и вставить в него изображение.
Подсказка : Вы можете получить ресурс по умолчанию, например:
Toast.makeToast(context, "", 0).getView().getBackground()
Вот помощник, который будет отображать изображение перед тост-сообщением: Helper.makeImageToast(context, R.drawable.my_image, "Toast with image", Toast.LENGTH_SHORT).show()
Я использую это, чтобы указать успех, информацию или ошибку.Делает тост информацию более приятной и выразительной ...
(Стоит отметить, что взлом основан на том факте, что внутренний тост использует LinearLayout
, поэтому не зависит от системы и реализации. См. Комментарии.)
public static Toast makeImageToast(Context context, int imageResId, CharSequence text, int length) {
Toast toast = Toast.makeText(context, text, length);
View rootView = toast.getView();
LinearLayout linearLayout = null;
View messageTextView = null;
// check (expected) toast layout
if (rootView instanceof LinearLayout) {
linearLayout = (LinearLayout) rootView;
if (linearLayout.getChildCount() == 1) {
View child = linearLayout.getChildAt(0);
if (child instanceof TextView) {
messageTextView = (TextView) child;
}
}
}
// cancel modification because toast layout is not what we expected
if (linearLayout == null || messageTextView == null) {
return toast;
}
ViewGroup.LayoutParams textParams = messageTextView.getLayoutParams();
((LinearLayout.LayoutParams) textParams).gravity = Gravity.CENTER_VERTICAL;
// convert dip dimension
float density = context.getResources().getDisplayMetrics().density;
int imageSize = (int) (density * 25 + 0.5f);
int imageMargin = (int) (density * 15 + 0.5f);
// setup image view layout parameters
LinearLayout.LayoutParams imageParams = new LinearLayout.LayoutParams(imageSize, imageSize);
imageParams.setMargins(0, 0, imageMargin, 0);
imageParams.gravity = Gravity.CENTER_VERTICAL;
// setup image view
ImageView imageView = new ImageView(context);
imageView.setImageResource(imageResId);
imageView.setLayoutParams(imageParams);
// modify root layout
linearLayout.setOrientation(LinearLayout.HORIZONTAL);
linearLayout.addView(imageView, 0);
return toast;
}