gpt4 book ai didi

android - 更改共享首选项未触发

转载 作者:行者123 更新时间:2023-11-29 01:10:24 26 4
gpt4 key购买 nike

我的布局中有一个 float 操作按钮。用户可以选择此按钮的位置,向左或向右。这可以在首选项中选择。

执行此操作的代码工作正常,但监听器未检测到首选项的更改。

如果应用重新启动, float 操作按钮会根据新的偏好显示,所以我知道这个偏好的过程有效,但不幸的是监听器似乎失败了。

当首选项发生变化时,我必须做什么才能触发监听器?

我的 MainActivity 中的监听器:

private final SharedPreferences.OnSharedPreferenceChangeListener 
mPositionFabListener = new SharedPreferences.OnSharedPreferenceChangeListener() {

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {

Log.e(TAG,"Are we getting here?");
// We do not get here when preference has changed. Why not??

// Code to update Floating Action Button to new position

}
};

我在 MainActivity 的 onResume() 方法中注册监听器,并在 onPause() 中注销。

@Override
protected void onResume() {
super.onResume();
PrefUtils.registerOnPrefChangeListener(mPositionFabListener);
}

@Override
protected void onPause() {
PrefUtils.unregisterOnPrefChangeListener(mPositionFabListener);
super.onPause();
}

registerOnPrefChangeListener 方法在单独的类中声明:

public class PrefUtils {

public static boolean getBoolean(String key, boolean defValue) {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(MainApplication.getContext());
return settings.getBoolean(key, defValue);
}

public static void putBoolean(String key, boolean value) {
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(MainApplication.getContext()).edit();
editor.putBoolean(key, value);
editor.apply();
}

public static int getInt(String key, int defValue) {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(MainApplication.getContext());
return settings.getInt(key, defValue);
}

public static void putInt(String key, int value) {
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(MainApplication.getContext()).edit();
editor.putInt(key, value);
editor.apply();
}

public static void registerOnPrefChangeListener(OnSharedPreferenceChangeListener listener) {
try {
PreferenceManager.getDefaultSharedPreferences(MainApplication.getContext()).registerOnSharedPreferenceChangeListener(listener);
} catch (Exception ignored) {}
}

public static void unregisterOnPrefChangeListener(OnSharedPreferenceChangeListener listener) {
try {
PreferenceManager.getDefaultSharedPreferences(MainApplication.getContext()).unregisterOnSharedPreferenceChangeListener(listener);
} catch (Exception ignored) {}
}

}

更新:在 GeneralPrefsFragment 类中,我放入此监听器用于测试目的。这个听众正在工作。那么为什么它在 MainActivity 中不起作用呢?

public class GeneralPrefsFragment extends PreferenceFragment {


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

Preference preference = findPreference(PrefUtils.POSITION_FLOATING_MENU_BUTTON);
Preference.OnPreferenceChangeListener mListener = new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
PrefUtils.putBoolean(PrefUtils.POSITION_FLOATING_MENU_BUTTON, Boolean.TRUE.equals(newValue));

PreferenceManager.getDefaultSharedPreferences(MainApplication.getContext()).edit().commit(); // to be sure all prefs are written

Log.e(TAG, "The listener in " + TAG + " is listening");

// This listener is fired as soon as changes in the preference are made!
// Why is the same kind of listener not fired in the MainActivity?

return true;
}
};
preference.setOnPreferenceChangeListener(mListener);


}

}

解决方案:我得到了修复。我仍然不知道为什么以前的设置不起作用,但我让它工作了,多亏了 this answer 中的代码.

在 MainAcivity 的 onCreate() 方法中,我放置了以下监听器,当首选项发生更改时会触发此监听器。

SharedPreferences prefs =
PreferenceManager.getDefaultSharedPreferences(this);

SharedPreferences.OnSharedPreferenceChangeListener mPrefsFabListener =
new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (PrefUtils.POSITION_FLOATING_MENU_BUTTON.equals(key)) {
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
CoordinatorLayout.LayoutParams paramsFab = (CoordinatorLayout.LayoutParams) fab.getLayoutParams();
if (PrefUtils.getBoolean(PrefUtils.POSITION_FLOATING_MENU_BUTTON, false)) {
paramsFab.gravity = Gravity.BOTTOM | Gravity.START;
} else {
paramsFab.gravity = Gravity.BOTTOM | Gravity.END;
}
}
}
};
prefs.registerOnSharedPreferenceChangeListener(mPrefsFabListener);

最佳答案

OnSharedPreferenceChangeListener 在 MainAcitivity 的 onPause() 方法中取消注册。这是一个问题,因为 MainActivity 会在 General Preferences Activity 启动后立即暂停以更改首选项。因此,监听器未注册,因此无法在需要的时候正确收听!

我从 onPause() 中删除了 unregisterOnPrefChangeListener 并放入了以下代码。这非常有效!

@Override
protected void onDestroy() {
PrefUtils.unregisterOnPrefChangeListener(mPositionFabListener);
super.onDestroy();
}

关于android - 更改共享首选项未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43619675/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com