保存具有共享首选项的设置数据并在另一个活动中使用



我目前正在构建一个测验应用程序,并试图添加设置活动,其中用户将能够管理一些游戏参数,如声音(使用切换按钮)或游戏时间。我尝试使用共享偏好来实现它,但出了问题:退出活动后切换按钮的状态没有保存,似乎共享偏好功能也不能正常工作。如果有人知道如何解决这个问题,或者如何正确地构建这个,我会很高兴。下面是我的代码:

设置活动:

SwitchCompat switchButton;
ImageView imageViewOn;
private Context mContext;
public Settings(){}
public Settings(Context mContext) {
this.mContext = mContext;
}

private String soundState;
public static final String PREFERRENCE = "shared_prefrence";
//public static final boolean TOGGLE_STATE = false;
public static final String SOUND_STATE = "sound state";
public static final String PREFERRENCE_SOUND_ON = "sound_on";
public static final String PREFERENCE_SOUND_OFF = "sound_of";
public String getSoundState() {
return soundState;
}
public void setSoundState(String soundState) {
this.soundState = soundState;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
switchButton = findViewById(R.id.switchButton);
imageViewOn = findViewById(R.id.sound_on);
loadSound();

switchButton.setOnCheckedChangeListener((compoundButton, b) -> {
if(compoundButton.isChecked()){
soundState = PREFERENCE_SOUND_OFF;
updateSoundState(soundState);
imageViewOn.setImageResource(R.drawable.sound_off);

}
else{
soundState = PREFERRENCE_SOUND_ON;
updateSoundState(soundState);
imageViewOn.setImageResource(R.drawable.sound_on);
}
});
}
private void updateSoundState(String soundState) {
SharedPreferences sharedPreferences = getSharedPreferences(PREFERRENCE,MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(SOUND_STATE,soundState);
editor.apply();
}
private void loadSound() {
SharedPreferences sharedPreferences = getSharedPreferences(PREFERRENCE,MODE_PRIVATE);
sharedPreferences.getString(SOUND_STATE, PREFERRENCE_SOUND_ON);
}

测试活动(触发声音提示)添加相关代码,否则将非常长。如果缺少什么,请评论,我会添加:

private  Settings settings; 
private PlayAudioForAnswers playAudioForAnswers;// class which plays audio

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_quiz);
setupUI();
loadPreferences();
playAudioForAnswers = new PlayAudioForAnswers(this);
}
private void setupUI(){
settings = new Settings(this);
}

`private void loadPreferences()`
{

SharedPreferences sharedPreferences = getSharedPreferences(settings.PREFERRENCE, MODE_PRIVATE);
String sound = sharedPreferences.getString(settings.SOUND_STATE,settings.PREFERRENCE_SOUND_ON);
settings.setSoundState(sound);
}
if(settings.getSoundState().equals(settings.PREFERRENCE_SOUND_ON))
playAudioForAnswers.setAudioforAnswer(FLAG);
// playing the sound cue if the state is on

你的代码顺序不对。首先,您应该更改声音状态,然后保存它。

soundState = PREFERENCE_SOUND_OFF;
updateSoundState(soundState);

而不是
updateSoundState(soundState);
soundState = PREFERENCE_SOUND_OFF;

也没有调用

soundState = PREFERRENCE_SOUND_ON;;

另一个良好的工作实践

您可以将Pref从活动中分离出来:

1 - SharedPrefsHelper

import android.content.Context;
import android.content.SharedPreferences;    
import static android.content.Context.MODE_PRIVATE;
/**
* @author Islam
* @date 10/11/2018
*/
public class SharedPrefsHelper {
SharedPreferences mSharedPreferences;
private static final String MY_PREFS = "YOUR_APP";

public SharedPrefsHelper(Context context) {
mSharedPreferences = context.getSharedPreferences(MY_PREFS, MODE_PRIVATE);
}
private static SharedPreferences getPref(Context context) {
return context.getSharedPreferences(MY_PREFS, Context.MODE_PRIVATE);
}
public void clear(Context context) {
getPref(context).edit().clear().apply();
}

/**
* set Load all tasks
*
* @param isLoadAllTasks
*/
public void setIsLoadAllTasks( boolean isLoadAllTasks) {
mSharedPreferences.edit().putBoolean(Constants.LOAD_ALL_TASKS, isLoadAllTasks).apply();
}
/**
* get Scanner Scanning
*
* @return
*/
public boolean getIsLoadAllTasks() {
return mSharedPreferences.getBoolean(Constants.LOAD_ALL_TASKS,false);
}

//endregion
}

然后创建DataManger类作为视图和数据源(DB || Pref)之间的层。

2 - DataManager

/**
* @author Islam
* @date 14/2/2020
*/
public class DataManager {
private static final String TAG = "DataManager";
private SharedPrefsHelper mSharedPrefsHelper;
public DataManager(SharedPrefsHelper sharedPrefsHelper) {
mSharedPrefsHelper = sharedPrefsHelper;
}
//region Settings
/**
* set Is Load Tasks
*
* @param isLoadTasks
*/
public void setIsLoadAllTasks( boolean isLoadTasks) {
mSharedPrefsHelper.setIsLoadAllTasks(isLoadTasks);
}
/**
* get Is Load Tasks
*
* @return
*/
public boolean getIsLoadAllTasks() {
return mSharedPrefsHelper.getIsLoadAllTasks();
}

//endregion
}

3-设置活动

在OnCreate 中调用
@Override
protected void initUIAndActions() {
// fetch current status 
binding.switchLoadAll.setChecked(dataManager.getIsLoadAllTasks());
// checking Listener
binding.switchLoadAll.setOnCheckedChangeListener((buttonView, isChecked) -> {
//save is Load all Tasks to Prefs
dataManager.setIsLoadAllTasks(isChecked);
});
}

最新更新