先上效果图:
再上代码:
public class ImageToast {
/**
* @author spare_H
* @param msg 显示的内容
* @param resId 显示的图片资源的id
* @param which 显示方式 1.添加一个TextView和一个ImageView 2.只添加一个TextView
*/
public static void ShowToastwithImage(Context context, String msg,
int resId, int which) {
Toast toast = new Toast(context);
TextView mTextView = new TextView(context);
// 设置“背景布局”
LinearLayout mLinearLayout = new LinearLayout(context);
mLinearLayout.setBackgroundResource(R.drawable.toast_frame);//toast_frame就是系统的toast的背景图片
if (which == 1) {
mLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
ImageView mImageView = new ImageView(context);
mImageView.setImageResource(resId);
mLinearLayout.addView(mImageView);
mTextView.setText("\n"+msg);//换行为了模拟文字居中
} else if (which == 2) {
mTextView.setText(msg);
mTextView.setGravity(Gravity.CENTER_VERTICAL);//设置文字居中
mTextView.setCompoundDrawablesWithIntrinsicBounds(resId, 0, 0, 0);
}
mLinearLayout.addView(mTextView);
toast.setView(mLinearLayout);
toast.setDuration(Toast.LENGTH_LONG);
toast.show();
}
}
方式一有点糊弄人的感觉,文字居中效果是假的;方式二比较不错,一个Textview搞定。如果是在Service中调用的话,可以用Context mContext = (Context) getBaseContext();得到context。
系统Toast的布局文件如下(transient_notification.xml)
看到这个,估计就都明白Toast的布局可以很容易自定义了。<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/toast_layout_root" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@drawable/toast_frame"> <TextView android:id="@android:id/message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:textAppearance="@style/TextAppearance.Small" android:textColor="@color/bright_foreground_dark" android:shadowColor="#BB000000" android:shadowRadius="2.75" /> </LinearLayout>
关于控制Toast显示时间,网上一位兄弟给出了方法,就是使用Timer和TimerTask
,未能找到原始出处,代码如下:
private Toast toast = null;
private class IntroButtonListener implements OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
toast = Toast.makeText(StartPage.this, toastText,Toast.LENGTH_LONG);
initToast();
execToast();
}
}
private void execToast(){
Timer timer = new Timer();
timer.schedule(new TimerTask(){
@Override
public void run() {
// TODO Auto-generated method stub
initToast();
}
}, 30);
}
private void initToast(){
toast.show();
}
文中解释如下:
在这里将Toast的示例化延迟到了触发事件是再响应,然后调用的是makeText()方法,给它设置Duration的值为Toast.LENGTH_LONG,然后将toast.show()用一个方法initToast()包起来,这么做的目的是让它显示在Timer中也会接着显示Toast。
这么做的逻辑是,首先先显示Toast,然后让Timer帮助再次显示Toast,这样就会出现了Toast长时间显示的效果,如果想让时间变得更长,可以修改Timer里面timer.schedule()的值,这里设置的是30。