3

我最近将该HoloEverywhere库从 GitHub 导入 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 );
        }

更新:我不认为这是我的偏好在SettingsActivityacommit()apply(). 我能够调试并看到听众的WeakHashMap内部prefs总是有我作为成员的活动。我尝试创建一个作为侦听器的全局变量,但这没有区别。

4

4 回答 4

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);
}
于 2013-12-27T15:45:48.180 回答
2

试着打电话

prefs.registerOnSharedPreferenceChangeListener(this)

在 SettingsActivity 的 onCreate 中。我想在内部类中的片段中调用它会在内部片段暂停时破坏侦听器

于 2013-07-01T19:57:27.230 回答
0

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

解决方案来自听者的doku

即使将首选项设置为其现有值,也可能会调用它。

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

于 2014-06-26T07:06:57.857 回答
0

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

于 2014-01-30T13:33:23.040 回答