Semana passada fiz um tutorial explicando como usar SQLite para persistência de dados. Nele fiz uma introdução sobre a persistência de dados em geral no Android e comentei sobre Shared Preferences e como era possível criar uma tela de configurações/preferencias com isso. Hoje irei a fundo nesse assunto e mostrarei como criar essa tela passo a passo e como usar as informações ali guardada.
Shared Preferences permite a persistência de tipos primitivos de dados na forma de chave-valor, ou seja, para cada tipo primitivo que você for salvar (int, long, string, boolean, float) você precisa associar um identificador chave (string) a ele. Desta forma seu uso é bastante interessante em informações únicas do aplicativo, tais como configurações e preferências, mas não recomendado para guardar grandes informações, geralmente associadas a objetos. Para isso recomenda-se o uso de SQLite.
Criar uma activity (tela) de configuração usando as facilidades disponibilizadas pelo Shared Preferences é um pouco diferente de criar uma activity comum. Primeiramente pois não definimos o layout propriamente dito, definimos os itens que queremos exibidos nas opções. Então vamos criar o configuracoes.xml na pasta res/xml (crie-a se não existir):
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:key="@string/pref_category_geral_key"
android:title="@string/pref_category_geral_title">
<ListPreference android:key="@string/pref_lang_key"
android:title="@string/idioma"
android:entries="@array/idiomas"
android:entryValues="@array/idiomas_value" />
<EditTextPreference android:key="@string/pref_default_number_key"
android:dialogTitle="@string/pref_default_number_title"
android:dialogMessage="@string/pref_default_number_message"
android:summary="@string/pref_default_number_summary"
android:title="@string/pref_default_number_title"
android:defaultValue=""/>
<CheckBoxPreference android:key="@string/op_salvar_key"
android:title="@string/oferecer_salvar_telefone"
android:summary="@string/quando_enviar_mensagem_para_numero_nao_salvo"
android:defaultValue="true" />
<Preference android:key="@string/noads_key"
android:title="@string/noads_title"
android:defaultValue="false"
android:shouldDisableView="true" />
</PreferenceCategory>
<PreferenceCategory android:key="@string/notification_category"
android:title="@string/notificacoes">
<RingtonePreference android:key="@string/notification_ring_key"
android:ringtoneType="all"
android:title="@string/selecionar_campainha"/>
<CheckBoxPreference android:key="@string/vibrar_key"
android:title="@string/vibrar"
android:defaultValue="true" />
</PreferenceCategory>
</PreferenceScreen>
Okay... É um exemplo complexo, mas estou usando-o para mostrar as possibilidades (também essa é a tela apresentada na imagem lá em cima). Vamos por partes:
- PreferenceCategory são as categorias da nossa tela de configuração. No nosso caso temos Geral e Notificações;
- ListPreference exibe uma lista com itens para que o usuário escolha;
- EditTextPreference exibe um dialog para que o usuário entre com alguma informação de forma mais livre;
- CheckBoxPreference permite dois estados: marcado ou não (boolean);
- Preference é uma preferência genérica. O comportamento dela você irá definir no código da activity;
- RingtonePreference exibe uma lista com os possíveis ringtones para o usuário escolher;
- android:key é a chave de identificação da preferencia (lembra do sistema chave-valor?). Toda preferencia tem que ter;
- android:title é o título que aparecerá bem grande nomeando a preferencia;
- android:summary é a pequena descrição que aparece em baixo do titulo. Comumente usada para indicar o atual estado da preferencia.
- android:defaultValue é o valor que será usado caso ainda não se tenha definido nenhum valor.
Vamos agora criar o código de nossa activity. Criaremos o seguinte ConfiguracoesAcitivity.java (não reflete exatamente o xml pois seria muito grande):
public class Configuracoes extends PreferenceActivity{
EditTextPreference telFavorito; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.configuracoes);
telFavorito = (EditTextPreference)findPreference(getString(R.string.pref_default_number_key)); telFavorito.getEditText().setKeyListener(DigitsKeyListener.getInstance()); String tel = telFavorito.getText(); telFavorito.setSummary(tel.equals("") ? getString(R.string.pref_default_number_summary) : tel); telFavorito.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { telFavorito.setSummary(newValue.toString()); return true; } }); }}
Não esqueça de declarar a activity no manifest! Se o comportamento da sua tela de configurações for todo estático, a unica coisa que você precisa é estender PreferenceActivity e dizer onde estar o recurso em xml que será carregado através de addPreferencesFromResource. O que estamos fazendo nesse código, além do básico, é pegar o EditTextPreference de forma análoga como fazemos com uma view, definir que ele só aceita dígitos numéricos como entrada, colocando o sumary dele como o valor atual dele (ou a mensagem explicativa se ainda não tiver nenhum valor) e definindo para que toda vez que mudarem essa preferencia, mudar também o sumary para que fique com o valor recém colocado.
Pronto! Você não precisa mandar salvar valor, ele já faz isso automaticamente. Fácil não? E como faz para acessar esses dados em qualquer lugar da aplicação? Muito simples! Basta recuperar uma instancia de SharedPreferences através do comando:
SharedPreferences preference = PreferenceManager.getDefaultSharedPreferences(Context);
E usar essa instância para chamar os métodos getInt, getString, getFloat, getBoolean, etc.. Sempre passando como parâmetro a chave utilizada e o valor default (caso não tenha sido definido nenhum valor ainda). Por exemplo:
boolean vibrar = preference.getBoolean(getString(R.string.vibrar_key), true);
E para editar? Usamos também essa instância para pegar o objeto Editor:
SharedPreferences.Editor editor = preference.edit();
Com ele podemos usar os métodos de inserção putInt, putString, putBoolean, etc. Sempre usando a chave, claro. Por exemplo:
editor.putBoolean(getString(R.string.vibrar_key), false);
Setamos como false a preferência 'Vibrar'. Não esquecer de dar o commit() no editor para que as alterações sejam salvas:
editor.commit();
Pronto! Vale avisar que há outros métodos de recuperar as Preferências mas esse é o que acho mais fácil e o que eu uso. Leia a referencia para maiores informações.
2 comentários:
mt showw consegui fazer :D vou acompanhar este blog, muito bom!!
site muito bom, espero que não desanimem e eu se souber algo vou contribuir mas no momento só tenho um launcher rsrsrs abraços.
Postar um comentário