segunda-feira, 29 de agosto de 2011

Armazenando configurações no Android

Olá povo,

É muito comum armazenar configurações simples das nossas aplicações para que o usuário não tenha que setá-las toda vez que abrir o programa. No Android, podemos fazer isso através da interface SharedPreferences, com ela podemos salvar grupos de configurações para recuperá-las posteriormente.

// Obtém a instância da SharedPreference

SharedPreferences prefs =
PreferenceManager.getDefaultSharedPreferences(this);

// Salva dois valores nas preferências
SharedPreferences.Editor editor = prefs.edit();
editor.putString("operadora", "Claro");
editor.putBoolean("som", false);
editor.commit();

// Recupera os valores
String op = prefs.getString("operadora", null);
boolean som = prefs.getBoolean("som", false);


Ao salvar esses valores eles serão armazenados na pasta /data/data/pacote.da.sua.app/shared_prefs. O valores "Claro" e false serão armazenados para as configurações "operadora" e "som" respectivamente, e estarão lá mesmo que o usuário feche a aplicação. Eles só são apagados através do menu Configurações> Aplicações > Gerencias Aplicações > [Sua app] > Limpar dados.

Mas se eu quiser criar uma tela de configurações? O Android já tem uma API para facilitar (e padronizar) a criação de telas para esse propósito. Podemos defini-la como abaixo:

<PreferenceScreen

xmlns:android="http://schemas.android.com/apk/res/android"
<CheckBoxPreference
android:summaryOff="Som desabilitado"
android:key="som"
android:summaryOn="Som habilitado"
android:title="Som" />
<EditTextPreference
android:key="operadora"
android:dialogTitle="Operadora"
android:dialogMessage="Digite o nome da operadora"
android:title="Operadora" />
</PreferenceScreen>

Eu nomeei esse arquivo como tela_config.xml e salvei em res/xml. Notem que os atibutos android:key são iguais aos que foram especificados no código Java anterior. Para carregar esse arquivo, devemos ter uma classe que herda de PreferenceActivity como a seguir.

public class PreferenciasActivity

extends PreferenceActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.tela_config);
}
}

Você pode chamar essa tela como uma Activity comum, e quando os valores dessa tela forem alterados, automaticamente os valores já são salvos na SharedPreference, e consequentemente podem ser obtidos com o código mostrado mais acima. Dessa forma, não precisamos utilizar o SharedPreference.Editor para salvar as configurações ;)





Bem pessoal, esse foi um post bem rápido. Qualquer dúvida deixem seus comentários.

4br4ç05,
nglauber

3 comentários:

Julio Neves disse...

Massa Glauber, ontem eu utilizei este recurso no sistema que estou desenvolvendo para salvar o login e a senha do usuário.
O exemplo que peguei tem uma diferença discreta, ainda não tive tempo de pesquisar direito,mas o que usei foi algo com:
getPreferences(MODE_WORLD_READABLE);
getPreferences(MODE_WORLD_WRITEABLE);

Tem uma expicação simples para esta abordagem?

Nelson Glauber disse...

Oi Júlio,

Nessa maneira que você utilizou você passa o nome da configuração, que é o mesmo nome do arquivo XML que contém/conterá as preferências. O segundo parâmetro é a permissão deste arquivo. O modo MODE_WORLD_READABLE permite que qualquer aplicação leia, mas não escreva nesse arquivo de preferências, enquanto que MODE_WORLD_WRITEABLE permite a leitura e escrita a partir de outras aplicações.

No meu exemplo utilizei o nome default e a permissão padrão MODE_PRIVATE.

4br4ç05,
nglauber

Unknown disse...

Olá Glauber show de bola. =]