Android自定义Toast

自定义Toast

一直以来都没有写博客的习惯,但是喜欢从别人的博客中吸取一些经验教训,但是随着时间的推移,自己慢慢发现东西越来越多,自己的记忆就越来越的不牢靠,所以我会尝试着把自己积累的一些东西,解决的一些问题记录下来,以便不会重蹈覆辙。

Toast应该是每个安卓应用开发者最早接触的一个知识点之一。原生的toast只提供了设置文本,时长,位置的一些简单的操作;实际上我们的需求可能会复杂的多,这时候大家往往会通过setView(View view)的方式来改变吐司里面的内容,之前自己一直也是这么做的,后来一次没事的时候打开了Toast的源码想看看里面到底是什么样子的 ;

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

可以从中发现它加载了一个com.android.internal.R.layout.transient_notification的布局文件,我们点开一看究竟:

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

跟我们设想的差不多,内部是一个Textview,但是发现它的外部容器实际上是一个竖直方向上的LinearLayout,假如我们能够拿到这个容器,我们不就可以动态的往里面添加view里吗,看到这里我赶紧看了一下Toast的方法,果然发现toast.getView()这个方法,经试验完全有效,加入自己的ToastUtil的工具类:

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

    return this;
}

原生的吐司没有提供能够改变文字颜色和背景的方法,现在对我们来说也不什么难事;

/**
 * 设置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));
        view.setBackgroundResource(background);
        message.setTextColor(messageColor);
    }
    return this;
}

这样我们就少了原生带来的很多的不灵活性,自己可以完全随心所欲的定制自己的toast

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值