デフォルトのトーストも保持したかったのですが、すべてのシステムに対して単一のトーストレイアウトを作成する方法を示す解決策を見つけました。そこで、このヘルパーを作成しました。私は知っています、それはハックですが、それは私にとってはうまくいきます。
ここでは、テキストの前のトーストに、本来の外観に触れることなく画像を追加しました。ここでテキストの色とサイズを簡単に変更できます。
多分誰かがこのコードスニペットに興味があるかもしれません...
private static Toast makeImageToast(int imageResId, CharSequence text, int duration) {
Toast toast = Toast.makeText(mContext, text, duration);
View rootView = toast.getView();
LinearLayout linearLayout = null;
TextView 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) {
// failed to create image toast layout, using usual toast
return toast;
}
ViewGroup.LayoutParams textParams = messageTextView.getLayoutParams();
((LinearLayout.LayoutParams) textParams).gravity = Gravity.CENTER_VERTICAL;
// convert dip dimension
int imageSize = dipToPixel(25);
int imageMargin = dipToPixel(15);
// 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(mContext);
imageView.setId(TOAST_IMAGE_ID);
imageView.setImageResource(imageResId);
imageView.setLayoutParams(imageParams);
// modify root layout
linearLayout.setOrientation(LinearLayout.HORIZONTAL);
linearLayout.addView(imageView, 0);
return toast;
}
public static int dipToPixel(float dip) {
return (int) (dip * mContext.getResources().getDisplayMetrics().density + 0.5f);
}