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_track
是 SwitchPreference
,它将确定我的应用程序是否会跟踪电池(电量等)。如果该首选项将设置为 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。
您可以订阅 SwitchPreference
的 PreferenceChange
活动,例如:
var switchp = PreferenceScreen.FindPreference("Pref_battery_track");
switchp.PreferenceChange += Switchp_PreferenceChange;
然后在Switchp_PreferenceChange
中设置CheckBoxPreference
的Checked
属性 例如:
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;
}
}
我正在开发简单的 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_track
是 SwitchPreference
,它将确定我的应用程序是否会跟踪电池(电量等)。如果该首选项将设置为 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。
您可以订阅 SwitchPreference
的 PreferenceChange
活动,例如:
var switchp = PreferenceScreen.FindPreference("Pref_battery_track");
switchp.PreferenceChange += Switchp_PreferenceChange;
然后在Switchp_PreferenceChange
中设置CheckBoxPreference
的Checked
属性 例如:
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;
}
}