将图像添加到吐司?

问题描述:

是否可以通过编程将图像添加到Toast弹出窗口?将图像添加到吐司?

+5

[尝试看看这里(http://developer.android.com/ guide/topics/ui/notifiers/toasts.html#CustomToastView) – crbin1

+1

@SpK +1这样的好问题 – swiftBoy

,您可以使用的setView()方法,使用这种方法,你可以自定义吐司按照您的要求添加的ImageView或任何视图到Toast通知。

在这里我创建了一个自定义布局文件,将其充气到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(); 
+0

@Blundell [** Here **](http://www.technotalkative.com/android-custom-toast-通知/)是带输出捕捉的详细教程。 –

+0

@PareshMayani::))))..好的答案Bhai .. !!! –

+0

@HareshChaudhary谢谢:) –

您可以编程方式创建任何视图(因为我假设您问的是如何在不使用LayoutInflater的情况下执行此操作)并在您所做的Toast上调用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(); 

总有创建一个自定义布局的可能性。有一个我不喜欢的事实:它打破了系统默认的Toast UI。这可能在不同的平台和实现上有所不同。有没有简单的方法来使用系统默认资源,所以我决定砍掉敬酒,并强制一个图像。

提示:你可以得到这样的默认资源:
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; 
} 
+0

这只有在吐司的布局是'LinearLayout'类型时才有效。没有联系afaik Toast将始终有一个LinearLayout。您的代码通过不添加图像来处理此问题,但值得注意的是,此解决方案不是独立于设备/版本的。 – Graeme

+0

@Graeme你是对的。谢谢你的提示。更好的方法是在自己的LinearLayout中重新创建Toast。当我找到时间时,我会更新我的答案。 – Knickedi

简单地说,使用以下:

Toast toast = new Toast(myContext); 
ImageView view = new ImageView(myContext); 
view.setImageResource(R.drawable.image_icon); 
toast.setView(view); 
toast.show(); 

Knickedi的解决方案是好的,但如果你只需要在文本旁边的图标,你可以利用的事实吐司有一个预先定义的TextView与相同的ID并在TextV上设置图标IEW:

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)); 

我觉得这是更好的,我们表明,我们传递给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();