繁体   English   中英

Android Studio 中的 SharedPreferences 问题

[英]SharedPreferences issue in Android Studio


我从 2 天开始一​​直在尝试,并且已经彻底尝试了各种事情,但我无法完成这项工作。 请帮忙。
我有一个 Android Studio 提供的默认Settings页面,其中我只保留了 1 个SwitchPreference ,我打算根据Switch位置在所有活动中播放或暂停背景音乐。

这是我的Audio课。

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类。

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


首先,我从MainActivitySettings类中的OnPauseOnResume方法调用SharedPreference

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM