【问题标题】:How to create RadioButton group in preference.xml window?如何在preference.xml 窗口中创建RadioButton 组?
【发布时间】:2011-06-25 09:46:09
【问题描述】:

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

【问题讨论】:

    标签: android xml checkbox radio-button preferences


    【解决方案1】:

    如果您只需要使用 PIN 启用或禁用,则在这种情况下只需一个 CheckBoxPreference 就足够了(请参见下面的示例代码,第一个类别)。当您需要从设置列表 (ListPreference) 中选择某些内容时,通常会使用 RadioButtons - 例如(参见示例代码,第二类)来选择颜色。

    <?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?

    【讨论】:

    • 您能解释一下这种情况下列表首选项中的默认值是如何工作的吗?
    • 对不起,我的错误。该值应在此处指定 - 您需要选择 listValues (entryValues) 之一。在默认颜色为绿色的情况下,它将是 android:defaultValue="4" 而不是 "digiGreen"。已更正,谢谢评论。
    • 这没有回答问题,即如何制作一组单选按钮。
    • 确实,它描述了如何制作 ListPreference(在 .xml 文件中的第二个首选项类别中定义),其中包含一个带有 RadioButtons 列表的对话框(在 arrays.xml 中定义)。如果您不需要 RadioButtons,它们组合在一个列表中,请参阅本教程:developer.android.com/guide/topics/ui/controls/radiobutton.html
    • 并没有真正回答“如何在preference.xml 窗口中创建RadioButton 组?”的问题。另外,这是您在google“Android Radio Preference”时的第一个结果
    【解决方案2】:

    在某些情况下,将首选项设置为单选按钮是一个不错的功能,例如在每个选项下包含摘要文本的简单方法。

    使一组复选框的行为类似于一组单选按钮是相当简单的。要在 Preferences 中执行此操作,请将组中的所有复选框注册到同一个 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;
    }
    

    唯一的缺点是复选框看起来不像单选按钮...

    【讨论】:

    • 如果从 PrefsActivity 调用 findPreference() 将被弃用,但从 PrefsFragment stackoverflow.com/a/29578281/2162226 调用时没问题。这个答案让我走上了正轨 - 谢谢!
    【解决方案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;
      }
      

    【讨论】:

      【解决方案4】:

      试试这个:

          @Override
          public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, @NonNull Preference preference) {
              CheckBoxPreference cb1 = null;
              CheckBoxPreference cb2 = null;
              ListAdapter adapter = preferenceScreen.getRootAdapter();
              for(int i = 0; i < preferenceScreen.getRootAdapter().getCount(); i++)
              {
                  //attention to type and key
                  Preference pref = (Preference) adapter.getItem(i);
                  if (pref == null || pref.getKey() == null)
                      continue;
                  if (pref.getKey().equals(getString(R.string.tag_preference_key_always_zoom_to_akt_position)))
                      cb1 = (CheckBoxPreference) pref;
                  if (pref.getKey().equals(getString(R.string.tag_preference_key_always_zoom_to_last_location)))
                      cb2 = (CheckBoxPreference) pref;
                  if (cb1 != null && cb2 != null)
                      break;
              }
              //be safe
              if (cb1 == null || cb2 == null)
                  return super.onPreferenceTreeClick(preferenceScreen, preference);
      
              if (preference.getKey().equals(getString(R.string.tag_preference_key_always_zoom_to_akt_position))) {
                  CheckBoxPreference cb = (CheckBoxPreference) preference;
                  cb2.setChecked(!cb.isChecked());
              }
              if (preference.getKey().equals(getString(R.string.tag_preference_key_always_zoom_to_last_location))) {
                  CheckBoxPreference cb = (CheckBoxPreference) preference;
                  cb1.setChecked(!cb.isChecked());
              }
              return super.onPreferenceTreeClick(preferenceScreen, preference);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-07
        • 2017-08-28
        • 2011-01-08
        • 2010-12-18
        • 1970-01-01
        • 2014-09-02
        • 1970-01-01
        相关资源
        最近更新 更多