Android Studio 中的 SharedPreferences 问题
SharedPreferences issue in Android Studio
我从 2 天开始就在尝试,并且已经详尽地尝试了各种方法,但我无法完成这项工作。请帮忙。
我有一个 Android Studio 提供的默认 Settings
页面,我只保留了 1 SwitchPreference
页面,我打算根据 Switch
位置在所有活动中播放或暂停背景音乐。
这是我的 Audio
class.
public class AudioPlay {
public static MediaPlayer mediaPlayer;
private static SoundPool soundPool;
public static boolean isplayingAudio=false;
public static void playAudio(Context c, int id){
mediaPlayer = MediaPlayer.create(c,id);
soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
if(!mediaPlayer.isPlaying())
{ isplayingAudio=true; mediaPlayer.start(); }
}
public static void stopAudio(){ isplayingAudio=false; mediaPlayer.stop(); }
public static void pauseAudio() {isplayingAudio=false;mediaPlayer.pause();}
public static void resumeAudio() {isplayingAudio=true;mediaPlayer.start();}
}
这是我的 Settings
class.
public class SettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings_activity);
AudioPlay.playAudio(getBaseContext(),R.raw.app_bg_music);
AudioPlay.mediaPlayer.setLooping(true);
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.settings_pref, new SettingsFragment())
.commit();
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); }
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
sharedPrefs.registerOnSharedPreferenceChangeListener(new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
boolean test = sharedPreferences.getBoolean("play_music", false);
if(test) {AudioPlay.resumeAudio(); AudioPlay.mediaPlayer.setLooping(true);}
else {AudioPlay.pauseAudio();}
}
});
}
public static class SettingsFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey)
{ setPreferencesFromResource(R.xml.root_preferences, rootKey); }
}
@Override
protected void onPause() {
super.onPause();
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
boolean isChecked = sharedPreferences.getBoolean("play_music", false);
if(isChecked) {AudioPlay.resumeAudio(); AudioPlay.mediaPlayer.setLooping(true);}
else {AudioPlay.pauseAudio();}
}
@Override
protected void onResume() {
super.onResume();
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
boolean isChecked = sharedPreferences.getBoolean("play_music", false);
if(isChecked) {AudioPlay.resumeAudio(); AudioPlay.mediaPlayer.setLooping(true);}
else {AudioPlay.pauseAudio();}
}
}
首先,我从 OnPause
和 OnResume
方法以及 MainActivity
中调用 SharedPreference
14=] class.
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
boolean isChecked = sharedPreferences.getBoolean("play_music", false);
if(isChecked) {AudioPlay.resumeAudio(); AudioPlay.mediaPlayer.setLooping(true);}
else {AudioPlay.pauseAudio();}
我想,我自己修复了它。
多次测试没有显示任何问题。
如果可以用更好的方式完成,请告诉我。
我的
Settings Fragment
class
public class SettingsFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener {
SharedPreferences sharedPreferences;
@Override
public void onCreatePreferences(Bundle bundle, String rootKey) {
addPreferencesFromResource(R.xml.root_preferences);
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if(key.equals("sync")){
boolean on = sharedPreferences.getBoolean("sync", false);
if(on){
Toast.makeText(getActivity(), "Switch enabled", Toast.LENGTH_SHORT).show();
if(AudioPlay.mediaPlayer == null) { AudioPlay.playAudio(getContext(),R.raw.app_bg_music_orig); AudioPlay.mediaPlayer.setLooping(true);}
else {AudioPlay.resumeAudio();}
}
else {
Toast.makeText(getActivity(), "Switch disabled", Toast.LENGTH_SHORT).show();
if(AudioPlay.mediaPlayer == null) { Log.i("Switch position",""+on); }
else {AudioPlay.pauseAudio();}
}
}
}
@Override
public void onStart() {
super.onStart();
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onStop() {
super.onStop();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
}
我的
Settings
class
public class SettingsActivity extends AppCompatActivity {
SharedPreferences.OnSharedPreferenceChangeListener listener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings_activity);
getSharedPreferences("sync",MODE_PRIVATE).registerOnSharedPreferenceChangeListener(listener);
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.settings, new SettingsFragment())
.commit();
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
boolean my_bg_music = preferences.getBoolean("sync",true);
if(my_bg_music){
if(AudioPlay.mediaPlayer == null) { AudioPlay.playAudio(this,R.raw.app_bg_music_orig); AudioPlay.mediaPlayer.setLooping(true);}
else {AudioPlay.resumeAudio();}
}
else{
if(AudioPlay.mediaPlayer == null) { Log.i("Switch position",""+my_bg_music); }
else {AudioPlay.pauseAudio();}
}
}
@Override
public void onResume() {
getSharedPreferences("sync",MODE_PRIVATE).registerOnSharedPreferenceChangeListener(listener);
super.onResume();
}
@Override
public void onPause() {
getSharedPreferences("sync",MODE_PRIVATE).unregisterOnSharedPreferenceChangeListener(listener);
super.onPause();
}
}
我从 2 天开始就在尝试,并且已经详尽地尝试了各种方法,但我无法完成这项工作。请帮忙。
我有一个 Android Studio 提供的默认 Settings
页面,我只保留了 1 SwitchPreference
页面,我打算根据 Switch
位置在所有活动中播放或暂停背景音乐。
这是我的 Audio
class.
public class AudioPlay {
public static MediaPlayer mediaPlayer;
private static SoundPool soundPool;
public static boolean isplayingAudio=false;
public static void playAudio(Context c, int id){
mediaPlayer = MediaPlayer.create(c,id);
soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
if(!mediaPlayer.isPlaying())
{ isplayingAudio=true; mediaPlayer.start(); }
}
public static void stopAudio(){ isplayingAudio=false; mediaPlayer.stop(); }
public static void pauseAudio() {isplayingAudio=false;mediaPlayer.pause();}
public static void resumeAudio() {isplayingAudio=true;mediaPlayer.start();}
}
这是我的 Settings
class.
public class SettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings_activity);
AudioPlay.playAudio(getBaseContext(),R.raw.app_bg_music);
AudioPlay.mediaPlayer.setLooping(true);
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.settings_pref, new SettingsFragment())
.commit();
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); }
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
sharedPrefs.registerOnSharedPreferenceChangeListener(new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
boolean test = sharedPreferences.getBoolean("play_music", false);
if(test) {AudioPlay.resumeAudio(); AudioPlay.mediaPlayer.setLooping(true);}
else {AudioPlay.pauseAudio();}
}
});
}
public static class SettingsFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey)
{ setPreferencesFromResource(R.xml.root_preferences, rootKey); }
}
@Override
protected void onPause() {
super.onPause();
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
boolean isChecked = sharedPreferences.getBoolean("play_music", false);
if(isChecked) {AudioPlay.resumeAudio(); AudioPlay.mediaPlayer.setLooping(true);}
else {AudioPlay.pauseAudio();}
}
@Override
protected void onResume() {
super.onResume();
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
boolean isChecked = sharedPreferences.getBoolean("play_music", false);
if(isChecked) {AudioPlay.resumeAudio(); AudioPlay.mediaPlayer.setLooping(true);}
else {AudioPlay.pauseAudio();}
}
}
首先,我从 OnPause
和 OnResume
方法以及 MainActivity
中调用 SharedPreference
14=] class.
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
boolean isChecked = sharedPreferences.getBoolean("play_music", false);
if(isChecked) {AudioPlay.resumeAudio(); AudioPlay.mediaPlayer.setLooping(true);}
else {AudioPlay.pauseAudio();}
我想,我自己修复了它。
多次测试没有显示任何问题。
如果可以用更好的方式完成,请告诉我。
我的
Settings Fragment
class
public class SettingsFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener {
SharedPreferences sharedPreferences;
@Override
public void onCreatePreferences(Bundle bundle, String rootKey) {
addPreferencesFromResource(R.xml.root_preferences);
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if(key.equals("sync")){
boolean on = sharedPreferences.getBoolean("sync", false);
if(on){
Toast.makeText(getActivity(), "Switch enabled", Toast.LENGTH_SHORT).show();
if(AudioPlay.mediaPlayer == null) { AudioPlay.playAudio(getContext(),R.raw.app_bg_music_orig); AudioPlay.mediaPlayer.setLooping(true);}
else {AudioPlay.resumeAudio();}
}
else {
Toast.makeText(getActivity(), "Switch disabled", Toast.LENGTH_SHORT).show();
if(AudioPlay.mediaPlayer == null) { Log.i("Switch position",""+on); }
else {AudioPlay.pauseAudio();}
}
}
}
@Override
public void onStart() {
super.onStart();
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onStop() {
super.onStop();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
}
我的
Settings
class
public class SettingsActivity extends AppCompatActivity {
SharedPreferences.OnSharedPreferenceChangeListener listener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings_activity);
getSharedPreferences("sync",MODE_PRIVATE).registerOnSharedPreferenceChangeListener(listener);
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.settings, new SettingsFragment())
.commit();
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
boolean my_bg_music = preferences.getBoolean("sync",true);
if(my_bg_music){
if(AudioPlay.mediaPlayer == null) { AudioPlay.playAudio(this,R.raw.app_bg_music_orig); AudioPlay.mediaPlayer.setLooping(true);}
else {AudioPlay.resumeAudio();}
}
else{
if(AudioPlay.mediaPlayer == null) { Log.i("Switch position",""+my_bg_music); }
else {AudioPlay.pauseAudio();}
}
}
@Override
public void onResume() {
getSharedPreferences("sync",MODE_PRIVATE).registerOnSharedPreferenceChangeListener(listener);
super.onResume();
}
@Override
public void onPause() {
getSharedPreferences("sync",MODE_PRIVATE).unregisterOnSharedPreferenceChangeListener(listener);
super.onPause();
}
}