我是Java Android开发的初学者。我正在使用Eclipse SDK 3.6.1版本。我有一个带有两个复选框和一个后退按钮的首选项窗口。
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="PIN requirement">
<CheckBoxPreference
android:title="Use PIN"
android:defaultValue="true"
android:key="checkboxPref" />
<CheckBoxPreference
android:title="Don't use PIN"
android:defaultValue="false"
android:key="checkboxPref2" />
</PreferenceCategory>
<PreferenceCategory>
<Preference
android:title="Back"
android:key="customPref" />
</PreferenceCategory>
</PreferenceScreen>
如何将两个CheckBox更改为RadioButton组?
答案 0 :(得分:32)
如果您只需要启用或禁用PIN,在这种情况下只有一个CheckBoxPreference就足够了(请参阅下面的示例代码,First Category)。当你需要从设置列表中选择一些东西(ListPreference)时,通常会使用RadioButtons - 例如(参见示例代码,Second Category),以选择颜色。
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="First Category">
<CheckBoxPreference
android:title="Using PIN"
android:defaultValue="false"
android:key="checkboxPref"
android:summaryOn="Disable PIN"
android:summaryOff="Enable PIN"/>
</PreferenceCategory>
<PreferenceCategory
android:title="Second Category">
<ListPreference
android:title="Pick your favourite color"
android:key="listPref"
android:defaultValue="4"
android:entries="@array/listArray"
android:entryValues="@array/listValues" />
</PreferenceCategory>
</PreferenceScreen>
此示例的源代码为:
public class PreferencesHelpExample extends PreferenceActivity implements OnSharedPreferenceChangeListener {
public static final String KEY_LIST_PREFERENCE = "listPref";
private ListPreference mListPreference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
// Get a reference to the preferences
mListPreference = (ListPreference)getPreferenceScreen().findPreference(KEY_LIST_PREFERENCE);
}
@Override
protected void onResume() {
super.onResume();
// Setup the initial values
mListPreference.setSummary("Current value is " + mListPreference.getEntry().toString());
// Set up a listener whenever a key changes
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onPause() {
super.onPause();
// Unregister the listener whenever a key changes
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
// Set new summary, when a preference value changes
if (key.equals(KEY_LIST_PREFERENCE)) {
mListPreference.setSummary("Current value is " + mListPreference.getEntry().toString());
}
}
}
对于ListPreference,您还需要一个arrays.xml文件,该文件位于“values”文件夹中:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="listArray">
<item>red</item>
<item>orange</item>
<item>yellow</item>
<item>green</item>
<item>blue</item>
<item>violet</item>
</string-array>
<string-array name="listValues">
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>
<item>6</item>
</string-array>
</resources>
另见一些很好的例子,使用PreferenceActivity - 他们帮助了我很多:
Android Preferences;
How to create a group of RadioButtons instead of a list;
How to display the current value of an Android Preference in the Preference summary?
答案 1 :(得分:11)
在某些情况下,让首选项表现为单选按钮是一个很好的功能,例如在每个选项下包含摘要文本的简单方法。
使一组复选框的行为类似于一组单选按钮非常简单。要在“首选项”中执行此操作,请将组中的所有复选框注册到相同的OnPreferenceChangeListener,然后在此侦听器中使用findPreference()查找其他复选框并调用setChecked(false);
public boolean onPreferenceChange(Preference preference, Object newValue) {
String key = preference.getKey();
if (key.equals("checkboxPref")) {
//Reset other items
CheckBoxPreference p = (CheckBoxPreference)findPreference("checkboxPref2");
p.setChecked(false);
}
else if (key.equals("checkboxPref2")) {
//Reset other items
CheckBoxPreference p = (CheckBoxPreference)findPreference("checkboxPref");
p.setChecked(false);
}
//Force the current focused checkbox to always stay checked when pressed
//i.e confirms value when newValue is checked (true) and discards newValue
//when newValue is unchecked (false)
return (Boolean)newValue;
}
唯一的缺点是复选框看起来不像单选按钮......
答案 2 :(得分:3)
我认为如果你想要的话,这很简单:
在优先级xml中添加复选框,如下所示:
<CheckBoxPreference
android:key="prefkey_cbp_1"
android:summary="@string/prefkey_cbp_1"
android:title="@string/prefkey_cbp_1"
android:defaultValue="false" />
<CheckBoxPreference
android:key="prefkey_cbp_2"
android:summary="@string/prefkey_cbp_2"
android:title="@string/prefkey_cbp_2"
android:defaultValue="false" />
//etc...
在首选项类onCreate上构建一个CheckBoxPreference数组或列表或任何你喜欢的内容,如:
ArrayList<CheckBoxPreference> cbp_list = new ArrayList<CheckBoxPreference>();
cbp_list.add((CheckBoxPreference) getPreferenceManager()
.findPreference(PreferencesProtocol.prefkey_cbp_1));
cbp_list.add((CheckBoxPreference) getPreferenceManager()
.findPreference(PreferencesProtocol.prefkey_cbp_2));
让您的首选项类实现OnPreferenceClickListener,并将OnPreferenceClickListener设置为如下复选框:
for (CheckBoxPreference cbp : cbp_list) {
cbp.setOnPreferenceClickListener(this);
}
然后只需覆盖onPreferenceClick并处理任何点击。例如,如果您希望复选框执行类似单选按钮(在同一个放射组中),意思是,当时只需要检查一个复选框,请执行以下操作:
@Override
public boolean onPreferenceClick(Preference arg0) {
for (CheckBoxPreference cbp : cbp_list) {
if (!cbp.getKey().equals(arg0.getKey()) && cbp.isChecked()) {
cbp.setChecked(false);
}
}
return false;
}
答案 3 :(得分:0)
试试这个:
{{1}}