Android 偏好。禁用 parent 时设置 child 默认值

Android Preference. Setting child default value when parent is disable

我正在开发简单的 Android 应用程序。我正在使用 C# 和 Xamarin,但我相信编程语言在这种情况下并不重要,因为所有更改都在 .xml 文件中。

好的,所以我的问题与依赖于其他偏好的偏好有关。首先让我展示我的代码,然后我会尝试解释我的问题。

  <PreferenceCategory
  android:title="@string/Pref_battery_settings"
  android:key="pref_key_battery_settings">
<SwitchPreference
    android:title="@string/Pref_battery_track_title"
    android:summary="@string/Pref_battery_track_summary"
    android:key="Pref_battery_track"
    android:defaultValue="true"/>
<CheckBoxPreference
android:dependency="Pref_battery_track"
android:disableDependentsState="true"
android:title="@string/Pref_battery_track_battery_status_title"
android:summary="@string/Pref_battery_track_battery_status_summary"
android:key="Pref_battery_track_status"
android:defaultValue="false"/>

如您所见,我有两个偏好。首先 Pref_battery_trackSwitchPreference,它将确定我的应用程序是否会跟踪电池(电量等)。如果该首选项将设置为 TRUE,用户将能够使用第二首选项,这将决定是否我们想要跟踪电池状态或 nor(状态是例如充电、放电等)。在逻辑思维中,如果我们将第一偏好设置为 true,我们可以决定是否要跟踪更多信息,但现在我遇到了问题。当我将 Pref_battery_track 设置为 true 然后 Pref_battery_track_status 也设置为 true 并将第一偏好切换回 false 第二将仍然是 true 我们将能够执行如下代码:

var prefs = PreferenceManager.GetDefaultSharedPreferences(this);
var t =  prefs.GetBoolean("Pref_battery_track_status", false);

Pref_battery_track_status 为真时,此代码将 return 为真,即使 Pref_battery_track 为假。所以我的问题是:当 parent 偏好为 false 时,有没有办法将 child 偏好设置为默认值?

希望你知道我在问什么。

是的,我知道我可以在使用 child 偏好之前简单地检查一下`

var prefs = PreferenceManager.GetDefaultSharedPreferences(this);
if(prefs.GetBoolean("Pref_battery_track", false))
{
var t = prefs.GetBoolean("Pref_battery_track_status", false);
 // Do things 
}`

但是这个解决方案并不好,因为每次我使用 child 偏好之前我都必须检查 parent。

您可以订阅 SwitchPreferencePreferenceChange 活动,例如:

var switchp = PreferenceScreen.FindPreference("Pref_battery_track");
switchp.PreferenceChange += Switchp_PreferenceChange;

然后在Switchp_PreferenceChange中设置CheckBoxPreferenceChecked属性 例如:

private void Switchp_PreferenceChange(object sender, PreferenceChangeEventArgs e)
{
    var isenabled = (bool)e.NewValue;
    if (!isenabled)
    {
        var checkp = PreferenceScreen.FindPreference("Pref_battery_track_status") as CheckBoxPreference;
        checkp.Checked = false;
    }
}