SlideShare uma empresa Scribd logo
William Costa
Settings Activities
Criando atividades de configuração para aplicações Android
@william-costa william@webart.com.br
Agenda
• Preferências e configurações
• APIs Preference
• Tipos de dados
• Tipos de preferências
• Criando uma SettingsActivity
• Agrupando preferências
• Definindo valores padrões
• Utilizando preferências do usuário
• OnPreferenceChangeListener
• Restaurando valores padrões
Preferências e
configurações
Preferências e configurações
Configuração ou preferência, é a modificação de características e/ou comportamentos de
uma aplicação, de forma personalizada, pelo usuário.
APIs Preference
APIs Preference
Para fornecer configurações ao aplicativo, é preciso usar as APIs Preference do Android
para programar uma interface coerente com a experiência do usuário em outros aplicativos
Android.
Em vez de usar objetos View para
criar a interface do usuário, as
configurações são criadas por
meio de várias subclasses da
classe Preference declaradas em
um arquivo XML.
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference
android:key="checkboxPreference"
android:title="CheckboxPreference"
android:summary="Valor boolean"/>
</PreferenceScreen>
É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
APIs Preference
Cada Preference aparece como um item em uma lista, e oferece a interface para que o
usuário modifique a configuração .
Cada configuração possui um grupo de chave-valor, e é salva pela API em um arquivo
SharedPreference, assim que o usuário executa uma alteração.
Não é recomendado que este arquivo sofra interações diretas, a menos que seja um
processo de leitura ou de limpeza dos dados guardados.
Tipos de dados
Tipos de dados
O valor salvo em SharedPreferences para cada configuração pode ser um dos seguintes
tipos de dados:
• Boolean
• Float
• Int
• Long
• String
• String set (array de strings)
Tipos de preferências
Tipos de preferências
Toda a configuração do aplicativo é representada por uma subclasse específica da classe
Preference. Cada subclasse contém um conjunto de propriedades essenciais que permitem
especificar itens, como o título da configuração e o valor padrão.
Cada subclasse também oferece suas propriedades e interface do usuário especializadas.
CheckBoxPreference
Exibe um item com uma caixa de seleção para uma
configuração que esteja ativada ou desativada. O
valor salvo é um booleano.
<CheckBoxPreference
android:key="checkboxPreference"
android:title="CheckboxPreference"
android:summary="Valor boolean"/>
É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
ListPreference
Abre uma caixa de diálogo com uma lista de botões de
opção.
Necessita de um array de strings para os valores e
rótulos das opções.
<string-array name="idiomasValores">
<item>pt-br</item>
<item>en</item>
<item>fr</item>
</string-array>
<string-array name="idiomas">
<item>Português</item>
<item>Inglês</item>
<item>Francês</item>
</string-array>
ListPreference
O valor salvo pode ser qualquer um dos tipos de
valor compatíveis.
<ListPreference
android:key="idioma"
android:title="Idioma principal"
android:summary="Valor do idioma"
android:entries="@array/idiomas"
android:entryValues="@array/idiomasValores" />
É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
EditTextPreference
Abre uma caixa de diálogo com um widget EditText.
O valor salvo nesta chave é uma string.
<EditTextPreference
android:key="apelido"
android:title="Apelido"
android:dialogTitle="Adicione um apelido"
android:dialogMessage="Nome que aparecerá nas postagens"/>
É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
MultiSelectListPreference
Abre uma caixa de diálogo com uma lista de
checkboxes para seleção.
Necessita de um array de strings para os valores e
outro para os rótulos.
<string-array name="alertasValores">
<item>marcacao-post</item>
<item>nova-mensagem</item>
<item>solicitacao-jogos</item>
</string-array>
<string-array name="alertas">
<item>Marcação em post</item>
<item>Nova mensagem</item>
<item>Solicitação de jogos</item>
</string-array>
MultiSelectListPreference
O valor salvo nesta chave é um array com os valores
selecionados no diálogo.
<MultiSelectListPreference
android:title="Alertas"
android:summary="Definição dos alertas"
android:dialogTitle="Alertas"
android:key="alertas"
android:entries="@array/alertas"
android:entryValues="@array/alertasValores"/>
É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
SwitchPreference
Configuração com interruptor booleano para ligar ou
desligar uma opção.
<SwitchPreference
android:key="mostrarBarraLateral"
android:title="Mostrar Barra lateral"
android:summary="Barra de opções lateral"/>
É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
<Preference
android:title="Mais informações de contrato"
android:key="maisInformacoes"
android:summary="Acesse os dados na integra"/>
Preference
Preferência personalizada, utilizada normalmente
para ações simples, como o clique em um botão.
É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
É hora de praticar!
Iniciando nossa aplicação
Projeto
Conteúdo do projeto:
• XML PreferenceScreen
Responsável por definir quais preferências poderão ser alteradas
• SettingsFragment
Classe responsável por carregar as preferências do XML de preferências
• SettingsActivity
Activity responsável por chamar a classe SettingsFragment
• MainActivity
Activity principal do app que exibirá o botão para abrir as configurações
XML PreferenceScreen
Crie um novo diretório com o nome “xml” dentro do diretório res.
XML PreferenceScreen
Crie um novo arquivo dentro do diretório xml e dê o nome de preferences.
XML PreferenceScreen
Ao criar o arquivo preferences.xml, já é criada a classe PreferenceScreen:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
...
</PreferenceScreen>
XML PreferenceScreen
Adicione uma SwitchPreference:
...
<SwitchPreference
android:key="mostrarBarraLateral"
android:title="Mostrar Barra lateral"
android:summary="Barra de opções lateral"/>
...
É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
XML PreferenceScreen
Adicione duas CheckBoxPreferences:
...
<CheckBoxPreference
android:key="atualizarAutomaticamente"
android:title="Atualizar automaticamente"
android:summary="Define se o app irá buscar atualizaçoes"/>
<CheckBoxPreference
android:key="receberBoletinsInformativos"
android:title="Receber boletins informativos"
android:summary="Define se o app receberá mensagens da newsletter"/>
...
É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
XML PreferenceScreen
Adicione uma EditTextPreference:
...
<EditTextPreference
android:key="apelido"
android:title="Apelido"
android:summary="Como gostaria de ser chamado"
android:dialogTitle="Adicione um apelido"
android:dialogMessage="Nome que aparecerá nas postagens"/>
...
É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
XML PreferenceScreen
Para adicionar uma ListPreference é necessário adicionar dois arrays de strings, um com valores e outro
com textos para os rótulos.
Crie um novo arquivo xml dentro do diretório values e de o nome de arrays:
XML PreferenceScreen
No arquivo arrays.xml adicione os arrays de idiomas:
...
<string-array name="idiomasValores">
<item>pt-br</item>
<item>en</item>
<item>fr</item>
</string-array>
<string-array name="idiomas">
<item>Português</item>
<item>Inglês</item>
<item>Francês</item>
</string-array>
...
XML PreferenceScreen
Voltando ao arquivo preferences.xml adicione uma ListPreference:
...
<ListPreference
android:key="idioma"
android:title="Idioma principal"
android:summary="Idioma dos textos do app"
android:entries="@array/idiomas"
android:entryValues="@array/idiomasValores" />
...
É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
SettingsFragment
Para carregar as preferências do arquivo
preferences.xml é necessário criar uma
classe que estenda PreferenceFragment.
Crie uma nova classe e dê o nome de
SettingsFragment.
SettingsFragment
Edite a classe SettingsFragment e estenda-a de PreferenceFragment.
import android.preference.PreferenceFragment;
public class SettingsFragment extends PreferenceFragment {
...
}
SettingsFragment
Adicione os métodos abaixo à classe SettingsFragments para que seja possível carregar as preferências do
arquivo preferences.xml:
...
@NonNull
public static SettingsFragment newInstance() {
return new SettingsFragment();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
...
SettingsActivity
Crie uma nova Empty Activity e de o nome de SettingsActivity
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class SettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
}
}
SettingsActivity
Remova a linha que adiciona o layout da activity do método onCreate:
...
@Override
public void onCreate(Bundle savedInstanceState) {
...
Fragment fragment =
getFragmentManager().findFragmentById(android.R.id.content);
...
}
...
setContentView(R.layout.activity_settings);
...
E adicione uma nova instancia de Fragment ao método onCreate, obtendo do gerenciador de
fragmentos, o fragmento de preferências do aplicativo:
SettingsActivity
Ao importar a classe Fragment, o Android Studio usa automaticamente a classe de suporte à versões anteriores
do android, como a linha abaixo:
import android.support.v4.app.Fragment;
Caso a instancia de Fragment apresente problemas, substitua a linha acima por:
import android.app.Fragment;
SettingsActivity
Ainda no método onCreate, adicione a condição criar ou substituir o fragmento de preferências:
...
if (fragment == null) {
getFragmentManager().beginTransaction()
.add(android.R.id.content, SettingsFragment.newInstance())
.commit();
} else {
getFragmentManager().beginTransaction()
.replace(android.R.id.content, SettingsFragment.newInstance())
.commit();
}
...
MainActivity
Adicione um botão para abrir as configurações.
<LinearLayout ...>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Abrir Configurações"
android:id="@+id/btnConfiguracoes"/>
</LinearLayout>
É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
MainActivity
No método onCreate da classe MainActivity, adicione um onClickListener para o botão, para
criar uma intenção e chamar a classe SettingsActivity.
...
Button btnConfiguracoes = (Button) findViewById(R.id.btnConfiguracoes);
btnConfiguracoes.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,
SettingsActivity.class);
startActivity(intent);
}
});
Agrupando preferências
Agrupando preferências
Agrupar preferências é uma forma de deixar a interface do
usuário mais organizada, definindo melhor o escopo de cada
preferência.
Para agrupar, ou categorizar as preferências, é utilizada a classe
PreferenceCategory, onde é possível definir um título para a
categoria e colocar todas as preferências que estarão nesse
grupo dentro dos limites de seus nós.
<PreferenceCategory android:title="Sistema">
...
</PreferenceCategory>
É hora de praticar!
Agrupando preferências
Agrupando preferências
Crie três grupos/categorias de preferências com os títulos: Usuário, Sistema e Outros.
<PreferenceCategory android:title="Usuário">
<!-- EditTextPreference Apelido -->
</PreferenceCategory>
<PreferenceCategory android:title="Sistema">
<!-- ListPreference Idioma -->
<!-- SwitchPreference Barra Lateral -->
</PreferenceCategory>
<PreferenceCategory android:title="Outros">
<!-- CheckBoxPreference Atualizações -->
<!-- CheckBoxPreference Boletins -->
</PreferenceCategory>
Definindo valores
padrões
Definindo valores padrões
Para definir valores padrões para as preferências, basta adicionar o parâmetro
defaultValue, atentando-se ao tipo de valor de cada preferência.
<SwitchPreference
...
android:defaultValue="true"/>
<EditTextPreference
...
android:defaultValue="William Costa"/>
Utilizando preferências do usuário
Utilizando preferências do usuário
A leitura das configurações é extremamente simples, e para isso é utilizada a classe
SharedPreference, que oferece métodos específicos para cada tipo de dado que precisamos obter.
• getAll();
Retorna todas as preferências
• getBoolean(String key, boolean default);
Retorna um valor do tipo boolean
• getFloat(String key, float default);
Retorna um valor do tipo float
• getInt(String key, int default);
Retornar um valor do tipo int
• getLong(String key, long default);
Retorna um valor do tipo long
• getString(String key, String default);
Retorna um valor do tipo String
• getStringSet(String key, Set<String> default);
Retorna uma coleção de strings
É hora de praticar!
Utilizando preferências do usuário
Utilizando preferências do usuário
Adicione duas novas propriedades à classe PreferenceFragments: uma instancia de
SharedPreferences, para que seja possível manipular as informações do arquivo; e uma
instancia de Preference, que será usada para aplicar a preferência do usuário ao subtítulo
da preferência apelido.
...
protected SharedPreferences sharedPreferences;
protected Preference apelido;
...
Utilizando preferências do usuário
No método onCreate, será solicitado ao gerenciador de preferências o arquivo de preferências
padrão, para isso defina a instancia de SharedPreferences com o arquivo padrão e busque na
PreferenceScreen pela preferência com a chave apelido.
...
sharedPreferences =
PreferenceManager.getDefaultSharedPreferences(getActivity());
apelido = findPreference("apelido");
...
Utilizando preferências do usuário
Ainda no método onCreate, utilize o método getString() da classe SharedPreferences e
obtenha o valor da preferência com a chave apelido.
...
apelido.setSummary(sharedPreferences.getString("apelido",""));
...
OnPreferenceChangeListener
OnPreferenceChangeListener
Para executar uma ação após uma preferência ser alterada é adicionado um listener na
preferência, e nele são executadas as ações com os novos valores.
Ao utilizar o método onPreferenceChange deste listener, são informados dois parâmetros:
uma instancia de Preference com a preferência que foi alterada e uma instancia genérica
de Object com o novo valor da preferência.
...
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
...
return true;
}
...
É hora de praticar!
OnPreferenceChangeListener
OnPreferenceChangeListener
Adicione o listener abaixo ao método onCreate de SettingsFragment.
...
apelido.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
preference.setSummary((String) newValue);
return true;
}
});
...
Restaurando valores
padrões
Restaurando valores padrões
Não há um meio direto para restaurar os valores padrões das preferências. Para isso, é necessário
acessar e limpar o arquivo SharedPreferences, obrigando o sistema a utilizar os valores padrões de
cada preferência.
Para limpar o arquivo basta utilizar o método clear() da classe SharedPreferences e aplicar as
alterações.
Após a limpeza, caso algum elemento da activity utilize uma preferência, deve ser recarregado, para
evitar que o antigo valor continue aplicado.
Restaurando valores padrões
Adicione uma preferência personalizada ao grupo outros do arquivo preferences.xml para
que seja utilizada com um “botão” onde será aplicado um OnPreferenceClickListener para
limpar o arquivo de preferências.
...
<Preference
android:title="Restaurar preferências"
android:key="restaurar"
android:summary="Limpe os dados e retorne os valores padrões"/>
...
...
restaurar = findPreference("restaurar");
restaurar.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener()
{
@Override
public boolean onPreferenceClick(Preference preference) {
...
return true;
}
});
...
Restaurando valores padrões
Adicione a propriedade abaixo à classe SettingsFragments:
...
protected Preference restaurar;
...
No método onCreate, defina a instancia para a preferência, buscando a chave restaurar na
PreferenceScreen e implemente o OnPreferenceClickListener:
Restaurando valores padrões
É importante, que o usuário confirme a ação de limpeza das preferências antes de sua
execução.
Para isso, adicione um AlertDialog dentro do listener da preferência.
...
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Restaurar preferências")
.setMessage("As preferências não poderão ser recuperadas")
.setNegativeButton("Cancelar", null);
...
Restaurando valores padrões
Defina a ação do botão de confirmação, para que depois possa ser executada a ação de
limpeza dos dados do arquivo SharedPreferences:
...
builder.setPositiveButton("Restaurar", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
...
}
});
...
Restaurando valores padrões
Dentro do método onClick do listener do botão de confirmação, adicione a ação de limpeza
do arquivo SharedPreferences utilizando a mesma instancia da classe SharedPreferences
que foi utilizada na leitura dos dados e logo depois executar o método para que a activity
atual seja recriada, atualizando as opções das preferências.
...
sharedPreferences.edit().clear().apply();
getActivity().recreate();
...
Restaurando valores padrões
Por fim, crie e exiba o AlertDialog, para que as ações possam ser executadas:
...
AlertDialog dialog = builder.create();
dialog.show();
...
Dúvidas?
Referências
ANDROID (EUA). Android.Preference. Disponível em:
<https://developer.android.com/reference/android/preference/package-summary.html>. Acesso em: 15 set. 2017.
ANDROID (EUA). PreferenceActivity. Disponível em:
<https://developer.android.com/reference/android/preference/PreferenceActivity.html>. Acesso em: 16 set. 2017.
ARAÚJO, Hygor Xavier. Como criar uma tela de configurações no android. 2017. Disponível em:
<https://medium.com/@hygorxaraujo/como-criar-uma-tela-de-configurações-no-android-140b1a400895>. Acesso em: 16
set. 2017.
ANDROID (EUA). SharedPreferences.Editor. Disponível em:
<https://developer.android.com/reference/android/content/SharedPreferences.Editor.html>. Acesso em: 17 set. 2017.
ANDROID (EUA). Configuracoes. Disponível em: <https://developer.android.com/guide/topics/ui/settings.html?hl=pt-br>.
Acesso em: 17 set. 2017.
Obrigado!
William Costa
@william-costa william@webart.com.br

