Android浏览器搜索引擎设置重启后全勾选显示异常如何解决
问题根因
你遇到的问题本质是页面首次加载时,勾选图标的显隐逻辑没有覆盖默认布局配置,常见原因有2个:
- 布局XML中所有勾选ImageView的默认
visibility属性设为了VISIBLE,首次加载时如果判断逻辑没有覆盖到所有情况,就会导致所有图标保持默认显示状态 - 读取SharedPreferences时拿到的值和switch里判断的字符串不匹配(比如多了空格、大小写不一致)
修复方案
1. 统一设置勾选图标默认隐藏
在activity_search_engine_settings.xml布局文件中,给所有*_check的ImageView统一添加属性,避免默认全显示:
android:visibility="gone"
用gone比INVISIBLE效果更好,不会占用多余的布局位置。
2. 优化显隐逻辑,增加容错处理
把onCreate里没用的if(true)包裹去掉,替换成下面的逻辑,先全隐藏再单独显示选中项,避免重复冗余代码:
// 先把所有勾选图标统一置为隐藏 google_check.setVisibility(View.GONE); yahoo_check.setVisibility(View.GONE); yandex_check.setVisibility(View.GONE); bing_check.setVisibility(View.GONE); duckduckgo_check.setVisibility(View.GONE); // 单独显示选中的引擎勾选图标 switch (search_engine) { case "Google": google_check.setVisibility(View.VISIBLE); break; case "Yahoo": yahoo_check.setVisibility(View.VISIBLE); break; case "Yandex": yandex_check.setVisibility(View.VISIBLE); break; case "Bing": bing_check.setVisibility(View.VISIBLE); break; case "DuckDuckGo": duckduckgo_check.setVisibility(View.VISIBLE); break; // 增加容错分支:如果读取到的值不匹配,默认选中Google default: google_check.setVisibility(View.VISIBLE); search_engine = "Google"; save_engine(); break; }
如果担心存储的字符串存在多余空格,可以在读取SharedPreferences的时候加trim处理:
search_engine = sharedPreferences.getString(SEARCH_ENGINE, "Google").trim();
3. 优化选择交互,避免重启Activity
你现在用的refresh()销毁重建Activity的方式体验很差,直接抽一个UI更新方法即可:
// 删掉原来的refresh()方法,新增更新UI的方法 private void updateCheckUI() { // 先全隐藏 google_check.setVisibility(View.GONE); yahoo_check.setVisibility(View.GONE); yandex_check.setVisibility(View.GONE); bing_check.setVisibility(View.GONE); duckduckgo_check.setVisibility(View.GONE); // 显示选中项 switch (search_engine) { case "Google": google_check.setVisibility(View.VISIBLE); break; case "Yahoo": yahoo_check.setVisibility(View.VISIBLE); break; case "Yandex": yandex_check.setVisibility(View.VISIBLE); break; case "Bing": bing_check.setVisibility(View.VISIBLE); break; case "DuckDuckGo": duckduckgo_check.setVisibility(View.VISIBLE); break; } Toast.makeText(this, search_engine, Toast.LENGTH_SHORT).show(); }
然后把所有搜索引擎点击事件里的refresh()替换成updateCheckUI()即可,比如Google的点击事件修改为:
google_button.setOnClickListener(v -> { search_engine = "Google"; save_engine(); updateCheckUI(); });
内容的提问来源于stack exchange,提问作者user15084425
相关产品推荐
相关产品推荐

