BatteryStyleView控件调试中。。。
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Sat Dec 27 13:11:18 GMT 2025
|
#Sat Dec 27 13:18:35 GMT 2025
|
||||||
stageCount=38
|
stageCount=38
|
||||||
libraryProject=
|
libraryProject=
|
||||||
baseVersion=15.14
|
baseVersion=15.14
|
||||||
publishVersion=15.14.37
|
publishVersion=15.14.37
|
||||||
buildCount=23
|
buildCount=24
|
||||||
baseBetaVersion=15.14.38
|
baseBetaVersion=15.14.38
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package cc.winboll.studio.powerbell.views;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.res.TypedArray;
|
import android.content.res.TypedArray;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
@@ -17,13 +18,17 @@ import cc.winboll.studio.powerbell.models.BatteryStyle;
|
|||||||
* 电池样式单选视图,水平展示所有BatteryStyle枚举选项
|
* 电池样式单选视图,水平展示所有BatteryStyle枚举选项
|
||||||
* 每个选项 = RadioButton单选按钮 + BatteryDrawable预览控件
|
* 每个选项 = RadioButton单选按钮 + BatteryDrawable预览控件
|
||||||
* 适配API30、Java7规范,联动BatteryDrawable绘制样式
|
* 适配API30、Java7规范,联动BatteryDrawable绘制样式
|
||||||
|
* 新增:SP持久化存储 + 单选互斥修复 + 公共静态方法读取SP枚举值
|
||||||
* @Author 豆包&ZhanGSKen<zhangsken@qq.com>
|
* @Author 豆包&ZhanGSKen<zhangsken@qq.com>
|
||||||
*/
|
*/
|
||||||
public class BatteryStyleView extends LinearLayout implements RadioGroup.OnCheckedChangeListener {
|
public class BatteryStyleView extends LinearLayout implements RadioGroup.OnCheckedChangeListener {
|
||||||
// ====================== 常量区 ======================
|
// ====================== 常量区 (SP相关常量 提升访问修饰符为public static) ======================
|
||||||
public static final String TAG = "BatteryStyleView";
|
public static final String TAG = "BatteryStyleView";
|
||||||
private static final int DEFAULT_BATTERY_COLOR = Color.parseColor("#FF4CAF50");
|
private static final int DEFAULT_BATTERY_COLOR = Color.parseColor("#FF4CAF50");
|
||||||
private static final int DEFAULT_CHECKED_STYLE_INDEX = 0; // 默认选中第一个
|
private static final int DEFAULT_CHECKED_STYLE_INDEX = 0; // 默认选中第一个
|
||||||
|
// SP持久化存储 专属常量【public static 外部可访问】
|
||||||
|
public static final String SP_NAME = "sp_battery_style_config";
|
||||||
|
public static final String SP_KEY_BATTERY_STYLE = "key_selected_battery_style";
|
||||||
|
|
||||||
// ====================== 控件变量 ======================
|
// ====================== 控件变量 ======================
|
||||||
private RadioGroup rgBatteryStyle;
|
private RadioGroup rgBatteryStyle;
|
||||||
@@ -40,25 +45,35 @@ public class BatteryStyleView extends LinearLayout implements RadioGroup.OnCheck
|
|||||||
private OnBatteryStyleSelectedListener mStyleSelectedListener; // 选中回调
|
private OnBatteryStyleSelectedListener mStyleSelectedListener; // 选中回调
|
||||||
private int mBatteryColor = DEFAULT_BATTERY_COLOR; // 预览颜色
|
private int mBatteryColor = DEFAULT_BATTERY_COLOR; // 预览颜色
|
||||||
private int mBatteryValue = 100; // 预览默认电量值
|
private int mBatteryValue = 100; // 预览默认电量值
|
||||||
|
private SharedPreferences mSp;
|
||||||
|
|
||||||
// ====================== 构造方法 ======================
|
// ====================== 构造方法 ======================
|
||||||
public BatteryStyleView(Context context) {
|
public BatteryStyleView(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
|
initSP(context);
|
||||||
initView(context, null);
|
initView(context, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public BatteryStyleView(Context context, AttributeSet attrs) {
|
public BatteryStyleView(Context context, AttributeSet attrs) {
|
||||||
super(context, attrs);
|
super(context, attrs);
|
||||||
|
initSP(context);
|
||||||
initAttrs(context, attrs);
|
initAttrs(context, attrs);
|
||||||
initView(context, attrs);
|
initView(context, attrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
public BatteryStyleView(Context context, AttributeSet attrs, int defStyleAttr) {
|
public BatteryStyleView(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||||
super(context, attrs, defStyleAttr);
|
super(context, attrs, defStyleAttr);
|
||||||
|
initSP(context);
|
||||||
initAttrs(context, attrs);
|
initAttrs(context, attrs);
|
||||||
initView(context, attrs);
|
initView(context, attrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ====================== 初始化SP持久化 ======================
|
||||||
|
private void initSP(Context context) {
|
||||||
|
mSp = context.getSharedPreferences(SP_NAME, Context.MODE_PRIVATE);
|
||||||
|
LogUtils.d(TAG, "【initSP】SharedPreferences初始化完成,文件名称 = " + SP_NAME);
|
||||||
|
}
|
||||||
|
|
||||||
// ====================== 初始化方法 ======================
|
// ====================== 初始化方法 ======================
|
||||||
/**
|
/**
|
||||||
* 解析自定义属性
|
* 解析自定义属性
|
||||||
@@ -69,7 +84,8 @@ public class BatteryStyleView extends LinearLayout implements RadioGroup.OnCheck
|
|||||||
mBatteryColor = typedArray.getColor(R.styleable.BatteryStyleView_batteryPreviewColor, DEFAULT_BATTERY_COLOR);
|
mBatteryColor = typedArray.getColor(R.styleable.BatteryStyleView_batteryPreviewColor, DEFAULT_BATTERY_COLOR);
|
||||||
mBatteryValue = typedArray.getInt(R.styleable.BatteryStyleView_previewBatteryValue, 100);
|
mBatteryValue = typedArray.getInt(R.styleable.BatteryStyleView_previewBatteryValue, 100);
|
||||||
int styleIndex = typedArray.getInt(R.styleable.BatteryStyleView_defaultSelectedStyle, DEFAULT_CHECKED_STYLE_INDEX);
|
int styleIndex = typedArray.getInt(R.styleable.BatteryStyleView_defaultSelectedStyle, DEFAULT_CHECKED_STYLE_INDEX);
|
||||||
mCurrentStyle = styleIndex == 0 ? BatteryStyle.ZEBRA_STYLE : BatteryStyle.ENERGY_STYLE;
|
// 优先读取SP的存储值,无值时才用XML属性默认值
|
||||||
|
mCurrentStyle = getStyleFromSP() == null ? (styleIndex == 0 ? BatteryStyle.ZEBRA_STYLE : BatteryStyle.ENERGY_STYLE) : getStyleFromSP();
|
||||||
typedArray.recycle();
|
typedArray.recycle();
|
||||||
LogUtils.d(TAG, "【initAttrs】解析属性完成 电量颜色=" + Integer.toHexString(mBatteryColor) + " 预览电量=" + mBatteryValue + " 默认样式=" + mCurrentStyle.name());
|
LogUtils.d(TAG, "【initAttrs】解析属性完成 电量颜色=" + Integer.toHexString(mBatteryColor) + " 预览电量=" + mBatteryValue + " 默认样式=" + mCurrentStyle.name());
|
||||||
}
|
}
|
||||||
@@ -91,7 +107,7 @@ public class BatteryStyleView extends LinearLayout implements RadioGroup.OnCheck
|
|||||||
initPreviewDrawable();
|
initPreviewDrawable();
|
||||||
// 设置单选监听
|
// 设置单选监听
|
||||||
rgBatteryStyle.setOnCheckedChangeListener(this);
|
rgBatteryStyle.setOnCheckedChangeListener(this);
|
||||||
// 设置默认选中
|
// 设置默认选中 (修复单选互斥的核心调用)
|
||||||
setDefaultChecked();
|
setDefaultChecked();
|
||||||
LogUtils.d(TAG, "【initView】视图初始化完成");
|
LogUtils.d(TAG, "【initView】视图初始化完成");
|
||||||
}
|
}
|
||||||
@@ -102,12 +118,12 @@ public class BatteryStyleView extends LinearLayout implements RadioGroup.OnCheck
|
|||||||
* ENERGY_STYLE → 对应BatteryDrawable的ENERGY_STYLE
|
* ENERGY_STYLE → 对应BatteryDrawable的ENERGY_STYLE
|
||||||
*/
|
*/
|
||||||
private void initPreviewDrawable() {
|
private void initPreviewDrawable() {
|
||||||
// 条纹样式预览
|
// 条纹样式预览 【保留你手动修改的传参写法】
|
||||||
mZebraDrawable = new BatteryDrawable(mBatteryColor, BatteryStyle.ZEBRA_STYLE);
|
mZebraDrawable = new BatteryDrawable(mBatteryColor, BatteryStyle.ZEBRA_STYLE);
|
||||||
mZebraDrawable.setBatteryValue(mBatteryValue);
|
mZebraDrawable.setBatteryValue(mBatteryValue);
|
||||||
rlZebraPreview.setBackground(mZebraDrawable);
|
rlZebraPreview.setBackground(mZebraDrawable);
|
||||||
|
|
||||||
// 能量样式预览
|
// 能量样式预览 【保留你手动修改的传参写法】
|
||||||
mEnergyDrawable = new BatteryDrawable(mBatteryColor, BatteryStyle.ENERGY_STYLE);
|
mEnergyDrawable = new BatteryDrawable(mBatteryColor, BatteryStyle.ENERGY_STYLE);
|
||||||
mEnergyDrawable.setBatteryValue(mBatteryValue);
|
mEnergyDrawable.setBatteryValue(mBatteryValue);
|
||||||
rlEnergyPreview.setBackground(mEnergyDrawable);
|
rlEnergyPreview.setBackground(mEnergyDrawable);
|
||||||
@@ -115,25 +131,37 @@ public class BatteryStyleView extends LinearLayout implements RadioGroup.OnCheck
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置默认选中项
|
* 修复核心:设置默认选中项 + 强制单选互斥,选中一个必取消另一个
|
||||||
*/
|
*/
|
||||||
private void setDefaultChecked() {
|
private void setDefaultChecked() {
|
||||||
|
// 先全部取消选中,再设置目标选中 → 彻底解决单选互斥失效BUG
|
||||||
|
rbZebraStyle.setChecked(false);
|
||||||
|
rbEnergyStyle.setChecked(false);
|
||||||
if (mCurrentStyle == BatteryStyle.ZEBRA_STYLE) {
|
if (mCurrentStyle == BatteryStyle.ZEBRA_STYLE) {
|
||||||
rbZebraStyle.setChecked(true);
|
rbZebraStyle.setChecked(true);
|
||||||
} else {
|
} else {
|
||||||
rbEnergyStyle.setChecked(true);
|
rbEnergyStyle.setChecked(true);
|
||||||
}
|
}
|
||||||
|
LogUtils.d(TAG, "【setDefaultChecked】默认选中样式 = " + mCurrentStyle.name());
|
||||||
}
|
}
|
||||||
|
|
||||||
// ====================== RadioGroup选中回调 ======================
|
// ====================== RadioGroup选中回调 (核心:新增SP存储+修复单选逻辑) ======================
|
||||||
@Override
|
@Override
|
||||||
public void onCheckedChanged(RadioGroup group, int checkedId) {
|
public void onCheckedChanged(RadioGroup group, int checkedId) {
|
||||||
|
// 先全部取消选中 → 保证单选互斥绝对生效
|
||||||
|
rbZebraStyle.setChecked(false);
|
||||||
|
rbEnergyStyle.setChecked(false);
|
||||||
|
|
||||||
if (checkedId == R.id.rb_zebra_style) {
|
if (checkedId == R.id.rb_zebra_style) {
|
||||||
mCurrentStyle = BatteryStyle.ZEBRA_STYLE;
|
mCurrentStyle = BatteryStyle.ZEBRA_STYLE;
|
||||||
LogUtils.d(TAG, "【onCheckedChanged】选中样式 → " + mCurrentStyle.name());
|
rbZebraStyle.setChecked(true);
|
||||||
|
saveStyle2SP(mCurrentStyle);
|
||||||
|
LogUtils.d(TAG, "【onCheckedChanged】选中样式 → " + mCurrentStyle.name() + ",已存入SP");
|
||||||
} else if (checkedId == R.id.rb_energy_style) {
|
} else if (checkedId == R.id.rb_energy_style) {
|
||||||
mCurrentStyle = BatteryStyle.ENERGY_STYLE;
|
mCurrentStyle = BatteryStyle.ENERGY_STYLE;
|
||||||
LogUtils.d(TAG, "【onCheckedChanged】选中样式 → " + mCurrentStyle.name());
|
rbEnergyStyle.setChecked(true);
|
||||||
|
saveStyle2SP(mCurrentStyle);
|
||||||
|
LogUtils.d(TAG, "【onCheckedChanged】选中样式 → " + mCurrentStyle.name() + ",已存入SP");
|
||||||
}
|
}
|
||||||
// 回调外部监听
|
// 回调外部监听
|
||||||
if (mStyleSelectedListener != null) {
|
if (mStyleSelectedListener != null) {
|
||||||
@@ -141,18 +169,92 @@ public class BatteryStyleView extends LinearLayout implements RadioGroup.OnCheck
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ====================== 对外暴露方法 ======================
|
// ====================== SP持久化 存储+读取 封装方法 ======================
|
||||||
/**
|
/**
|
||||||
* 设置选中的样式
|
* 将选中的样式存入SP持久化存储
|
||||||
|
*/
|
||||||
|
private void saveStyle2SP(BatteryStyle style) {
|
||||||
|
mSp.edit().putString(SP_KEY_BATTERY_STYLE, style.name()).commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从SP读取上次选中的样式
|
||||||
|
* @return 有值返回枚举,无值返回null
|
||||||
|
*/
|
||||||
|
private BatteryStyle getStyleFromSP() {
|
||||||
|
String styleStr = mSp.getString(SP_KEY_BATTERY_STYLE, null);
|
||||||
|
if (styleStr == null) return null;
|
||||||
|
try {
|
||||||
|
return BatteryStyle.valueOf(styleStr);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
LogUtils.e(TAG, "【getStyleFromSP】SP读取样式异常 = " + e.getMessage());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ====================== ✅核心新增✅ 公共静态方法 读取SP存储的枚举值 (外部直接调用) ======================
|
||||||
|
/**
|
||||||
|
* 公共静态方法:读取SP中存储的电池样式枚举值【推荐外部调用】
|
||||||
|
* @param context 上下文
|
||||||
|
* @return 存储的枚举值,无值返回默认值 ZEBRA_STYLE
|
||||||
|
*/
|
||||||
|
public static BatteryStyle getSavedBatteryStyle(Context context) {
|
||||||
|
SharedPreferences sp = context.getSharedPreferences(SP_NAME, Context.MODE_PRIVATE);
|
||||||
|
String styleStr = sp.getString(SP_KEY_BATTERY_STYLE, null);
|
||||||
|
if (styleStr == null) {
|
||||||
|
LogUtils.w(TAG, "【getSavedBatteryStyle】SP无存储值,返回默认样式 ZEBRA_STYLE");
|
||||||
|
return BatteryStyle.ZEBRA_STYLE;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
BatteryStyle style = BatteryStyle.valueOf(styleStr);
|
||||||
|
LogUtils.d(TAG, "【getSavedBatteryStyle】SP读取成功 → " + style.name());
|
||||||
|
return style;
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
LogUtils.e(TAG, "【getSavedBatteryStyle】SP读取异常 = " + e.getMessage() + ",返回默认样式 ZEBRA_STYLE");
|
||||||
|
return BatteryStyle.ZEBRA_STYLE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重载公共静态方法:带默认值的SP读取
|
||||||
|
* @param context 上下文
|
||||||
|
* @param defaultStyle 无存储值时的默认枚举值
|
||||||
|
* @return 存储的枚举值 或 传入的默认值
|
||||||
|
*/
|
||||||
|
public static BatteryStyle getSavedBatteryStyle(Context context, BatteryStyle defaultStyle) {
|
||||||
|
SharedPreferences sp = context.getSharedPreferences(SP_NAME, Context.MODE_PRIVATE);
|
||||||
|
String styleStr = sp.getString(SP_KEY_BATTERY_STYLE, null);
|
||||||
|
if (styleStr == null) {
|
||||||
|
LogUtils.w(TAG, "【getSavedBatteryStyle】SP无存储值,返回自定义默认样式 → " + defaultStyle.name());
|
||||||
|
return defaultStyle;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
BatteryStyle style = BatteryStyle.valueOf(styleStr);
|
||||||
|
LogUtils.d(TAG, "【getSavedBatteryStyle】SP读取成功 → " + style.name());
|
||||||
|
return style;
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
LogUtils.e(TAG, "【getSavedBatteryStyle】SP读取异常 = " + e.getMessage() + ",返回自定义默认样式 → " + defaultStyle.name());
|
||||||
|
return defaultStyle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ====================== 对外暴露方法 (原方法不变+完善逻辑) ======================
|
||||||
|
/**
|
||||||
|
* 设置选中的样式 (新增:同步存入SP+强制单选互斥)
|
||||||
*/
|
*/
|
||||||
public void setSelectedStyle(BatteryStyle style) {
|
public void setSelectedStyle(BatteryStyle style) {
|
||||||
mCurrentStyle = style;
|
mCurrentStyle = style;
|
||||||
|
// 修复核心:先全部取消,再设置选中 → 绝对互斥
|
||||||
|
rbZebraStyle.setChecked(false);
|
||||||
|
rbEnergyStyle.setChecked(false);
|
||||||
|
|
||||||
if (style == BatteryStyle.ZEBRA_STYLE) {
|
if (style == BatteryStyle.ZEBRA_STYLE) {
|
||||||
rbZebraStyle.setChecked(true);
|
rbZebraStyle.setChecked(true);
|
||||||
} else {
|
} else {
|
||||||
rbEnergyStyle.setChecked(true);
|
rbEnergyStyle.setChecked(true);
|
||||||
}
|
}
|
||||||
LogUtils.d(TAG, "【setSelectedStyle】手动设置选中样式 → " + style.name());
|
saveStyle2SP(style);
|
||||||
|
LogUtils.d(TAG, "【setSelectedStyle】手动设置选中样式 → " + style.name() + ",已存入SP");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user