Mais conteúdo relacionado

Semelhante a Settings Activities - Criando atividades de configuração para aplicações Android

Desenvolvimento de Apps e Games para Android - Parte 7
Desenvolvimento de Apps e Games para Android - Parte 7Desenvolvimento de Apps e Games para Android - Parte 7
Desenvolvimento de Apps e Games para Android - Parte 7
Erisvaldo Junior
 
Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5
Erisvaldo Junior
 
Programando Android - Aula 3
Programando Android - Aula 3Programando Android - Aula 3
Programando Android - Aula 3
Kalil Maciel
 
Asp.net.data
Asp.net.dataAsp.net.data
Asp.net.data
Hélder Oliveira
 
Hello World Android
Hello World AndroidHello World Android
Hello World Android
Everton Dewes
 
hibernate annotation
hibernate annotationhibernate annotation
hibernate annotation
eduardo dias
 
TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch
TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e ElasticsearchTDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch
TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch
tdc-globalcode
 
Como criar um plugin para WordPress
Como criar um plugin para WordPressComo criar um plugin para WordPress
Como criar um plugin para WordPress
Leandrinho Vieira
 
Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...
Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...
Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...
Tchelinux
 
3 a-ac-conceitos fundamentais
3 a-ac-conceitos fundamentais3 a-ac-conceitos fundamentais
3 a-ac-conceitos fundamentais
Fabiula Floripa
 
