Conforme descrito aqui , estou criando uma subclasse de PreferenceFragment e exibindo-o dentro de uma Activity. Esse documento explica como ouvir as mudanças de preferência aqui , mas apenas se você criar a subclasse PreferenceActivity. Já que não estou fazendo isso, como escuto as mudanças de preferência?
Eu tentei implementar OnSharedPreferenceChangeListener em meu PreferenceFragment, mas não parece funcionar ( onSharedPreferenceChanged
nunca parece ser chamado).
Este é o meu código até agora:
SettingsActivity.java
public class SettingsActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// Display the fragment as the main content.
getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
}
}
SettingsFragment.java
public class SettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener
{
public static final String KEY_PREF_EXERCISES = "pref_number_of_exercises";
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
{
//IT NEVER GETS IN HERE!
if (key.equals(KEY_PREF_EXERCISES))
{
// Set summary to be the user-description for the selected value
Preference exercisesPref = findPreference(key);
exercisesPref.setSummary(sharedPreferences.getString(key, ""));
}
}
}
preferências.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<EditTextPreference
android:defaultValue="15"
android:enabled="true"
android:key="pref_number_of_exercises"
android:numeric="integer"
android:title="Number of exercises" />
</PreferenceScreen>
Além disso, o PreferenceFragment é mesmo o lugar certo para ouvir as alterações de preferência ou devo fazê-lo dentro da Activity?
android
android-fragments
android-activity
sharedpreferences
android-preferences
XåpplI'-I0llwlg'I -
fonte
fonte
Respostas:
Acredito que você só precisa se registrar / cancelar o registro
Listener
no seuPreferenceFragment
e funcionará.Dependendo do que você deseja fazer, pode não ser necessário usar um ouvinte. As alterações nas preferências são confirmadas
SharedPreferences
automaticamente.fonte
getPreferenceManager
(como você fez) ougetPreferenceScreen
? Qual é a diferença?getPreferenceManager
geralmente é a opção preferida.key
deve ser o parâmetro? Não tentei isso, você tem um exemplo na resposta de Gunnar abaixo:onSharedPreferenceChanged(null, "")
. Pode não ser adequado às suas necessidades. Talvez você deva repetir nas suas chaves de preferências que precisam de uma atualizaçãoA solução do antew funciona bem, aqui você pode ver uma atividade de preferência completa para Android v11 em diante:
fonte
Todas as outras respostas estão corretas. Mas eu gosto mais dessa alternativa porque você tem imediatamente a instância Preference que causou a alteração.
fonte
onSharedPreferenceChanged ()
você possa acessar a instância Preference facilmente comfindPreference(key)
. Talvez oSharedPreferences
caminho seja o preferido por causa da coisa de registrar / cancelar o registro?Isso funcionou para mim de PreferenceFragment.onCreate ()
fonte
Aqui está uma maneira de fazer isso e evitar possíveis vazamentos de memória:
fonte
Outro exemplo completo para que você veja a imagem inteira.
fonte
Recentemente terminei de montar o meu próprio
PreferenceScreen
usando oPreferences API
, então pensei em contribuir com meu próprio exemplo completo. Isso inclui atualizar oSummary
para o valor novo / alterado, bem como ouvir e reagir às mudanças.PS. Para responder à sua última pergunta: Para mostrar um valor padrão para
Summary
na criação inicial dePreferenceScreen
(antes de qualquer alteração no valor), você pode simplesmente definir oandroid:summary
como um valor de sua escolha,preferences.xml
diretamente no arquivo - e, em seguida, uma vez lá é uma alteração no valor, ele será atualizado automaticamente usando o código contido no meu exemplo abaixo. Pessoalmente , uso uma breve explicação dePreference
como meuSummary
, situado dentro do meupreferences.xml
, e, em seguida, uma vez que o valor fazfor alterado pela primeira vez, ele simplesmente mostrará o valor atual como o aSummary
partir de então.De qualquer forma , aqui está meu exemplo completo :
SettingsFragment.java
Eu espero que isso ajude!
Qualquer feedback positivo é muito apreciado, pois sou bastante novo no StackOverflow;)
Boa programação!
fonte
onPause
, devesuper.onPause()
ser chamado antes ou depois de o ouvinte ter o registro cancelado? Existe alguma diferença? Eu vi os dois em vários exemplossuper.onPause();
é provavelmente a melhor maneira de fazer isso.Você só precisa delare a classe Prefernce especificada em seu
onResume()
método. No meu caso, eu estava usandoSwitchPreference
classe, portanto, o código seria como- SettingsActivity.classEntão, na atividade em que você deseja usar o
PrefernceFragment
valor, basta usar oSharedPreference
objeto para chamar os valores e acioná-lo.fonte