I'm trying since 2 days and have exhaustively tried various things but I'm not able to get this work. Kindly help.
I have an Android Studio provided default Settings page where I have kept only 1 SwitchPreference where I intend to play or pause background music on all activities depending upon the Switch position.This is my 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();}
}
and this is my 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();}
}
}
and to start with, I'm calling the SharedPreference from OnPause and OnResume methods in MainActivity as well as from Settings class.
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
boolean isChecked = sharedPreferences.getBoolean("play_music", false);
if(isChecked) {AudioPlay.resumeAudio(); AudioPlay.mediaPlayer.setLooping(true);}
else {AudioPlay.pauseAudio();}
I think, I fixed it myself.Multiple tests doesn't show any problem.Please let me know if this could be done in a better way.My
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);
}
}
My
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();
}
}
Related
I have a background service which request new data from the server if new data exists it updates the sharedpreferences in my firebase job there is notification show command that shows notification between 0, 20 sec.
Notiifcation is showing up in every 20 sec that means my job is working fine but my onSharedPreferenceChanged is not listening for the changes made for job service.
Is there anything any way to listen for the sharedPreferences changes from Job.
Home activity
public class HomeActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener
,SharedPreferences , SharedPreferences.OnSharedPreferenceChangeListener
{
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
testUtils.myjob(this);
setContentView(R.layout.activity_home);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
......
defaultSetup();
}
private void defaultSetup() {
SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(this);
shared.registerOnSharedPreferenceChangeListener(this);
}
#Override
protected void onResume() {
super.onResume();
SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(this);
shared .registerOnSharedPreferenceChangeListener(this);
}
#Override
protected void onPause() {
super.onPause();
SharedPreferences shared = PreferenceManager.getDefaultSharedPreferences(this);
shared.unregisterOnSharedPreferenceChangeListener(this);
}
#Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
// if (key.equals(Preferences.LIST)) {
// Toast.makeText(this, "cool", Toast.LENGTH_LONG).show();
// }
// if (key.equals(Preferences.CHAT_LIST)) {
Log.e("Cool","cooooooooooooool");
Toast.makeText(this, "cool", Toast.LENGTH_LONG).show();
// }
}
#Override
public Map<String, ?> getAll() {
return null;
}
#Nullable
#Override
public String getString(String key, #Nullable String defValue) {
return null;
}
#Nullable
#Override
public Set<String> getStringSet(String key, #Nullable Set<String> defValues) {
return null;
}
#Override
public int getInt(String key, int defValue) {
return 0;
}
#Override
public long getLong(String key, long defValue) {
return 0;
}
#Override
public float getFloat(String key, float defValue) {
return 0;
}
#Override
public boolean getBoolean(String key, boolean defValue) {
return false;
}
#Override
public boolean contains(String key) {
return false;
}
#Override
public Editor edit() {
return null;
}
#Override
public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
}
#Override
public void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
}
#Override
protected void onDestroy() {
super.onDestroy();
PreferenceManager.getDefaultSharedPreferences(this)
.unregisterOnSharedPreferenceChangeListener(this);
}
}
Firebase Job Service
public class FirebaseJobService extends com.firebase.jobdispatcher.JobService{
#Override
public boolean onStartJob(com.firebase.jobdispatcher.JobParameters job) {
String url = ApiUtil.getNewMessage();
final Context context = this;
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener<String>() {
#Override
public void onResponse(String response) {
JSONArray arr;
try {
arr = new JSONArray(response);
SharedPreferences pref1 = getSharedPreferences(Preferences.LIST, 0);
String chatList = pref1.getString(Preferences.CHAT_LIST, "[]");
arr = Utils.concatArray(arr, new JSONArray(chatList));
SharedPreferences.Editor editor = pref1.edit();
editor.putString(Preferences.CHAT_LIST, arr.toString());
editor.apply();
NotificationUtils.show(context);
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
}
});
RequestManager.getInstance(this).addToRequestQueue(stringRequest);
return false;
}
#Override
public boolean onStopJob(com.firebase.jobdispatcher.JobParameters job) {
return false;
}
}
Probably :
SharedPreferences pref1 = getSharedPreferences(Preferences.LIST, 0);
causing issue, because setting registerOnSharedPreferenceChangeListener for SharedPreferences which is returned by getDefaultSharedPreferences instead of by getSharedPreferences.
Note :
getDefaultSharedPreferences()- uses a default preference-file name
And
getSharedPreferences- retrieve and hold the contents of the preferences file 'name
So to get it work save Preferences.CHAT_LIST using getDefaultSharedPreferences or set registerOnSharedPreferenceChangeListener in Activity on instance which is returned by getSharedPreferences.
I wrote this code that works with sharedPreference ,
in sosbutton I changed sharedPreference ,I want when sharedPreference changed ,
onsharedpreferencechangelistener fire .
I wrote this code but onsharedpreferencechangelistener didn't fire.
public class MainActivity extends AppCompatActivity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final SharedPreferences prefs = getSharedPreferences("demopref", Context.MODE_WORLD_READABLE);
final Button sosBtn=(Button) findViewById(R.id.button);
sosBtn.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
String data = prefs.getString("demostring", "No Value");
SharedPreferences.Editor editor = prefs.edit();
editor.putString("demostring","HI...");
editor.commit();
////////////////////////////////
}
});
SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
Toast.makeText(getApplicationContext(),"changed : " + key,Toast.LENGTH_LONG).show();
}
};
prefs.registerOnSharedPreferenceChangeListener(listener);
}
}
please help me :(
thanks in advance
I solved my problem:
public class MainActivity extends Activity {
SharedPreferences pref;
SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
#Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if(key.equals("demopref"))
Toast.makeText(getApplicationContext(),"Hello2---"+key,Toast.LENGTH_LONG).show();
}
};
#SuppressWarnings("deprecation")
int i=0;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
////////////////////////////////////////
final Button sosBtn = (Button) findViewById(R.id.button);
sosBtn.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
SharedPreferences.Editor editor = pref.edit();
editor.putString("demopref","HI"+String.valueOf(i));
i++;
editor.commit();
/////////////////////////////////
}
});
}
#Override
protected void onResume() {
pref.registerOnSharedPreferenceChangeListener(listener);
super.onResume();
}
#Override
protected void onPause() {
pref.unregisterOnSharedPreferenceChangeListener(listener);
super.onPause();
}
}
MODE_WORLD_READABLE is deprecated, try MODE_PRIVATE
Try this may be help you...
your not given reference to your
SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
here is my code
public class MainActivity extends AppCompatActivity implements SharedPreferences.OnSharedPreferenceChangeListener{
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final SharedPreferences prefs = getSharedPreferences("demopref", Context.MODE_PRIVATE);
final Button sosBtn=(Button) findViewById(R.id.button);
sosBtn.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
String data = prefs.getString("demostring", "No Value");
SharedPreferences.Editor editor = prefs.edit();
editor.putString("demostring","HI...");
editor.commit();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(listener);
////////////////////////////////
}
});
listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
Toast.makeText(getApplicationContext(),"changed : " + key,Toast.LENGTH_LONG).show();
}
};
prefs.registerOnSharedPreferenceChangeListener(listener);
}
}
I need to save the information about the toggle button when the user kill the app or restarted i want to display the previous state of the button Thanks
public class MainActivity extends ActionBarActivity {
ToggleButton toggle;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
android.support.v7.app.ActionBar menu = getSupportActionBar();
menu.setDisplayShowHomeEnabled(true);
menu.setLogo(R.mipmap.ic_launcher);
menu.setDisplayUseLogoEnabled(true);
}
#Override
protected void onResume() {
super.onResume();
toggle = (ToggleButton) findViewById(R.id.togglebutton);
toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
enableNotifications();
} else {
makeDialog();
}
}
});
}
Use shared prefernces for the same.
togButton.setOnCheckedChangeListener(new OnCheckedChangeListener() {
#Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int notification_status = Integer.parseInt(mPreferences.getString("status", "-1"));
SharedPreferences.Editor editor=mPreferences.edit();
Log.i("notification_status="+notification_status,"888");
if(notification_status==-1){
editor.putString("status", "1");
holder.notification_btn.setBackgroundResource(R.drawable.notification_on);
//do your stuff
}else if(notification_status==1){
editor.putString("status", "0");
holder.notification_btn.setBackgroundResource(R.drawable.notification_off);
//do your stuff
}else if(notification_status==0){
editor.putString("status", "1");
holder.notification_btn.setBackgroundResource(R.drawable.notification_on);
//do your stuff
}
editor.commit();
}
});
Use shared preferences as following class
public class YourPreferenes {
private Context mContext;
private SharedPreferences mPrefs;
private static YourPreferenes mYourPreferenes;
private YourPreferenes(Context ctx){
mContext = ctx;
mPrefs = mContext.getSharedPreferences("ATSPreferenes", Context.MODE_PRIVATE);
}
public static ATSPreferenes getInstance(Context ctx){
if(mYourPreferenes == null){
mYourPreferenes = new YourPreferenes(ctx);
}
return mYourPreferenes;
}
public void setButtonState(boolean btnstate){
SharedPreferences.Editor editor = mPrefs.edit();
editor.putBoolean("btnstate", btnstate);
editor.commit();
}
public boolean getButtonState(){
return mPrefs.getBoolean("btnstate", false);
}
}
And get your saved togalbutton stat even you kill your app.
I need to change Check Box Preference inside the Preference activity, but it not seems to work:
public class SettingsActivity extends PreferenceActivity {
static CheckBoxPreference autoP;
#Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public static class MyPreferenceFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener{
#Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.prefs);
autoP = (CheckBoxPreference)findPreference("autoP");
autoP.setOnPreferenceChangeListener(autoP_listener);
OnPreferenceChangeListener autoP_listener = new OnPreferenceChangeListener() {
#Override
public boolean onPreferenceChange(Preference preference,Object newValue) {
autoP.setDefaultValue((String) newValue);
if (newValue.toString().equals("true"))
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
else
getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
return false;
}
};
}
}
This should work:
final CheckBoxPreference autoP = (CheckBoxPreference) getPreferenceManager().findPreference("autoP");
autoP.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object newValue) {
if ((Boolean)newValue == true) {
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}else {
getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
return true;
}
});
try this:
public class SettingsActivity extends PreferenceActivity {
static CheckBoxPreference autoP;
#Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public static class MyPreferenceFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {
#Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.prefs);
autoP = (CheckBoxPreference)findPreference("autoP");
autoP.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
#Override
public boolean onPreferenceChange(Preference preference,Object newValue) {
updateOnPreferenceChange();
}
});
}
private void updateOnPreferenceChange() {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
String pref_name = "should_be_pref_name_in_xml_file";
boolean checked = sharedPreferences.getBoolean(pref_name, defaultValue);
if (checked) {
// todo
} else {
// todo
}
}
}
}
Try this
public class SettingsActivity extends PreferenceFragment {
#Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.prefs);
}
#Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
Preference preference) {
String key = preference.getKey();
if (key.equals("key")) {
if (((CheckBoxPreference) preference).isChecked()){
// do things if the checkbox is checked
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
} else {
// do things if it is unchecked
getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
return true;
}
}
I'm attempting to evaluate my preferences in my java code in order to enable/disable other options it they chose not to do other options... So far i'm trying to only implement the OnPreferenceClickListener however i never see the toast from the changes. What am i doing wrong? There seem to be alot of other questions like this but i cannot see my error in reference to them.
public class UserSettingActivity extends PreferenceActivity implements OnPreferenceClickListener{
SharedPreferences mPreferences;
Boolean frequency;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
}
#Override
public boolean onPreferenceClick(Preference preference) {
mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
frequency = mPreferences.getBoolean("frequency", true);
Context context = getApplicationContext();
Toast.makeText(context, "Hello toast 0!", Toast.LENGTH_LONG).show();
if (!frequency) {
Context context2 = getApplicationContext();
Toast.makeText(context2, "Hello toast 1!", Toast.LENGTH_LONG).show();
} else if (preference.getKey().equals("schedulestop")) {
} else if (preference.getKey().equals("priority")) {
} else {
Context context3 = getApplicationContext();
Toast.makeText(context3, "Hello toast 0!", Toast.LENGTH_LONG).show();
}
return false;
}
}
You have to register for PreferenceClickListener each individual preference
somePreference.setOnPreferenceClickListener(this);
or you can use getSharedPreferences().registerOnSharedPreferenceChangeListener for all preferences.
public class UserSettingActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener{
SharedPreferences mPreferences;
Boolean frequency;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
}
#SuppressWarnings("deprecation")
#Override
protected void onPause()
{
super.onPause();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
#SuppressWarnings("deprecation")
#Override
protected void onResume()
{
super.onResume();
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
#SuppressWarnings("deprecation")
#Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals("schedulestop")) {
// do something
}
else if (key.equals(......
}
}
first implement "OnSharedPreferenceChangeListener"
PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener
Then
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit();
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
settings.registerOnSharedPreferenceChangeListener(this);
}
THEN
#Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
switch (key) {
case "pref_key_auto_delete":
boolean notificationStatus = SP.getBoolean(key, false);
Log.d("stat", String.valueOf(notificationStatus));
break;
case "pref_key_notification_list":
String downloadType = SP.getString(key, "n/a");
Log.d("stat", String.valueOf(downloadType));
break;
}