ListPreference com um número máximo de opções selecionáveis
-
19-09-2019 - |
Pergunta
Eu quero ter um elemento no meu menu de preferência que faça o seguinte:
- Mostre uma lista de opções.
- Muitos são selecionáveis
- Quantidade máxima de opções a serem escolhidas 2.
Possibilidades que eu pensei:
- Fazendo um separado
PreferenceScreen
e mostrando opções comocheckBoxes
, mas não sei onde colocar a lógica das opções max 2. - Estendendo -se
DialogPreference
e fazendo isso à mão.
Qual é a melhor maneira?
Solução
Estendendo -se DialogPreference
você o levaria mais próximo em termos de aparência e sensação; a Preference
As aulas são razoavelmente inacessíveis e não extensíveis em minha experiência.
Não me lembro muito sobre PreferenceScreen
, mas imagino que seja semelhante.
Em um aplicativo em que trabalhei, acabamos usando atividades separadas, lançadas via Intent
a partir de um Preference
Item OnClick. Isso nos permitiu desenvolver facilmente telas de preferência que exigem uma lógica de validação um pouco mais complexa do que a usual.
Outras dicas
Você pode colocar a lógica do máximo de duas opções em um OnSharedPreferenceChangeListener
.
Então você apenas ouve todas as preferências à medida que elas mudam e as atualizam se uma combinação inválida for selecionada.
Portanto, seu código seria algo como o seguinte:
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) {
//Code to calcuate how many are selected
int code = numberSelected();
if (count > 2) {
sharedPreferences.edit().putBoolean(key,false).commit();
Toast.makeText(this,"Can't select more than two!",Toast.LENGTH_LONG).show();
}
}
Se você criar o seu próprio PreferenceActivity
isso implementa OnSharedPreferenceChangeListener
Você pode permitir que o ouvinte esteja ouvindo apenas quando necessário fazer algo assim:
@Override
protected void onResume() {
super.onResume();
//Register the listener
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onPause() {
super.onPause();
// Unregister the listener
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}