Android Toast订制

1.首先,当然是要找到Toast的代码了:

老规矩,framework/base底下

find -name Toast.java

即可。

2.找到Toast界面显示的地方:

真的也是蛮好找的,搜索inflate函数就找到了

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

就在我们很常用的makeText里边。

3.布局文件就是它喽:

com.android.internal.R.layout.transient_notification
同样的,framework/base/core/res/res,find -name就好。然后就随便你怎么改喽。
不过,需要注意的是,添加自己的图片,作为Toast的背景的时候,比如添加一张.9图的时候,你需要在symbol.xml里头添加上你添加的资源,添加方式依葫芦画瓢就可以。

4.附加题

怎么让toast显示默认居中?

我们发现, mGravity变量直接决定了toast的Gravity方式,直接给它赋值?
错错错!!!
rom订制,最好不要修改默认行为!要不然用户(app码农)该骂了:其他手机调用setGravity能改变toast显示的位置,你家手机为啥不行,垃圾!
还好,android官方早就想到了这个需求:

public Toast(Context context) {
        mContext = context;
        mTN = new TN();
        mTN.mY = context.getResources().getDimensionPixelSize(
                com.android.internal.R.dimen.toast_y_offset);
        //说的就是这行
        mTN.mGravity = context.getResources().getInteger(
                com.android.internal.R.integer.config_toastDefaultGravity);
    }
<!-- Default Gravity setting for the system Toast view. Equivalent to: Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM -->
    <integer name="config_toastDefaultGravity">0x00000051</integer>

0x00000051是什么鬼?看注释Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM,哦!恍然大悟的感觉。那Gravity.CENTER是多少?看下定义:

public static final int CENTER = CENTER_VERTICAL|CENTER_HORIZONTAL;
//尼玛!
public static final int CENTER_VERTICAL = AXIS_SPECIFIED<<AXIS_Y_SHIFT;
public static final int CENTER_HORIZONTAL = AXIS_SPECIFIED<<AXIS_X_SHIFT;

我比较懒,写个Demo,断点下,得出Gravity.CENTER int值等于17,那就是0x00000011喽,
填到config.xml里头,准备编译出framework-res.apk,丢进去。

打完收工!去嘘嘘一下,编译实在是慢。

30分钟之后,尼玛,怎么无效?
mtk垃圾!
肯定是编译器出问题了!
不行全编一下!
还是老实打日志吧!发现默认gravity确实改成17了,一万头曹尼玛。

在我决定转行之前,我发现app码农调用setGravity的例子:

toast.setGravity(Gravity.CENTER,0,0);

尼玛,我知道了:

mTN.mY = context.getResources().getDimensionPixelSize(
                com.android.internal.R.dimen.toast_y_offset);

还有个默认值我没注意到。

<dimen name="toast_y_offset">64dip</dimen>

总结:
1.出问题的时候,99%的都是自己的原因,别老赖机器,赖平台,赖别人。
2.除了胆大,还得心细。

猜你喜欢

转载自blog.csdn.net/bberdong/article/details/71082977