Isso deve surgir com muita frequência.
Quando o usuário está editando preferências em um aplicativo Android, gostaria que eles pudessem ver o valor atualmente definido da preferência no Preference
resumo.
Exemplo: se eu tiver uma configuração de preferência para "Descartar mensagens antigas" que especifique o número de dias após os quais as mensagens precisam ser limpas. No PreferenceActivity
eu gostaria que o usuário visse:
"Descartar mensagens antigas" <- title
"Limpar mensagens após x dias" <- resumo onde x é o valor atual da Preferência
Crédito extra: torne isso reutilizável, para que eu possa aplicá-lo facilmente a todas as minhas preferências, independentemente do tipo (para que funcione com EditTextPreference, ListPreference etc. com uma quantidade mínima de codificação).
implements OnSharedPreferenceChangeListener
"%s"
paraListPreference
eListPreference.getSummary()
formatará o resumo com a entrada selecionada atual (ou""
se nenhuma).Aqui está a minha solução ... FWIW
fonte
EditTextPreference
éandroid:password="true"
ele mostra o valorif editTextPref.getText() == ""
)? Como obter um valor resumido emupdatePrefSummary
?p.getSummary()
eeditTextPref.getSummary()
retorne valores já modificados.PreferenceCategory
ePreferenceScreen
herdar dePreferenceGroup
, eu mudeiinitSummary
para lidar com um emPreferenceGroup
vez disso. Isso evita a necessidade de outro looponCreate()
. Mudança de comportamento: as PreferenceScreens aninhadas agora também são tratadas de forma recursiva.A documentação do Android diz que é possível usar um marcador de formatação de String em
getSummary()
:Simplesmente especificar
android:summary="Clean up messages after %s days"
na declaração XML ListPreference funcionou para mim.Nota: Isso funciona apenas para
ListPreference
.fonte
android:defaultValue="0"
no seu ListPreference. Esta é a resposta mais sensata e funciona para mim.defaultValue
o%s
não funcionam. Em outras versões, geralmente, ele funciona. Alguma solução, por favor? Eu com certeza não quero escrever uma classe personalizada para isso. Inacreditável que o Google faça das tarefas mais triviais uma dor.Se você usar
PreferenceFragment
, é assim que eu resolvi. É auto-explicativo.fonte
updatePreference
CODEif (preference instanceof EditTextPreference) { EditTextPreference editTextPref = (EditTextPreference) preference; preference.setSummary(editTextPref.getText()); }
graças @EddieBunregisterOnSharedPreferenceChangeListener
?findPreference(CharSequence key) This method was deprecated in API level 11. This function is not relevant for a modern fragment-based PreferenceActivity.
PreferenceActivity.findPreference
(e vários outros métodos), porque o Google quer que você mude para a técnica mostrada nesta resposta, que usa em seuPreferenceFragment.findPreference
lugar.Minha opção é estender o ListPreference e é limpo:
Então você adiciona seu settings.xml:
fonte
init()
função é necessária para atualizarsummary
quando o usuário altera essa preferência. Sem ele, ele permanecerá como a entrada foi inicialmente.Você pode substituir as classes de preferência padrão e implementar o recurso.
Mais tarde, no xml, você pode usar preferências personalizadas como
fonte
Depois de várias horas gasto para resolver esse problema, implementei este código:
[UPDATE: a lista da versão final]
Essa foi a única solução que funcionou bem para mim. Antes eu tentei subclassificar de ListPreferences e implementar o android: summary = "bla bla bla% s". Nem funcionou.
fonte
Talvez como ListPreference: Modifique getSummary para obter o que deseja:
E use isso no seu xml:
Assim, você pode escrever um resumo com
%s
o valor real.fonte
android.support.v7.preference.EditTextPreference
, isso não atualiza o resumo quando a preferência é alterada, apenas quando a atividade de preferências é criada. Uma maneira de contornar isso sem implementarOnSharedPreferenceChangeListener.onSharedPreferenceChanged
na classe de fragmento de preferências é também substituirandroid.support.v7.preference.EditTextPreference.setText(String text)
:@Override public void setText(String text) { super.setText(text); this.setSummary(this.getText()); }
Este é o código que você precisa para definir o resumo com o valor escolhido. Ele também define os valores na inicialização e respeita os valores padrão, não apenas na alteração. Apenas mude "R.layout.prefs" para seu arquivo xml e estenda o método setSummary às suas necessidades. Na verdade, trata apenas de ListPreferences, mas é fácil personalizar para respeitar outras Preferências.
koem
fonte
setOnPreferenceChangeListener(Preference.OnPreferenceChangeListener onPreferenceChangeListener)
método de Preferências individuais.Na verdade, CheckBoxPreference tem a capacidade de especificar um resumo diferente com base no valor da caixa de seleção. Consulte os atributos android: summaryOff e android: summaryOn (bem como os métodos CheckBoxPreference correspondentes).
fonte
Para EditTextPreference:
fonte
Se alguém ainda estiver procurando respostas para isso, verifique a resposta de trinta e três .
fonte
Obrigado por esta dica!
Eu tenho uma tela de preferências e quero mostrar o valor de cada preferência de lista como o resumo.
Este é o meu caminho agora:
Isso funciona para mim, mas estou me perguntando qual é a melhor solução (desempenho, estabilidade, escalabilidade): a que o Koem está mostrando ou esta?
fonte
Obrigado, Reto, pela explicação detalhada!
Caso isso ajude alguém, tive que alterar o código proposto por Reto Meier para que ele funcionasse com o SDK para Android 1.5
A mesma alteração se aplica à função de retorno de chamada
onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
Felicidades,
Chris
fonte
Resolvi o problema com o seguinte descendente de ListPreference:
Parece funcionar bem para mim em 1.6 até 4.0.4.
fonte
fonte
Vi todas as respostas votadas mostrarem como definir o resumo com o valor atual exato, mas o OP também queria algo como:
Aqui está a minha resposta para conseguir isso
Como a documentação diz sobre
ListPreference.getSummary()
:No entanto, tentei em vários dispositivos e parece não funcionar. Com algumas pesquisas, encontrei uma boa solução nesta resposta . Simplesmente consiste em estender cada
Preference
uso e substituiçãogetSummary()
para funcionar conforme especificado na documentação do Android.fonte
Se você deseja exibir apenas o valor de texto sem formatação de cada campo como seu resumo, o código a seguir deve ser o mais fácil de manter. Requer apenas duas alterações (linhas 13 e 21, marcadas com "alterar aqui"):
fonte
Aqui está a minha solução:
Crie um método de tipo 'getter' de preferência.
Crie um método 'setSummaryInit'.
Inicializar
Crie uma classe pública que PreferenceActivity e implemente OnSharedPreferenceChangeListener
fonte
Simplesmente:
fonte
PARA SUA INFORMAÇÃO:
Mais uma razão para olhar para a mancha lisa
Answer
do @ASD acima ( fonte encontrada aqui ) dizendo para usar%s
emandroid:summary
cada campo nopreferences.xml
. (O valor atual da preferência é substituído%s
.)fonte
Como na classe Preference androidx possui a interface SummaryProvider , isso pode ser feito sem o OnSharedPreferenceChangeListener. Implementações simples são fornecidas para EditTextPreference e ListPreference. Com base na resposta de EddieB , pode ser assim. Testado em androidx.preference: preferência: 1.1.0-alpha03.
fonte
De acordo com os documentos do Android, você pode usar os
app:useSimpleSummaryProvider="true"
componentes ListPreference e EditTextPreference.fonte
Aqui, todos estes são cortados da amostra Eclipse
SettingsActivity
. Eu tenho que copiar todos esses códigos demais para mostrar como esses desenvolvedores do Android escolhem perfeitamente o estilo de codificação mais generalizado e estável.Deixei os códigos para adaptar
PreferenceActivity
ao tablet e à API maior.xml/pref_general.xml
values/strings_activity_settings.xml
NOTA: Na verdade, eu só quero comentar como "A amostra do Google para PreferenceActivity também é interessante". Mas eu não tenho pontos de reputação suficientes. Então, por favor, não me culpe.
(Desculpe pelo mau inglês)
fonte
Você precisa usar a função bindPreferenceSummaryToValue no método onCreate.
Exemplo:
Consulte a lição 3 no curso Udacity Android: https://www.udacity.com/course/viewer#!/c-ud853/l-1474559101/e-1643578599/m-1643578601
fonte
Para EditTextPreference :
Cheguei a esta solução, é claro, apenas se você precisar de uma preferência específica por edittext, mas poderá fazer isso com todas as preferências:
............
............
Em seguida, em onResume ();
No:
fonte
Minha solução é criar um personalizado
EditTextPreference
, usado em XML como este:<com.example.EditTextPreference android:title="Example Title" />
EditTextPreference.java : -
fonte
Para definir o resumo de a
ListPreference
como o valor selecionado em uma caixa de diálogo, você pode usar este código:e faça referência ao
yourpackage.ListPreference
objeto em suapreferences.xml
lembrança para especificar lá o seu,android:defaultValue
pois isso aciona a chamada paraonSetInitialValue()
.Se desejar, você pode modificar o texto antes de ligar
setSummary()
para o que melhor se adequar ao seu aplicativo.fonte
Como estou usando um costume
PreferenceDataStore
, não consigo adicionar um ouvinte a alguns,SharedPreference
então tive que escrever uma solução um tanto hacky que escutasse cada preferência:fonte
Se você estiver usando o AndroidX, poderá usar um costume
SummaryProvider
. Essa abordagem pode ser usada para qualquerPreference
.Exemplo da documentação (Java):
Exemplo da documentação (Kotlin):
fonte