【问题标题】:onSharedPreferenceChanged() Never calledonSharedPreferenceChanged() 从未调用
【发布时间】:2013-06-29 00:43:07
【问题描述】:

我最近将 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 );
        }

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

【问题讨论】:

  • 你能发布你在首选项中更改某些内容的方法吗?
  • @Opiatefuchs 按要求添加示例。

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


【解决方案1】:

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

@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);
}

【讨论】:

    【解决方案2】:

    试着打电话

    prefs.registerOnSharedPreferenceChangeListener(this)

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

    【讨论】:

    • 没有区别。调试时,我可以看到 prefs' 内部成员。它有一个WeakHashMap 用于存储监听器,但无论我在哪里注册/取消注册监听器,我总是将我的 Activity 视为成员。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      解决方案来自doku for the listener

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-18
        • 1970-01-01
        • 2016-10-01
        • 1970-01-01
        • 2012-03-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多