你見過這樣的Toast嗎?——Android Toast自定義使用

之前寫過一篇沒時(shí)間解釋了,快使用Snackbar!——Android Snackbar花式使用指南。Toast的自定義使用原理與其類似。

1.Toast源碼分析

老規(guī)矩,我們先去看Toast的源碼。

Toast有兩種顯示布局方式,一種最常見調(diào)用Toast.makeText(),看源碼是這樣寫的

public static Toast makeText(Context context, CharSequence text, @Duration int duration) {
Toast result = new Toast(context);

LayoutInflater inflate = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);
TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);
tv.setText(text);

result.mNextView = v;
result.mDuration = duration;

return result;
}

transient_notification這個(gè)布局文件代碼是這樣的

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="?android:attr/toastFrameBackground">

<TextView
android:id="@android:id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_horizontal"
android:textAppearance="@style/TextAppearance.Toast"
android:textColor="@color/bright_foreground_dark"
android:shadowColor="#BB000000"
android:shadowRadius="2.75"
/>

</LinearLayout>

那么我們想要修改Toast的文字消息樣式,其實(shí)就是修改Toast根布局和message這個(gè)TextView。

Toast的另外一種顯示模式就是自定義布局顯示。這個(gè)方法不調(diào)用Toast.makeText()方法,而是new一個(gè)Toast對(duì)象,然后調(diào)用setView()方法。當(dāng)然自定義布局就不會(huì)加載transient_notification布局了。

2.實(shí)現(xiàn)花式Toast

先給大家看下我封裝的工具類ToastUtil。

import android.content.Context;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

/**
 * Created by 趙晨璞 on 2016/8/11.
 */
public class ToastUtil {

private  Toast toast;
private LinearLayout toastView;

/**
 * 修改原布局的Toast
 */
public ToastUtil() {

}

/**
 * 完全自定義布局Toast
 * @param context
 * @param view
 */
public ToastUtil(Context context, View view,int duration){
    toast=new Toast(context);
    toast.setView(view);
    toast.setDuration(duration);
}

/**
 * 向Toast中添加自定義view
 * @param view
 * @param postion
 * @return
 */
public  ToastUtil addView(View view,int postion) {
    toastView = (LinearLayout) toast.getView();
    toastView.addView(view, postion);

    return this;
}

/**
 * 設(shè)置Toast字體及背景顏色
 * @param messageColor
 * @param backgroundColor
 * @return
 */
public ToastUtil setToastColor(int messageColor, int backgroundColor) {
    View view = toast.getView();
    if(view!=null){
       TextView message=((TextView) view.findViewById(android.R.id.message));
        message.setBackgroundColor(backgroundColor);
        message.setTextColor(messageColor);
    }
    return this;
}

/**
 * 設(shè)置Toast字體及背景
 * @param messageColor
 * @param background
 * @return
 */
public ToastUtil setToastBackground(int messageColor, int background) {
    View view = toast.getView();
    if(view!=null){
        TextView message=((TextView) view.findViewById(android.R.id.message));
        message.setBackgroundResource(background);
        message.setTextColor(messageColor);
    }
    return this;
}

/**
 * 短時(shí)間顯示Toast
 */
public  ToastUtil Short(Context context, CharSequence message){
    if(toast==null||(toastView!=null&&toastView.getChildCount()>1)){
        toast= Toast.makeText(context, message, Toast.LENGTH_SHORT);
        toastView=null;
    }else{
        toast.setText(message);
        toast.setDuration(Toast.LENGTH_SHORT);
    }
    return this;
}

/**
 * 短時(shí)間顯示Toast
 */
public ToastUtil Short(Context context, int message) {
    if(toast==null||(toastView!=null&&toastView.getChildCount()>1)){
        toast= Toast.makeText(context, message, Toast.LENGTH_SHORT);
        toastView=null;
    }else{
        toast.setText(message);
        toast.setDuration(Toast.LENGTH_SHORT);
    }
  return this;
}

/**
 * 長(zhǎng)時(shí)間顯示Toast
 */
public ToastUtil Long(Context context, CharSequence message){
    if(toast==null||(toastView!=null&&toastView.getChildCount()>1)){
        toast= Toast.makeText(context, message, Toast.LENGTH_LONG);
        toastView=null;
    }else{
        toast.setText(message);
        toast.setDuration(Toast.LENGTH_LONG);
    }
    return this;
}

/**
 * 長(zhǎng)時(shí)間顯示Toast
 *
 * @param context
 * @param message
 */
public ToastUtil Long(Context context, int message) {
    if(toast==null||(toastView!=null&&toastView.getChildCount()>1)){
        toast= Toast.makeText(context, message, Toast.LENGTH_LONG);
        toastView=null;
    }else{
        toast.setText(message);
        toast.setDuration(Toast.LENGTH_LONG);
    }
    return this;
}

/**
 * 自定義顯示Toast時(shí)間
 *
 * @param context
 * @param message
 * @param duration
 */
public ToastUtil Indefinite(Context context, CharSequence message, int duration) {
    if(toast==null||(toastView!=null&&toastView.getChildCount()>1)){
        toast= Toast.makeText(context, message,duration);
        toastView=null;
    }else{
        toast.setText(message);
        toast.setDuration(duration);
    }
     return this;
}

/**
 * 自定義顯示Toast時(shí)間
 *
 * @param context
 * @param message
 * @param duration
 */
public ToastUtil Indefinite(Context context, int message, int duration) {
    if(toast==null||(toastView!=null&&toastView.getChildCount()>1)){
        toast= Toast.makeText(context, message,duration);
        toastView=null;
    }else{
        toast.setText(message);
        toast.setDuration(duration);
    }
    return this;
}

/**
 * 顯示Toast
 * @return
 */
public ToastUtil show (){
    toast.show();

    return this;
}

/**
 * 獲取Toast
 * @return
 */
public Toast getToast(){
    return toast;
}
}

