terça-feira, 7 de fevereiro de 2012

Criando uma tela de Configurações usando Shared Preferences


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:

@thiagoyb at 28 de setembro de 2012 às 02:23 disse...

mt showw consegui fazer :D vou acompanhar este blog, muito bom!!

Esrom Cataneo at 2 de abril de 2013 às 09:20 disse...

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

 
© 2011 Tutoriandroid | Recode by Ardhiansyam | Based on Android Developers Blog