0

Я пытаюсь прослушать SharedPreferences изменений в MainActivity. И обновите значения в настройках приложения. И рабочий код выглядит следующим образом:Прослушивание изменений SharedPreferences в MainActivity

private SharedPreferences SP, prefs; 
SharedPreferences.OnSharedPreferenceChangeListener mListener; 
SP = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); 

mListener = new SharedPreferences.OnSharedPreferenceChangeListener() { 
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 

     Toast.makeText(MainActivity.this, "Key changed: "+key, Toast.LENGTH_SHORT).show(); 
    } 
}; 

SP.registerOnSharedPreferenceChangeListener(mListener); 

Но когда я пытаюсь изменить значение ключа, как это. Он говорит, что не может решить метод findPreference. Я пробовал делать это с использованием контекста, но все же ошибка сохраняется.

private SharedPreferences SP, prefs; 
SharedPreferences.OnSharedPreferenceChangeListener mListener; 
SP = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); 

mListener = new SharedPreferences.OnSharedPreferenceChangeListener() { 
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 

      if (key.equals("username")) { 
       Preference pref = findPreference(key); 
       pref.setDefaultValue(prefs.getString(key, "bob")); } 
}; 
SP.registerOnSharedPreferenceChangeListener(mListener); 

Как мы можем импортировать определение метода в MainActivity. Пожалуйста, сообщите, способ, которым я меняю значение здесь, если это правильно?

Settings.java

import android.preference.PreferenceActivity; 
import android.preference.PreferenceFragment; 
import android.os.Bundle; 

public class Settings extends PreferenceActivity { 



    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit(); 
    } 

    public static class MyPreferenceFragment extends PreferenceFragment 
    { 
     PrefManager prefManager; 
     @Override 
     public void onCreate(final Bundle savedInstanceState) 
     { 
      super.onCreate(savedInstanceState); 
      addPreferencesFromResource(R.xml.preferences); 
     } 
    } 

} 

preferences.xml

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <EditTextPreference android:title="Your Name" 
     android:key="username" 
     android:summary="Please provide your username"> 
    </EditTextPreference> 


</PreferenceScreen> 

Я в принципе хочу, чтобы обновить Выбираю на странице настроек, когда SharedPreferences клавиши "username" становится изменение кода.

+0

Почему вы ожидаете это знать, что 'findPreference' это? Вы не заявили об этом (не в коде, который вы показали как минимум). Что вы пытаетесь сделать в первую очередь? Если вы можете рассказать мне больше, я могу помочь вам. – Sweeper

+0

Как сказал Sweeper, разместите свой код для поиска. В Anysays просто используйте префикс var, переданный в методе, чтобы изменить его. – Memme

+0

@Sweeper Я добавил свой файл settings.java и preferences.xml. И последняя строка говорит, чего я хочу достичь в MainActivity.java – impossible

ответ

2

Вы должны реализации PreferenceActivity в своей деятельности

Добавить extends PreferenceActivity перед вашим именем деятельности, а затем импортировать его имена:

public class MainActivity extends PreferenceActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ... 
    } 
} 

Для получения дополнительной информации смотрите на http://developer.android.com/reference/android/preference/PreferenceActivity.html

EDITED

Используйте следующий код:

public class Settings extends PreferenceActivity { 

    private SharedPreferences SP; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit(); 

     SharedPreferences.OnSharedPreferenceChangeListener mListener; 
     SP = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); 

    } 

    public static class MyPreferenceFragment extends PreferenceFragment implements 
      SharedPreferences.OnSharedPreferenceChangeListener{ 
     @Override 
     public void onCreate(final Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      addPreferencesFromResource(R.xml.preferences); 
     } 

     @Override 
     public void onResume() { 
      super.onResume(); 
      getPreferenceScreen().getSharedPreferences() 
        .registerOnSharedPreferenceChangeListener(this); 
     } 

     @Override 
     public void onPause() { 
      super.onPause(); 
      getPreferenceScreen().getSharedPreferences() 
        .unregisterOnSharedPreferenceChangeListener(this); 
     } 

     public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 
      if (key.equals("username")) { 
       Preference pref = findPreference(key); 
       pref.setDefaultValue(prefs.getString(key, "bob")); 
      } 
     } 
    } 
} 
+0

Я сделал 'MainActivity extends PreferenceActivity', и теперь' registerOnSharedPreferenceChangeListener' становится неизвестным классом. И 'findPreference' лишен. См. Дополнительные сведения, которые я добавил в вопросе, если вы получите подсказку. Спасибо за Ваш ответ. – impossible

+0

@ArewegoodQ Смотрите мое обновление, пожалуйста :) –

+0

Хорошо, но где мы слушаем? OnSharedPreferenceChangeListener или как использовать этот класс в моем приложении? Вы можете увидеть мои настройки.java уже имеет часть этого кода. Должен ли я добавить этот код там или как? – impossible

Смежные вопросы