Curso de Android - aula 3
Curso de Android - aula 3Curso de Android - aula 3
Curso de Android - aula 3
Jose Berardo
 
Como usar a documentação da API Java 2
Como usar a documentação da API Java 2Como usar a documentação da API Java 2
Como usar a documentação da API Java 2
Denis L Presciliano
 
Workshop Django
Workshop DjangoWorkshop Django
Workshop Django
Sérgio Santos
 
Banco de Dados XML
Banco de Dados XMLBanco de Dados XML
Banco de Dados XML
Tiago R. Sampaio
 
PDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETPDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NET
slides_teltools
 
Desenvolvimento de apps e games para android parte 8
Desenvolvimento de apps e games para android   parte 8Desenvolvimento de apps e games para android   parte 8
Desenvolvimento de apps e games para android parte 8
Erisvaldo Junior
 
98796699 selenium-framework
98796699 selenium-framework98796699 selenium-framework
98796699 selenium-framework
André Caldas
 
Grails
GrailsGrails
Hibernate conceitos
Hibernate conceitosHibernate conceitos
Hibernate conceitos
Elifranio Alves Cruz
 
Ruby & Rails
Ruby & RailsRuby & Rails
Ruby & Rails
Sergio Henrique
 

Semelhante a Settings Activities - Criando atividades de configuração para aplicações Android (20)

