安卓toast中用application导致深色模式不生效
时间: 2024-09-19 15:08:58 浏览: 74
Android Application级别自定义Toast
在Android中,Toast是一个用于显示短促消息的小部件,通常用于临时通知用户某些操作的结果。当你在应用程序级别(Application Context)使用Toast时,尤其是在AppCompat主题下,如果开启了系统的深色模式(Dark Mode),默认情况下Toast可能会采用系统当前的主题颜色,这可能不会按照预期显示为深色。
如果你希望在深色模式下Toast显示为白色或者其他指定的颜色,你需要自定义 Toast 的样式。你可以创建一个自定义的 Toast 类,覆盖它的绘制方法(onDraw()),并根据当前的应用主题设置背景和文字颜色。例如:
```java
public class CustomToast extends Toast {
public CustomToast(Context context) {
super(context);
}
public CustomToast(Context context, int resId) {
super(context, resId);
}
public CustomToast(Context context, CharSequence text) {
this(context, R.layout.custom_toast_layout, text);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// 设置 toast 的高度,可以根据需要调整
int size = MeasureSpec.getSize(heightMeasureSpec);
setMeasuredDimension(getWidth(), size);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && AppCompatDelegate.isCompatVectorDrawablesEnabled()) {
Resources.Theme theme = getApplicationContext().getTheme();
TypedArray attrs = theme.obtainStyledAttributes(R.styleable.AppCompatTheme);
int textColorPrimaryInverse = attrs.getColor(R.styleable.AppCompatTheme_textColorPrimaryInverse, ThemeUtils.getColorFromAttrOrRes(this, android.R.attr.textColorPrimaryInverse));
attrs.recycle();
// 设置文本颜色为深色模式下的反向颜色
Paint paint = new Paint();
paint.setColor(textColorPrimaryInverse);
getTextView().setTextPaint(paint);
}
}
}
```
然后在需要的地方使用自定义的 `CustomToast` 而不是默认的 `Toast`:
```java
CustomToast.makeText(context, "这是定制的深色模式 Toast", Toast.LENGTH_SHORT).show();
```
阅读全文