添加图像吐司?
有没有可能以编程方式将图像添加到Toastpopup窗口?
是的 ,您可以使用setView()方法将imageview或任何视图添加到Toast通知中,使用此方法您可以根据需要自定义Toast。
在这里,我已经创build了一个自定义的布局文件被充气到Toast通知中,然后我通过使用setView()方法在Toast通知中使用了这个布局。
cust_toast_layout.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/relativeLayout1" android:background="@android:color/white"> <TextView android:textAppearance="?android:attr/textAppearanceLarge" android:id="@+id/textView1" android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="PM is here" android:gravity="center" android:textColor="@android:color/black"> </TextView> <ImageView android:layout_height="wrap_content" android:layout_width="fill_parent" android:src="@drawable/new_logo" android:layout_below="@+id/textView1" android:layout_margin="5dip" android:id="@+id/imageView1"> </ImageView> <TextView android:id="@+id/textView2" android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="This is the demo of Custom Toast Notification" android:gravity="center" android:layout_below="@+id/imageView1" android:textColor="@android:color/black"> </TextView> </RelativeLayout>
CustomToastDemoActivity.java
LayoutInflater inflater = getLayoutInflater(); View view = inflater.inflate(R.layout.cust_toast_layout, (ViewGroup) findViewById(R.id.relativeLayout1)); Toast toast = new Toast(this); toast.setView(view); toast.show();
简单地说,使用以下内容:
Toast toast = new Toast(myContext); ImageView view = new ImageView(myContext); view.setImageResource(R.drawable.image_icon); toast.setView(view); toast.show();
你可以创build任何视图以编程方式(因为我假设你问如何做到这一点,而不使用LayoutInflater),并在你做的吐司调用setView。
//Create a view here LinearLayout v = new LinearLayout(this); //populate layout with your image and text or whatever you want to put in here Toast toast = new Toast(getApplicationContext()); toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0); toast.setDuration(Toast.LENGTH_LONG); toast.setView(v); toast.show();
Knickedi的解决scheme是好的,但是如果只需要在文本旁边有一个图标,就可以使用Toast具有相同ID的预定义TextView并在TextView上设置图标的事实:
Toast toast = Toast.makeText(context, text, Toast.LENGTH_SHORT); TextView tv = (TextView) toast.getView().findViewById(android.R.id.message); if (null!=tv) { tv.setCompoundDrawablesWithIntrinsicBounds(icon, 0, 0, 0); tv.setCompoundDrawablePadding(context.getResources().getDimensionPixelSize(R.dimen.padding_toast));
总有可能创build一个自定义布局。 有一个我不喜欢的事实:它打破了系统默认的吐司用户界面。 这可能在不同的平台和实现上有所不同。 没有简单的方法来使用系统默认的资源,所以我决定砍掉敬酒,并强制一个图像。
提示 :你可以得到像这样的默认资源:
Toast.makeToast(context, "", 0).getView().getBackground()
这里有一个帮助器,它将在Toast消息前面显示一个图像: Helper.makeImageToast(context, R.drawable.my_image, "Toast with image", Toast.LENGTH_SHORT).show()
我用它来表示成功,信息或错误。 使敬酒信息更好,更有performance力…
(值得一提的是,黑客基于内部使用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; }
我认为这是更好的,我们在图像上显示吐司的文本,我们传递给makeImageToast函数…所以我阴影Knickedi代码和:
public class utility { 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; ((TextView) child).setGravity(Gravity.CENTER); } } } // 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; // 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; // setup image view ImageView imageView = new ImageView(context); imageView.setImageResource(imageResId); imageView.setLayoutParams(imageParams); // modify root layout linearLayout.setOrientation(LinearLayout.HORIZONTAL); linearLayout.setBackgroundResource(imageResId); linearLayout.setGravity(Gravity.CENTER); linearLayout.setHorizontalGravity(Gravity.CENTER); linearLayout.setHorizontalGravity(Gravity.CENTER); //addView(imageView, 0); return toast; }
}
这是它的用途:
utility.makeImageToast(getApplicationContext(), R.drawable.your_image,"your_text",Toast.LENGTH_LONG).show();