Desenvolvimento de Apps e Games para Android - Parte 7
Desenvolvimento de Apps e Games para Android - Parte 7Desenvolvimento de Apps e Games para Android - Parte 7
Desenvolvimento de Apps e Games para Android - Parte 7
 
Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5
 
Programando Android - Aula 3
Programando Android - Aula 3Programando Android - Aula 3
Programando Android - Aula 3
 
Asp.net.data
Asp.net.dataAsp.net.data
Asp.net.data
 
Hello World Android
Hello World AndroidHello World Android
Hello World Android
 
hibernate annotation
hibernate annotationhibernate annotation
hibernate annotation
 
TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch
TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e ElasticsearchTDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch
TDC2016POA | Trilha PHP - Desenvolvendo um buscador com PHP e Elasticsearch
 
Como criar um plugin para WordPress
Como criar um plugin para WordPressComo criar um plugin para WordPress
Como criar um plugin para WordPress
 
Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...
Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...
Desenvolvendo um buscador com PHP e Elasticsearch - Fernando Silva - Tchelinu...
 
3 a-ac-conceitos fundamentais
3 a-ac-conceitos fundamentais3 a-ac-conceitos fundamentais
3 a-ac-conceitos fundamentais
 
Curso de Android - aula 3
Curso de Android - aula 3Curso de Android - aula 3
Curso de Android - aula 3
 