修改Toast背景色的使用法方法如下:

ToastUtil toastUtil=new ToastUtil();
toastUtil.Short(MainActivity.this,"自定義message字體、背景色").setToastColor(Color.WHITE, getResources().getColor(R.color.colorAccent)).show();
修改Toast背景色

方形的Toast看上去有些呆板,我自定義了一個(gè)名為toast_radius.xml的背景,代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- 填充的顏色 -->
<solid android:color="#ffc107" />

<!-- android:radius 弧形的半徑 -->
<corners android:radius="20dip" />

</shape>

然后上面設(shè)置背景的代碼改成:

toastUtil.Short(MainActivity.this,"自定義message字體顏色和背景").setToastBackground(Color.WHITE,R.drawable.toast_radius).show();
修改了背景的Toast

雖然官方認(rèn)為Toast和Snackbar都應(yīng)該是短文本的形式,不能包含圖標(biāo),但是個(gè)人感覺加上圖標(biāo)還是挺好玩的...

向Toast中添加圖標(biāo)可以這樣:

 ImageView toastImage = new ImageView(getApplicationContext());
 toastImage.setImageResource(R.mipmap.ic_launcher);
 toastUtil.Short(MainActivity.this,"向Toast添加了一個(gè)ImageView").setToastBackground(Color.WHITE,R.drawable.toast_radius).addView(toastImage,0).show();
添加圖標(biāo)的Toast

如果你想要Toast顯示自定義的布局,可以這樣:

 View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.image,null);
 new ToastUtil(MainActivity.this,view,Toast.LENGTH_SHORT).show();
自定義布局Toast,我的布局文件中只有一個(gè)默認(rèn)圖標(biāo)的ImageView

大家都知道,連續(xù)觸發(fā)Toast的show()方法的時(shí)候,Toast就會(huì)排著隊(duì)連續(xù)展示,感覺上不太友好。所以我先判斷了toast是否沒被創(chuàng)建或者是否被添加了額外的view,如果是的話就重新生成一個(gè)toast對(duì)象;如果否的話就只修改message文字和顯示時(shí)間。

Toast布局修改,不排隊(duì)顯示

我這個(gè)工具類不是完全體,大家再根據(jù)自己項(xiàng)目的具體需求進(jìn)行修改。 []( ̄▽ ̄)*

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,323評(píng)論 25 708
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 47,183評(píng)論 22 665
  • 一下班就忍不住哭了。因?yàn)橐粋€(gè)工作失誤,沒人罵我,我自己先承受不住。有幾個(gè)瞬間,特別想辭職,但想了想年終獎(jiǎng),又想到這...
    皮卡球ca閱讀 334評(píng)論 0 0
  • 恰巧,你在 文/忻君 我是你的新娘 前世的約定 如期赴...
    忻君閱讀 438評(píng)論 2 3
  • 張文質(zhì) 中原名師出書培訓(xùn)。 有的拿出了框架,有的拿出了初稿,有的拿出的是半截稿子。 存在問題: 主題不集中,寫作不...
    風(fēng)和日麗爾閱讀 252評(píng)論 0 0

友情鏈接更多精彩內(nèi)容