如何在preference.xml窗口中创建单选按钮组?

时间:2011-02-11 08:06:32

标签: android xml checkbox radio-button preferences

我是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组?

4 个答案:

答案 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)

我认为如果你想要的话,这很简单:

  1. 在优先级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...
    
  2. 在首选项类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));
    
  3. 让您的首选项类实现OnPreferenceClickListener,并将OnPreferenceClickListener设置为如下复选框:

    for (CheckBoxPreference cbp : cbp_list) {
    cbp.setOnPreferenceClickListener(this);
    }
    
  4. 然后只需覆盖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}}