Como usar a documentação da API Java 2
Como usar a documentação da API Java 2Como usar a documentação da API Java 2
Como usar a documentação da API Java 2
 
Workshop Django
Workshop DjangoWorkshop Django
Workshop Django
 
Banco de Dados XML
Banco de Dados XMLBanco de Dados XML
Banco de Dados XML
 
PDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETPDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NET
 
Desenvolvimento de apps e games para android parte 8
Desenvolvimento de apps e games para android   parte 8Desenvolvimento de apps e games para android   parte 8
Desenvolvimento de apps e games para android parte 8
 
98796699 selenium-framework
98796699 selenium-framework98796699 selenium-framework
98796699 selenium-framework
 
Grails
GrailsGrails
Grails
 
Hibernate conceitos
Hibernate conceitosHibernate conceitos
Hibernate conceitos
 
Ruby & Rails
Ruby & RailsRuby & Rails
Ruby & Rails
 

Último

Segurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas PráticasSegurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas Práticas
Danilo Pinotti
 
Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
joaovmp3
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
Momento da Informática
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
TomasSousa7
 
Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
WELITONNOGUEIRA3
 
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
Faga1939
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
Momento da Informática
 
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdfDESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
Momento da Informática
 

Último (8)

Segurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas PráticasSegurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas Práticas
 
Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
 
Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
 
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
 
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdfDESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
 

