安卓复选框偏好设置中的多重依赖性

3
我在偏好设置屏幕上有三个复选框,我希望用户一次只能选择一个复选框。如何实现这个功能呢?
提前感谢您的回答。
4个回答

2

你需要创建一个onPreferenceChangeListener:

prefChangeListener = new Preference.OnPreferenceChangeListener() {

                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue) {
                    if (preference == pref1 && newValue.toString().equals("true")){
                        pref2.setChecked(false);
                        pref3.setChecked(false);
                    }
                    if (preference == pref2 && newValue.toString().equals("true")){
                        pref1.setChecked(false);
                        pref3.setChecked(false);
                    }
                    if (preference == pref3 && newValue.toString().equals("true")){
                        pref1.setChecked(false);
                        pref2.setChecked(false);
                    }
                    return true;    
                }
        };

然后要使用它,
pref1.setOnPreferenceChangeListener(prefChangeListener);
pref2.setOnPreferenceChangeListener(prefChangeListener);
pref3.setOnPreferenceChangeListener(prefChangeListener);

或者,您可以使用ListPreference,它将弹出一个单选组,您只需在其中放置三个选项即可。这就是我在我的应用程序中所做的,但如果需要复选框首选项,则当然也可以使用。

这是我的ListPreference(用于选择响铃时间):

<ListPreference android:persistent="true"
            android:title="Ring Time"
            android:summary="Choose how long the phone will ring when activated"
            android:key="ringTime"
            android:defaultValue="ringNot"
            android:entries="@array/ringTime"
            android:entryValues="@array/ringSetting" />

这是我的 XML 代码,关于 @array/ringTime 和 @array/ringSetting:

 <?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="ringTime">
   <item>Don\'t Ring</item>
   <item>Ring 30 Seconds</item>
   <item>Ring 2 Minutes</item>   
   <item>Ring 5 Minutes</item>
</string-array>
<string-array name="ringSetting">
   <item>ringNot</item>
   <item>ring30Sec</item>
   <item>ring2Min</item>   
   <item>ring5Min</item>
</string-array>

</resources>

我知道这是一个5个月前的问题,但我认为这可能会帮助其他人。:)

然后在我的代码中实现listpreference:

ringTime = pref.getString("ringTime", "ringNot");//ListPreferences are stored as strings
if (ringTime.equals(ring30Sec))
//ring for 30 seconds
else if (ringTime.equals(ring2Min))
//ring for 2 minutes
else if (ringTime.equals(ring5Min))
//ring for 5 minutes
else Toast.makeText(getBaseContext(), "Not Ringing", Toast.LENGTH_LONG).show(); 

1

不幸的是,在偏好设置屏幕上,没有这样的单选按钮偏好可用。我将不得不使用复选框偏好。 - user590849
你能分享一下你偏好屏幕的代码和截图吗?我不明白为什么你不能使用单选按钮组。 - Reno
这是我的代码。<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <CheckBoxPreference android:key="english" android:title="英语" android:defaultValue="true"></CheckBoxPreference> <CheckBoxPreference android:key="german" android:title="德语" android:defaultValue="false"></CheckBoxPreference> <CheckBoxPreference android:key="netherlands" android:title="荷兰语" android:defaultValue="false"></CheckBoxPreference> </PreferenceScreen> - user590849
你应该使用ListPreference 代替 - Reno

0
@SuppressWarnings("deprecation")
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.settings);
    //mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
    mLocationChangedListener = new OnPreferenceChangeListener() {

        @Override
        public boolean onPreferenceChange(Preference preference,
                Object newValue) {
            mChbLocationLastChanged = (CheckBoxPreference) preference;
            return true;
        }

    };
    mLocationClickListener = new Preference.OnPreferenceClickListener() {

        @Override
        public boolean onPreferenceClick(Preference preference) {
            setLocationAccuracy();
            return true;
        }
    };
    mChbLocationHigh = (CheckBoxPreference) findPreference("pref_chb_location_high_accuracy_key");
    mChbLocationHigh.setOnPreferenceChangeListener(mLocationChangedListener);
    mChbLocationHigh.setOnPreferenceClickListener(mLocationClickListener);
    mChbLocationBalanced = (CheckBoxPreference) findPreference("pref_chb_location_balanced_power_key");
    mChbLocationBalanced.setOnPreferenceChangeListener(mLocationChangedListener);
    mChbLocationBalanced
            .setOnPreferenceClickListener(mLocationClickListener);
    mChbLocationLowPower = (CheckBoxPreference) findPreference("pref_chb_location_low_power_key");
    mChbLocationLowPower.setOnPreferenceChangeListener(mLocationChangedListener);
    mChbLocationLowPower
            .setOnPreferenceClickListener(mLocationClickListener);
    mChbLocationNoPower = (CheckBoxPreference) findPreference("pref_chb_location_no_power_key");
    mChbLocationNoPower.setOnPreferenceChangeListener(mLocationChangedListener);
    mChbLocationNoPower
            .setOnPreferenceClickListener(mLocationClickListener);
}

private void setLocationAccuracy() {
    boolean isChecked = mChbLocationLastChanged.isChecked();
    String key = mChbLocationLastChanged.getKey();
    if (key.equalsIgnoreCase("pref_chb_location_high_accuracy_key")) {
        mChbLocationBalanced.setChecked(false);
        mChbLocationLowPower.setChecked(false);
        mChbLocationNoPower.setChecked(false);
    } else if (key.equalsIgnoreCase("pref_chb_location_balanced_power_key")) {
        mChbLocationHigh.setChecked(false);
        mChbLocationLowPower.setChecked(false);
        mChbLocationNoPower.setChecked(false);
    } else if (key.equalsIgnoreCase("pref_chb_location_low_power_key")) {
        mChbLocationHigh.setChecked(false);
        mChbLocationBalanced.setChecked(false);
        mChbLocationNoPower.setChecked(false);
    } else if (key.equalsIgnoreCase("pref_chb_location_no_power_key")) {
        mChbLocationHigh.setChecked(false);
        mChbLocationBalanced.setChecked(false);
        mChbLocationLowPower.setChecked(false);
    }
    if (!mChbLocationLastChanged.isChecked())
        mChbLocationLastChanged.setChecked(true);
}

设置两个监听器:OnPreferenceChangeListener() 和 Preference.OnPreferenceClickListener()。在第一个监听器中,保存已更改的preferenceCheckBox值。从第二个监听器中获取键字符串值和布尔值(如果选中)。比较它们,将其他值设置为false,如果它们都是false,则将最后一个更改为true。这样就永远不会出现未选择的复选框。 - user3091232

0

你如何在偏好设置屏幕上使用单选按钮? - user590849

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接