在 PreferenceActivity 中启用和禁用选项

Posted

技术标签:

【中文标题】在 PreferenceActivity 中启用和禁用选项【英文标题】:Enable and disable option in PreferenceActivity 【发布时间】:2014-01-12 17:37:57 【问题描述】:

我是创建PreferenceActivity 的新手。我的问题是如何通过更改其他首选项来启用和禁用首选项屏幕中的选项?

我的prefs.xml

<ListPreference
    android:entries="@array/units"
    android:entryValues="@array/lunits"
    android:key="listUnits"
    android:summary="Units schosssing"
    android:title="Units" android:defaultValue="C"/>

 <ListPreference
    android:entries="@array/palette"
    android:entryValues="@array/lpalette"
    android:key="listpalette"
    android:summary="Palette schosssing"
    android:title="Palette" 
    android:defaultValue="1"/>

listUnits 中有2 个选项,Celsius 和Fahrenheit,所以如果用户选择Celsius,listpalette 应该被启用,如果用户选择Fahrenheit 被禁用,我该怎么做?

我的设置活动

public class SettingsActivity extends PreferenceActivity

    @Override
    protected void onCreate(final Bundle savedInstanceState)
    
        super.onCreate(savedInstanceState);
        getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit();             
    

    public static class MyPreferenceFragment extends PreferenceFragment
    
        @Override
        public void onCreate(final Bundle savedInstanceState)
        
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.prefs);
        
    


【问题讨论】:

【参考方案1】:

首先,您可以将listUnits listpreference 的默认值设置为 celciusFahrenheit ,据此您可以启用-禁用您的第二个 listpreference。

现在,当您通过选择其中任何一个来更改您的偏好时,您可以按照以下步骤操作。

1) 在您的 MyPreferenceFragment 类中实现 OnSharedPreferenceChangeListener 并覆盖方法 onSharedPreferenceChanged

2) 在您的方法中使用如下代码

  @Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
        String key) 
    // TODO Auto-generated method stub
    if (key.equals("listUnits")) 
                     final String value = sharedPreferences.getString(key, "");
                     Preference Pref_cec=findPreference("listpalette");
        if (value.equals("celcius")) 
                     wallpaperPref_admin.setEnabled(true);
                    else
                      wallpaperPref_admin.setEnabled(false);
                    
             
      

希望它会有所帮助。如果我的帖子中缺少任何内容,请告诉我。

【讨论】:

【参考方案2】:

此代码可能对您有用。可以作为参考。

首先获取两个 ListPreference 的实例并应用此方法。

ListPreference mlistUnits, mlistPalette;
mlistUnits= (ListPreference)findPreference("listUnits");
mlistPalette= (ListPreference)findPreference("listpalette");

mlistUnits.setEnable(false);
mlistPalette.setEnabled(true);

并使用下面的监听器

OnPreferenceChangeListener listener = new OnPreferenceChangeListener()     
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) 
    // newValue is the value you choose
    return false;

;

将侦听器应用于 ListPreference

mlistPalette.setOnPreferenceChangeListener(listener);

【讨论】:

我得到“PreferenceActivity 类型的方法 getPreferenceScreen() 已弃用” 让它mlistUnits= (Preference) findPreference("listUnits"); 您不应在 PreferenceActivity 中调用 getPreferenceScreen(),因为它已被弃用。推荐的方法是在 PreferenceFragment 中编写代码,您可以在其中轻松使用 findPreference() 方法。【参考方案3】:

由于您的第二个列表是在第一个列表的基础上评估的,您可以做什么

    在 First 列表中寻找偏好点击,获取点击偏好的值。

    使用此值只需启用/禁用您的第二个列表。

【讨论】:

以上是关于在 PreferenceActivity 中启用和禁用选项的主要内容,如果未能解决你的问题,请参考以下文章

在 API 15 及更高版本中使用 PreferenceActivity

在 PreferenceActivity on Resume 中重新加载首选项

PreferenceActivity:将值保存为整数

Android:“BadTokenException:无法添加窗口;您的活动正在运行吗?”在 PreferenceActivity 中显示对话框

过时的PreferenceActivity导致Fragment显示问题

Android之设置页面(PreferenceActivity使用)