Settings Activities - Criando atividades de configuração para aplicações Android

  • 1. William Costa Settings Activities Criando atividades de configuração para aplicações Android @william-costa william@webart.com.br
  • 2. Agenda • Preferências e configurações • APIs Preference • Tipos de dados • Tipos de preferências • Criando uma SettingsActivity • Agrupando preferências • Definindo valores padrões • Utilizando preferências do usuário • OnPreferenceChangeListener • Restaurando valores padrões
  • 4. Preferências e configurações Configuração ou preferência, é a modificação de características e/ou comportamentos de uma aplicação, de forma personalizada, pelo usuário.
  • 6. APIs Preference Para fornecer configurações ao aplicativo, é preciso usar as APIs Preference do Android para programar uma interface coerente com a experiência do usuário em outros aplicativos Android. Em vez de usar objetos View para criar a interface do usuário, as configurações são criadas por meio de várias subclasses da classe Preference declaradas em um arquivo XML. <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <CheckBoxPreference android:key="checkboxPreference" android:title="CheckboxPreference" android:summary="Valor boolean"/> </PreferenceScreen> É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
  • 7. APIs Preference Cada Preference aparece como um item em uma lista, e oferece a interface para que o usuário modifique a configuração . Cada configuração possui um grupo de chave-valor, e é salva pela API em um arquivo SharedPreference, assim que o usuário executa uma alteração. Não é recomendado que este arquivo sofra interações diretas, a menos que seja um processo de leitura ou de limpeza dos dados guardados.
  • 9. Tipos de dados O valor salvo em SharedPreferences para cada configuração pode ser um dos seguintes tipos de dados: • Boolean • Float • Int • Long • String • String set (array de strings)
  • 11. Tipos de preferências Toda a configuração do aplicativo é representada por uma subclasse específica da classe Preference. Cada subclasse contém um conjunto de propriedades essenciais que permitem especificar itens, como o título da configuração e o valor padrão. Cada subclasse também oferece suas propriedades e interface do usuário especializadas.
  • 12. CheckBoxPreference Exibe um item com uma caixa de seleção para uma configuração que esteja ativada ou desativada. O valor salvo é um booleano. <CheckBoxPreference android:key="checkboxPreference" android:title="CheckboxPreference" android:summary="Valor boolean"/> É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
  • 13. ListPreference Abre uma caixa de diálogo com uma lista de botões de opção. Necessita de um array de strings para os valores e rótulos das opções. <string-array name="idiomasValores"> <item>pt-br</item> <item>en</item> <item>fr</item> </string-array> <string-array name="idiomas"> <item>Português</item> <item>Inglês</item> <item>Francês</item> </string-array>
  • 14. ListPreference O valor salvo pode ser qualquer um dos tipos de valor compatíveis. <ListPreference android:key="idioma" android:title="Idioma principal" android:summary="Valor do idioma" android:entries="@array/idiomas" android:entryValues="@array/idiomasValores" /> É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
  • 15. EditTextPreference Abre uma caixa de diálogo com um widget EditText. O valor salvo nesta chave é uma string. <EditTextPreference android:key="apelido" android:title="Apelido" android:dialogTitle="Adicione um apelido" android:dialogMessage="Nome que aparecerá nas postagens"/> É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
  • 16. MultiSelectListPreference Abre uma caixa de diálogo com uma lista de checkboxes para seleção. Necessita de um array de strings para os valores e outro para os rótulos. <string-array name="alertasValores"> <item>marcacao-post</item> <item>nova-mensagem</item> <item>solicitacao-jogos</item> </string-array> <string-array name="alertas"> <item>Marcação em post</item> <item>Nova mensagem</item> <item>Solicitação de jogos</item> </string-array>
  • 17. MultiSelectListPreference O valor salvo nesta chave é um array com os valores selecionados no diálogo. <MultiSelectListPreference android:title="Alertas" android:summary="Definição dos alertas" android:dialogTitle="Alertas" android:key="alertas" android:entries="@array/alertas" android:entryValues="@array/alertasValores"/> É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
  • 18. SwitchPreference Configuração com interruptor booleano para ligar ou desligar uma opção. <SwitchPreference android:key="mostrarBarraLateral" android:title="Mostrar Barra lateral" android:summary="Barra de opções lateral"/> É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
  • 19. <Preference android:title="Mais informações de contrato" android:key="maisInformacoes" android:summary="Acesse os dados na integra"/> Preference Preferência personalizada, utilizada normalmente para ações simples, como o clique em um botão. É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
  • 20. É hora de praticar! Iniciando nossa aplicação
  • 21.
  • 22.
  • 23.
  • 24.
  • 25. Projeto Conteúdo do projeto: • XML PreferenceScreen Responsável por definir quais preferências poderão ser alteradas • SettingsFragment Classe responsável por carregar as preferências do XML de preferências • SettingsActivity Activity responsável por chamar a classe SettingsFragment • MainActivity Activity principal do app que exibirá o botão para abrir as configurações
  • 26. XML PreferenceScreen Crie um novo diretório com o nome “xml” dentro do diretório res.
  • 27. XML PreferenceScreen Crie um novo arquivo dentro do diretório xml e dê o nome de preferences.
  • 28. XML PreferenceScreen Ao criar o arquivo preferences.xml, já é criada a classe PreferenceScreen: <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> ... </PreferenceScreen>
  • 29. XML PreferenceScreen Adicione uma SwitchPreference: ... <SwitchPreference android:key="mostrarBarraLateral" android:title="Mostrar Barra lateral" android:summary="Barra de opções lateral"/> ... É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
  • 30. XML PreferenceScreen Adicione duas CheckBoxPreferences: ... <CheckBoxPreference android:key="atualizarAutomaticamente" android:title="Atualizar automaticamente" android:summary="Define se o app irá buscar atualizaçoes"/> <CheckBoxPreference android:key="receberBoletinsInformativos" android:title="Receber boletins informativos" android:summary="Define se o app receberá mensagens da newsletter"/> ... É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
  • 31. XML PreferenceScreen Adicione uma EditTextPreference: ... <EditTextPreference android:key="apelido" android:title="Apelido" android:summary="Como gostaria de ser chamado" android:dialogTitle="Adicione um apelido" android:dialogMessage="Nome que aparecerá nas postagens"/> ... É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
  • 32. XML PreferenceScreen Para adicionar uma ListPreference é necessário adicionar dois arrays de strings, um com valores e outro com textos para os rótulos. Crie um novo arquivo xml dentro do diretório values e de o nome de arrays:
  • 33. XML PreferenceScreen No arquivo arrays.xml adicione os arrays de idiomas: ... <string-array name="idiomasValores"> <item>pt-br</item> <item>en</item> <item>fr</item> </string-array> <string-array name="idiomas"> <item>Português</item> <item>Inglês</item> <item>Francês</item> </string-array> ...
  • 34. XML PreferenceScreen Voltando ao arquivo preferences.xml adicione uma ListPreference: ... <ListPreference android:key="idioma" android:title="Idioma principal" android:summary="Idioma dos textos do app" android:entries="@array/idiomas" android:entryValues="@array/idiomasValores" /> ... É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
  • 35. SettingsFragment Para carregar as preferências do arquivo preferences.xml é necessário criar uma classe que estenda PreferenceFragment. Crie uma nova classe e dê o nome de SettingsFragment.
  • 36. SettingsFragment Edite a classe SettingsFragment e estenda-a de PreferenceFragment. import android.preference.PreferenceFragment; public class SettingsFragment extends PreferenceFragment { ... }
  • 37. SettingsFragment Adicione os métodos abaixo à classe SettingsFragments para que seja possível carregar as preferências do arquivo preferences.xml: ... @NonNull public static SettingsFragment newInstance() { return new SettingsFragment(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); } ...
  • 38. SettingsActivity Crie uma nova Empty Activity e de o nome de SettingsActivity import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class SettingsActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_settings); } }
  • 39. SettingsActivity Remova a linha que adiciona o layout da activity do método onCreate: ... @Override public void onCreate(Bundle savedInstanceState) { ... Fragment fragment = getFragmentManager().findFragmentById(android.R.id.content); ... } ... setContentView(R.layout.activity_settings); ... E adicione uma nova instancia de Fragment ao método onCreate, obtendo do gerenciador de fragmentos, o fragmento de preferências do aplicativo:
  • 40. SettingsActivity Ao importar a classe Fragment, o Android Studio usa automaticamente a classe de suporte à versões anteriores do android, como a linha abaixo: import android.support.v4.app.Fragment; Caso a instancia de Fragment apresente problemas, substitua a linha acima por: import android.app.Fragment;
  • 41. SettingsActivity Ainda no método onCreate, adicione a condição criar ou substituir o fragmento de preferências: ... if (fragment == null) { getFragmentManager().beginTransaction() .add(android.R.id.content, SettingsFragment.newInstance()) .commit(); } else { getFragmentManager().beginTransaction() .replace(android.R.id.content, SettingsFragment.newInstance()) .commit(); } ...
  • 42. MainActivity Adicione um botão para abrir as configurações. <LinearLayout ...> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Abrir Configurações" android:id="@+id/btnConfiguracoes"/> </LinearLayout> É recomendado guardar os textos no arquivo strings.xml e utiliza-los com a classe de recursos (R).
  • 43. MainActivity No método onCreate da classe MainActivity, adicione um onClickListener para o botão, para criar uma intenção e chamar a classe SettingsActivity. ... Button btnConfiguracoes = (Button) findViewById(R.id.btnConfiguracoes); btnConfiguracoes.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, SettingsActivity.class); startActivity(intent); } });
  • 45. Agrupando preferências Agrupar preferências é uma forma de deixar a interface do usuário mais organizada, definindo melhor o escopo de cada preferência. Para agrupar, ou categorizar as preferências, é utilizada a classe PreferenceCategory, onde é possível definir um título para a categoria e colocar todas as preferências que estarão nesse grupo dentro dos limites de seus nós. <PreferenceCategory android:title="Sistema"> ... </PreferenceCategory>
  • 46. É hora de praticar! Agrupando preferências
  • 47. Agrupando preferências Crie três grupos/categorias de preferências com os títulos: Usuário, Sistema e Outros. <PreferenceCategory android:title="Usuário"> <!-- EditTextPreference Apelido --> </PreferenceCategory> <PreferenceCategory android:title="Sistema"> <!-- ListPreference Idioma --> <!-- SwitchPreference Barra Lateral --> </PreferenceCategory> <PreferenceCategory android:title="Outros"> <!-- CheckBoxPreference Atualizações --> <!-- CheckBoxPreference Boletins --> </PreferenceCategory>
  • 49. Definindo valores padrões Para definir valores padrões para as preferências, basta adicionar o parâmetro defaultValue, atentando-se ao tipo de valor de cada preferência. <SwitchPreference ... android:defaultValue="true"/> <EditTextPreference ... android:defaultValue="William Costa"/>
  • 51. Utilizando preferências do usuário A leitura das configurações é extremamente simples, e para isso é utilizada a classe SharedPreference, que oferece métodos específicos para cada tipo de dado que precisamos obter. • getAll(); Retorna todas as preferências • getBoolean(String key, boolean default); Retorna um valor do tipo boolean • getFloat(String key, float default); Retorna um valor do tipo float • getInt(String key, int default); Retornar um valor do tipo int • getLong(String key, long default); Retorna um valor do tipo long • getString(String key, String default); Retorna um valor do tipo String • getStringSet(String key, Set<String> default); Retorna uma coleção de strings
  • 52. É hora de praticar! Utilizando preferências do usuário
  • 53. Utilizando preferências do usuário Adicione duas novas propriedades à classe PreferenceFragments: uma instancia de SharedPreferences, para que seja possível manipular as informações do arquivo; e uma instancia de Preference, que será usada para aplicar a preferência do usuário ao subtítulo da preferência apelido. ... protected SharedPreferences sharedPreferences; protected Preference apelido; ...
  • 54. Utilizando preferências do usuário No método onCreate, será solicitado ao gerenciador de preferências o arquivo de preferências padrão, para isso defina a instancia de SharedPreferences com o arquivo padrão e busque na PreferenceScreen pela preferência com a chave apelido. ... sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); apelido = findPreference("apelido"); ...
  • 55. Utilizando preferências do usuário Ainda no método onCreate, utilize o método getString() da classe SharedPreferences e obtenha o valor da preferência com a chave apelido. ... apelido.setSummary(sharedPreferences.getString("apelido","")); ...
  • 57. OnPreferenceChangeListener Para executar uma ação após uma preferência ser alterada é adicionado um listener na preferência, e nele são executadas as ações com os novos valores. Ao utilizar o método onPreferenceChange deste listener, são informados dois parâmetros: uma instancia de Preference com a preferência que foi alterada e uma instancia genérica de Object com o novo valor da preferência. ... @Override public boolean onPreferenceChange(Preference preference, Object newValue) { ... return true; } ...
  • 58. É hora de praticar! OnPreferenceChangeListener
  • 59. OnPreferenceChangeListener Adicione o listener abaixo ao método onCreate de SettingsFragment. ... apelido.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { preference.setSummary((String) newValue); return true; } }); ...
  • 61. Restaurando valores padrões Não há um meio direto para restaurar os valores padrões das preferências. Para isso, é necessário acessar e limpar o arquivo SharedPreferences, obrigando o sistema a utilizar os valores padrões de cada preferência. Para limpar o arquivo basta utilizar o método clear() da classe SharedPreferences e aplicar as alterações. Após a limpeza, caso algum elemento da activity utilize uma preferência, deve ser recarregado, para evitar que o antigo valor continue aplicado.
  • 62. Restaurando valores padrões Adicione uma preferência personalizada ao grupo outros do arquivo preferences.xml para que seja utilizada com um “botão” onde será aplicado um OnPreferenceClickListener para limpar o arquivo de preferências. ... <Preference android:title="Restaurar preferências" android:key="restaurar" android:summary="Limpe os dados e retorne os valores padrões"/> ...
  • 63. ... restaurar = findPreference("restaurar"); restaurar.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { ... return true; } }); ... Restaurando valores padrões Adicione a propriedade abaixo à classe SettingsFragments: ... protected Preference restaurar; ... No método onCreate, defina a instancia para a preferência, buscando a chave restaurar na PreferenceScreen e implemente o OnPreferenceClickListener:
  • 64. Restaurando valores padrões É importante, que o usuário confirme a ação de limpeza das preferências antes de sua execução. Para isso, adicione um AlertDialog dentro do listener da preferência. ... AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle("Restaurar preferências") .setMessage("As preferências não poderão ser recuperadas") .setNegativeButton("Cancelar", null); ...
  • 65. Restaurando valores padrões Defina a ação do botão de confirmação, para que depois possa ser executada a ação de limpeza dos dados do arquivo SharedPreferences: ... builder.setPositiveButton("Restaurar", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { ... } }); ...
  • 66. Restaurando valores padrões Dentro do método onClick do listener do botão de confirmação, adicione a ação de limpeza do arquivo SharedPreferences utilizando a mesma instancia da classe SharedPreferences que foi utilizada na leitura dos dados e logo depois executar o método para que a activity atual seja recriada, atualizando as opções das preferências. ... sharedPreferences.edit().clear().apply(); getActivity().recreate(); ...
  • 67. Restaurando valores padrões Por fim, crie e exiba o AlertDialog, para que as ações possam ser executadas: ... AlertDialog dialog = builder.create(); dialog.show(); ...
  • 69. Referências ANDROID (EUA). Android.Preference. Disponível em: <https://developer.android.com/reference/android/preference/package-summary.html>. Acesso em: 15 set. 2017. ANDROID (EUA). PreferenceActivity. Disponível em: <https://developer.android.com/reference/android/preference/PreferenceActivity.html>. Acesso em: 16 set. 2017. ARAÚJO, Hygor Xavier. Como criar uma tela de configurações no android. 2017. Disponível em: <https://medium.com/@hygorxaraujo/como-criar-uma-tela-de-configurações-no-android-140b1a400895>. Acesso em: 16 set. 2017. ANDROID (EUA). SharedPreferences.Editor. Disponível em: <https://developer.android.com/reference/android/content/SharedPreferences.Editor.html>. Acesso em: 17 set. 2017. ANDROID (EUA). Configuracoes. Disponível em: <https://developer.android.com/guide/topics/ui/settings.html?hl=pt-br>. Acesso em: 17 set. 2017.