android 7.1 toast crash问题 BadTokenException,和解决方式

具体问题可以查看 https://www.jianshu.com/p/ccfc5fa3130c

说一下我得解决方式

当 Build.VERSION.SDK_INT == Build.VERSION_CODES.N_MR1时自定义一个toast

然后通过反射,替换并代理handler,添加try catch保护 

try {
    if (sTnField == null) {
        sTnField = Toast.class.getDeclaredField("mTN");
        sTnField.setAccessible(true);
    }
    // get mTN instance in Toast
    Object mTN = sTnField.get(this);

    if (mTN != null && sTnHandlerField == null) {
        sTnHandlerField = mTN.getClass().getDeclaredField("mHandler");
        sTnHandlerField.setAccessible(true);
    }
    // get mHandler member in Toast$TN
    if (sTnHandlerField != null) {
        Handler mHandler = (Handler) sTnHandlerField.get(mTN);
        // replace mHandler to our wrapped HackyHandler
        sTnHandlerField.set(mTN, new HackyHandler(mHandler));
    }
} catch (Exception e) {
    ExceptionUtils.printStackTrace(e);
}

并可以自己重写maketext

 

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

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final Resources resources = context.getResources();

    View v = inflater.inflate(resources.getIdentifier("transient_notification", "layout", "android")  /*com.android.internal.R.layout.transient_notification*/, null);
           
    TextView tv = (TextView) v.findViewById(resources.getIdentifier("message", "id", "android")  /*com.android.internal.R.layout.transient_notification*/, null);
           
    tv.setText(text);
    result.setView(v);
    result.setDuration(duration);

    return result;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
toast 展示的内容过多时,可以通过设置 Toast 的显示时长和位置,以及使用自定义的 Toast 布局来解决省略号的问题。 1. 设置 Toast 的显示时长和位置 可以通过Toast类的 setDuration() 方法来设置 Toast 的展示时长,如下所示: ``` Toast toast = Toast.makeText(context, message, Toast.LENGTH_LONG); toast.setDuration(5000); // 5秒钟 ``` 可以将 duration 设置为一个较长的时间,来确保用户足够的时间看清楚 Toast 显示的内容。 另外,当 Toast 显示的内容过多时,可以通过 setGravity() 方法来设置 Toast 的显示位置,如下所示: ``` toast.setGravity(Gravity.CENTER, 0, 0); ``` 上述代码会将 Toast 居中显示。通过调整 setGravity() 方法的参数,可以将 Toast 显示在其他位置。 2. 使用自定义的 Toast 布局 可以通过 LayoutInflater 类来加载自定义的 Toast 布局,并在其中显示需要展示的内容。自定义布局可以是一个 XML 文件,也可以是一个 View 对象。 以下是一个使用自定义布局的例子: ``` LayoutInflater inflater = getLayoutInflater(); View layout = inflater.inflate(R.layout.custom_toast, (ViewGroup) findViewById(R.id.custom_toast_layout)); TextView text = (TextView) layout.findViewById(R.id.text); text.setText("需要显示的内容"); Toast toast = new Toast(getApplicationContext()); toast.setDuration(Toast.LENGTH_LONG); toast.setView(layout); toast.show(); ``` 在上述代码中,我们使用自定义布局 custom_toast.xml,并在其中添加一个 TextView 来显示需要展示的内容。然后,我们将该布局设置为 Toast 的 View,以此来展示自定义的 Toast。 通过使用自定义的 Toast 布局,我们可以自由地控制 Toast 的样式和显示内容,从而更好地展示需要展示的内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值