android - onSharedPreferenceChange 监听器 -> 在 fragment 中

标签 android android-fragments sharedpreferences listener android-sharedpreferences

嘿,我正在尝试将 onSharedPreference 监听器添加到 n fragment 中。它应该调节是否完成更改(在设置中切换) Fragment 内的 NumberPicker 的值也会更改(0 或 1)。

监听器的问题:它只工作了前 5-10 次,然后就不再被调用了(我想)? -> 没有对 NumberPicker 进行任何更改 遵循我的 fragment 的重要代码:

public class FragmentTwo extends Fragment {

private EditText mEnterWeight;
private NumberPicker mUnitPicker;
private TextView mConverted;
private int pick;
private String convertedWeightMessage;
private Double enteredWeight;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_two, container, false);
    mEnterWeight = (EditText) view.findViewById(R.id.WCenterWeight);
    mUnitPicker = (NumberPicker) view.findViewById(R.id.WCunitPicker);
    mConverted = (TextView) view.findViewById(R.id.WCconverted);
    initialiseUnitPicker(); 
    //some stuff 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
    SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
        public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
            // listener implementation      

            if(key.equals("SwitchMainUnit")) {
                Boolean kg = prefs.getBoolean("SwitchMainUnit", true);
                    if(kg)
                        mUnitPicker.setValue(0);
                        else mUnitPicker.setValue(1);
            }

        }
    };
    prefs.registerOnSharedPreferenceChangeListener(listener);
 return view;
}

文档说我需要将 onResume() 和 onPause() 更改为:

@Override
protected void onResume() {
super.onResume();
getPreferenceScreen().getSharedPreferences()
        .registerOnSharedPreferenceChangeListener(this);
}

@Override
protected void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences()
        .unregisterOnSharedPreferenceChangeListener(this);
}

但是我需要在哪里添加这些呢?当我尝试将它添加到 fragment 中时出现错误。

感谢您的帮助;我自己没有找到任何解决方案.. :/

最佳答案

文档说

Caution: When you call registerOnSharedPreferenceChangeListener(), the preference manager does not currently store a strong reference to the listener

我建议您将 SharedPreferences.OnSharedPreferenceChangeListener 监听器 的实例存储为 onCreateView 之外的字段。

示例代码:

公共(public)类 FragmentTwo 扩展 fragment {

private EditText mEnterWeight;
private NumberPicker mUnitPicker;
private TextView mConverted;
private int pick;
private String convertedWeightMessage;
private Double enteredWeight;
SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
        // listener implementation      

        if (key.equals("SwitchMainUnit")) {
            Boolean kg = prefs.getBoolean("SwitchMainUnit", true);
            if (kg) mUnitPicker.setValue(0);
            else mUnitPicker.setValue(1);
        }

    }
};
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_two, container, false);
    mEnterWeight = (EditText) view.findViewById(R.id.WCenterWeight);
    mUnitPicker = (NumberPicker) view.findViewById(R.id.WCunitPicker);
    mConverted = (TextView) view.findViewById(R.id.WCconverted);
    initialiseUnitPicker();
    //some stuff 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
    prefs.registerOnSharedPreferenceChangeListener(listener);
    return view;
}

关于android - onSharedPreferenceChange 监听器 -> 在 fragment 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33508841/

相关文章:

java - Android 抽屉导航图像

java - SharedPreferences 没有被清除 android

java - 如何监听 picasso (Android)加载完成事件?

android - SQLite 数据库大小越来越大

android - 我无法将 gradle 插件版本更新到 4.1.3

android - 允许用户在 Android 上的内部和外部存储位置之间切换

android - 是否可以在 ListFragment 中设置自定义 ListView?

android - 如何从抽屉导航的工具栏中删除三个点

android - 在 SharedPreferences 中存储和检索目录 Uri

java - 我的共享首选项无法正确共享