前言
前面介绍过Android静态换肤日夜模式的切换(原文:《Android静态换肤-日夜主题切换之继承Activity记录 》),从中我们知道,Toast和Dialog存在无法切换成功。原因是Toast或者Dialog是需要时才去初始化的,此时换肤插件没法获取到View。
PS:日夜模式不存在这个问题,当时记错了,应该动态换肤才有这个问题。因为Android本身就对日夜模式进行了优化,主动会重新获取对应模式下的资源。
本文就不删除了,作为自己的过程。
解决这个问题其实有两种方式
- 弹出Toast或Dialog时显示前通过换肤插件SkinManager获取当前皮肤的背景和颜色资源
- 提前初始化Toast和Dialog的布局即可
第一个方式就是我们在需要时重新设置;对于第二种方式,就是提前加载布局,让换肤lib获取到对应的View,这样就会自动切换。
今天就简单记录一下第二种,方便自己查阅。
正文
直入正题。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Toast和Dialog提前初始化Layout
ToastUtils.getInstance().initLayout(SkinApp.getContext());
DialogUtils.getInstance().initLayout(SkinApp.getContext());
}
Toast
也就是Toast的简单封装。
Toast.java
public class ToastUtils {
private Toast mToast = null;
private View mRootView = null;
private Context mContext;
private ToastUtils() {
}
private static class ToastHolder {
@SuppressLint("StaticFieldLeak")
static ToastUtils toastUtils = new ToastUtils();
}
public static ToastUtils getInstance() {
return ToastHolder.toastUtils;
}
@SuppressLint("InflateParams")
public void initLayout(Context context) {
mContext = context;
mRootView = LayoutInflater.from(context).inflate(R.layout.toast_tips_layout, null);
}
public void show(int gravity, int xOffset, int yOffset, int duration, String message) {
if (null == mContext || null == mRootView) {
throw new RuntimeException("Please call initLayout() first.");
}
hide(); //确保只有一个
mToast = new Toast(mContext);
mToast.setView(mRootView);
mToast.setGravity(gravity, xOffset, yOffset);
((TextView) mRootView.findViewById(R.id.toast_tv_tip_text)).setText(message);
mToast.setDuration(duration);
mToast.show();
}
public void hide() {
if (null != mToast) {
mToast.cancel();
mToast = null;
}
}
public void release() {
hide();
mRootView = null;
mContext = null;
}
}
Dialog
跟Toast差不多
styles.xml
<style name="dialog_theme" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:background">@android:color/transparent</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:backgroundDimAmount">0.5</item>
</style>
DialogUtils.java
public class DialogUtils {
private static Dialog mDialog = null;
private View mRootView = null;
private DialogUtils() {
}
private static class DialogHolder {
@SuppressLint("StaticFieldLeak")
static DialogUtils dialogUtils = new DialogUtils();
}
public static DialogUtils getInstance() {
return DialogHolder.dialogUtils;
}
@SuppressLint("InflateParams")
public void initLayout(Context context) {
mRootView = LayoutInflater.from(context).inflate(R.layout.dialog_tips_layout, null);
mDialog = new Dialog(context, R.style.dialog_theme);
}
public void show(int gravity, int width, int height, boolean cancel, String message) {
if (null == mDialog || null == mRootView) {
throw new RuntimeException("Please call initLayout() first.");
}
((TextView) mRootView.findViewById(R.id.dialog_tv_tip_text)).setText(message);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(width, height);
mDialog.setContentView(mRootView, layoutParams);
mDialog.setCanceledOnTouchOutside(cancel);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
} else {
mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_PHONE);
}
mDialog.getWindow().setGravity(gravity);
mDialog.show();
}
public void hide() {
if (null != mDialog) {
mDialog.dismiss();
}
}
public boolean isShowing() {
if (null != mDialog) {
return mDialog.isShowing();
}
return false;
}
public void release() {
hide();
mDialog = null;
mRootView = null;
}
}
参考文章
暂无评论...
随机推荐
铁凝:幸福就在此刻
去探望一位生病的友人,聊起很多从前的事情,计划很多未来的事情,她忽然发问:对于你来说,幸福的时刻是什么?想了半天,竟然没有一个很适合的答案。那阵子,经常携带这个难题去和人打交道,不管是新朋还是故友,聊到酣畅总是抛出这个问题冷场,当然,收获的答案也是五花八门——有人说,幸福的时刻就是加官晋爵时买房...
个人常用的ListView方法简介
前言项目中ListView还是比较常用的,ListView有些方法或者配置属性都是比较常用也比较容易忘记的。因此,今天抽空整(抄)理(袭)一下,以便查阅。PS: 现在RecyclerView比较多了好记性不如烂笔头正文停止滚动 private void stopListView...
中文汉字和英文数字的unicode编码范围
前言最近有做相关汉字转拼音处理,因此了解一下,摘抄于此,方便查阅。好记性不如烂笔头正文虽然不常用,了解一下。基本汉字有20902字。相关汉字编码介绍GB2312编码1981年5月1日发布的简体中文汉字编码国家标准。GB2312对汉字采用双字节编码,收录7445个图形字符,其中包括...
周作人:苦雨
伏园兄:北京近日多雨,你在长安道上不知也遇到否,想必能增你旅行的许多佳趣。雨中旅行不一定是很愉快的,我以前在杭沪车上时常遇雨,每感困难,所以我于火车的雨不能感到什么兴味,但卧在乌篷船里,静听打篷的雨声,加上欸乃的橹声以及“靠塘来,靠下去”的呼声,却是一种梦似的诗境。倘若更大胆一点,仰卧在脚划小船内...
SharedPreferences数据存储介绍
前言Android中的SharedPreferences经常使用,这里就对着存储的数据类型进行简单的记录,方便自己回顾。正文进入SharedPreferences.java看一下主要的方法。写入方法常用的写入数据的方法如下Editor putStringSet(String key, ...
apache开启gzip压缩
我的买的是阿里云的服务器,或许不同服务商的路径不同,所以我的路径仅供参考。/alidata/server/httpd/conf/httpd.confA.开启模块:LoadModule deflate_module modules/mod_deflate.soLoadModule h...