onSharedPreferenceChanged()从未调用过

时间:2013-07-01 19:29:09

标签: android sharedpreferences android-preferences preferenceactivity android-holo-everywhere

我最近将GitHub中的HoloEverywhere库导入Eclpse,并开始在已经运行的应用程序中使用它。总的来说,我对图书馆感到满意,事情进展顺利。

我正在尝试使用org.holoeverywhere.preference.PreferenceActivity代替我原来的PreferenceActivity。 UI看起来应该是这样,但是我注意到onSharedPreferenceChanged()永远不再被调用。我做错了什么?

AFAIK我按预期使用该库。我使用HoloEverywhere几乎没有将旧版本更改为新版本。虽然在SO上有很多相关的问题,但我找不到任何解决我问题的方法。

下面发布的相关代码:

import org.holoeverywhere.LayoutInflater;
import org.holoeverywhere.preference.Preference;
import org.holoeverywhere.preference.PreferenceFragment;
import org.holoeverywhere.preference.PreferenceManager;
import org.holoeverywhere.preference.PreferenceScreen;
import org.holoeverywhere.preference.SharedPreferences;
import org.holoeverywhere.preference.SharedPreferences.Editor;
import org.holoeverywhere.preference.SharedPreferences.OnSharedPreferenceChangeListener;


public class SettingsActivity extends org.holoeverywhere.preference.PreferenceActivity implements SyncManager.SyncProgressListener, SharedPreferences.OnSharedPreferenceChangeListener
{
private static SharedPreferences prefs;

@Override
public void onCreate(Bundle savedInstanceState)
    {
    prefs = PreferenceManager.getDefaultSharedPreferences( this );
    }

public void onSharedPreferenceChanged(SharedPreferences prefs, String key)
    {
    // do some really important stuff here
    }

public static class DisplaySetttingsFragment extends PreferenceFragment
    {
    @Override
    public void onCreate(Bundle savedInstanceState)
        {
        super.onCreate( savedInstanceState );
        getActivity().setTitle( getString( R.string.pref_display_title ) );
        addPreferencesFromResource( R.xml.display_preferences );
        }

    @Override
    public void onResume()
        {
        super.onResume();
        prefs.registerOnSharedPreferenceChangeListener( (SettingsActivity) getActivity() );
        }

    @Override
    public void onPause()
        {
        super.onPause();
        prefs.unregisterOnSharedPreferenceChangeListener( (SettingsActivity) getActivity() );
        }
    }
}

更新:我更改并提交首选项的示例,我希望调用onSharedPreferenceChanged()

    @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)
        {

        String resetString = getString( R.string.pref_key_reset_display );
        String key = preference.getKey();

        if ( key != null && key.equals( resetString ) )
            {
            prefs.edit().
                putBoolean( getString( R.string.pref_key_reset_display ), true ).commit();
            }

        return super.onPreferenceTreeClick( preferenceScreen, preference );
        }

更新:我不相信这是我的偏好问题,在SettingsActivity或{commit()或{apply()时没有注册的听众(在这种情况下是我的WeakHashMap) {1}}。我能够调试并看到监听器内的prefs {{1}}总是将我的活动作为成员。我尝试创建一个监听器的全局变量,但没有区别。

4 个答案:

答案 0 :(得分:6)

可能缺少以下调用:这可能会解决您的问题。

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}

/* (non-Javadoc)
 * @see android.app.Activity#onPause()
 */
@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();

    getPreferenceScreen().getSharedPreferences()
    .unregisterOnSharedPreferenceChangeListener(this);
}

答案 1 :(得分:2)

答案 2 :(得分:0)

检查preference.xml。所有首选项都有一个定义的键值?如果不是,则不会触发回调。

答案 3 :(得分:0)

我有类似的问题。对我来说,监听器被称为标准属性,但也不是一组editor

解决方案来自doku for the listener

  

即使将偏好设置为其现有值,也可以调用此

我的解决方案是先将boolean设置为错误,然后设置为正确的值(并提交每次更改)。