Xamarin Forms - App Dividir a Conta
Hoje vou apresentar uma aplicação Xamarin Forms bem simples cujo objetivo é realizar o rateio de valores entre um determinado número de participantes que faz parte do meu Curso de Xamarin Forms. |
Uma das melhores maneiras de aprender os recursos de uma linguagem ou tecnologia é criar uma aplicação funcional do zero.
É isso que vou apresentar neste artigo: uma aplicação para ratear o valor de uma conta entre os participantes.
A aplicação vai tratar com os valores da conta e gorjeta, e, com o número de participantes, para calcular o valor que caberá a cada participante no rateio do valor total.
Será uma aplicação bem simples, voltada para inicantes, que você encontra no meu curso de Xamarin Forms.
Para realizar essa tarefa eu vou utilizar os seguintes recursos:
Criando um protótipo da app
Antes de iniciar qualquer projeto devemos realizar o levantamento de requisitos para definir qual o objetivo do produto de software que vamos criar e quais suas funcionalidades principais.
Embora não exista um modelo padrão consagrado para gerenciar requisitos podemos definir alguns passos para um processo de especificação de requisitos :
Ao final deste processo deve-se ter um documento de requisitos bem definido e entendido por todos os intervenientes do processo: clientes, desenvolvedores, líderes, analistas, gerentes, patrocinadores, etc.
Sabemos que a única constante no desenvolvimento de software é a mudança. Então, antes de sair programando, é uma boa prática criar um protótipo da aplicação com os requisitos obtidos até o momento, pois o protótipo é a forma mais rápida e econômica de se definir e experimentar um projeto e é mais barato e simples alterar um produto na sua fase inicial.
Para criar um protótipo eu vou usar uma ferramenta chamada FluidUI que não é gratuíta mas que pode ser testada por 30 dias. Assim teremos uma visão da nossa app concebida na fase inicial e durante a concepção do sistema.
Se você se interessar pela ferramenta pode consultar os recursos e documentação neste link : https://www.fluidui.com/
Basta criar uma conta de avaliação e você já poder criar seu protótipo. Abaixo temos uma visão da nossa app Rachar Conta onde eu apenas definir duas visões da única página que a aplicação vai possuir :
Você pode criar links entre as páginas e criar um protótipo mais avançado. Eu vou me ater apenas a visão da página da app que é bem simples para ter uma idéia dos controles que iremos usar no projeto.
Na terceira imagem vemos a aplicação em funcionamento exibindo um resultado de uma operação.
Criando o projeto Xamarin Forms no VS 2017 Community
Abra o VS 2017 Community (estou usando a versão 15.4.2) e crie um projeto Xamarin Forms selecionando a opção Visual C# -> Cross-Platform;
Selecionando o template Cross Platform App (Xamarin), informando o nome XF_DividirAConta e clicando em OK;
A seguir marque Xamarin Forms e Portable Class Library (PCL) e clique em OK;
Definindo a interface da Aplicação
Eu sempre procuro definir a interface da aplicação usando o código XAML de forma a separar a lógica da interface do código C# relacionados a eventos ou cálculos.
A aplicação usa duas páginas :
Abaixo vemos o leiaute da página principal MainPage.xaml :
1- Arquivo App.Xaml
Usando o recurso ResourceDictionary
2- Arquivo MainPage.xaml
Usando Estilos com StaticResource para deixar o código mais limpo;
Usando Frames para ajustar o layout da página;
Usando Behaviors e Triggers para limpar a propriedade
Text das views Entry que recebem o valor da conta e da gorjeta;
Definindo eventos que serão tratados no arquivo code-behind
MainPage.xaml.cs;
|
A seguir as views usadas na página:
Views usadas:
Frame - título
Label – Incluir Gorjeta
Switch – oculta/exibe Label Gorjeta
Label – Dividir por
Stepper – incrementa/decrementa
Label - Conta
Entry/Behavior – Limpa o valor ao receber Foco
Label- Gorjeta
Entry/Triggers – Limpa o valor ao receber Foco
Buttons:
Arredonda(+)
Arredonda(-)
Limpar
|
Espiando o código acima você vai perceber que eu estou :
Entendendo o código XAML usado
Então vamos entender passo a passo cada trecho de código XAML usado:
1- Título
<!--titulo --> <Frame BackgroundColor="#ff5252" Padding="5" Opacity="2"> <StackLayout Orientation="Horizontal"> <Label Text="Vamos Rachar a conta ?" HorizontalOptions="CenterAndExpand" FontSize="Large" TextColor="White" FontAttributes="Bold"/> </StackLayout> </Frame>
|
Neste código usamos a view Frame
definindo uma cor de fundo , um valor de opacidade e um preenchimento
(padding) igual a 5. Na view Label definimos o texto , cor, tamanho e atributos. |
2- Incluir Gorjeta
<!--incluir gorjeta : switch --> <Frame Padding="5"> <StackLayout Orientation="Horizontal"> <Label Text="Incluir Gorjeta" Style="{StaticResource labelTexto}" /> <Switch x:Name="Gorjeta" HorizontalOptions="CenterAndExpand" Toggled="Gorjeta_Toggled" IsToggled="False"/> </StackLayout> </Frame>
|
Nesta view Frame definimos um
StackLayout com orientação Horizontal contendo a view Label
com o texto onde estamos aplicando um estilo definido no arquivo
App.xaml e a view Switch que vai permitir ao usuário
selecionar se deseja incluir ou não o valor da gorjeta. No evento da view Switch (Gorjeta_Toogled) vamos exibir ou ocultar o Frame(IsVisible) que permite incluir o valor da gorjeta. |
3- Incluir número de participantes no rateio do valor da conta
<!--incluir no. participantes do rateio : stepper --> <Frame Padding="5"> <StackLayout Orientation="Horizontal"> <StackLayout Orientation="Horizontal"> <Label Text="Dividir Por:" Style="{StaticResource labelTexto}" /> <Label x:Name="lblRateio" Text="2" Style="{StaticResource labelTexto}" /> </StackLayout> <Stepper x:Name="Rateio" HorizontalOptions="CenterAndExpand" Value="2" Minimum="2" Increment="1" ValueChanged="Rateio_ValueChanged"/> </StackLayout> </Frame>
|
Aqui temos uma view Frame
contendo dois StackLayout aninhados com orientação horizontal; Em
um temos duas Labels exibindo o texto e o número de participantes do
rateio onde aplicamos o mesmo estilo. No outro temos a view Stepper que vai permitir o usuário aumentar e diminuir o número de participantes no rateio. Sendo que o valor mínimo é igual a 2 e que o incremento é igual a 1. Definimos o evento ValueChanged nesta view para exibir o número na Label lblRateio. |
4- Título
<!--incluir valor da conta : entry com behavior --> <Frame Padding="5"> <StackLayout Orientation="Horizontal"> <Label Text="Conta :" HorizontalOptions="Start" FontSize="Large"/> <Entry x:Name="ValorConta" Placeholder="0,00" Style="{StaticResource entryValor}"> <Entry.Behaviors> <behaviors:EntryClearOnFocusBehavior /> </Entry.Behaviors> </Entry> </StackLayout> </Frame>
|
Nesta view Frame temos a view
Label com o texto Conta e a view Entry que vai receber a
entrada do usuário para o valor da conta. Estamos aplicando um estilo
nesta Label e também definimos um Behavior definido na classe
EntryClearOnFocusBehavior para limpar o valor da propriedade Text do
controle quando receber o foco. Para poder aplicar esse recurso temos que definir no ContentPage o código : xmlns:behaviors="clr-namespace:XF_DividirAConta.Behaviors" |
5- Incluir o valor da Gorjeta
<!--incluir valor da gorjeta : entry com triggers --> <Frame x:Name="frameGorjeta" IsVisible="False" Padding="5"> <StackLayout Orientation="Horizontal"> <Label Text="Gorjeta :" HorizontalOptions="Start" FontSize="Large"/> <Entry x:Name="ValorGorjeta" Placeholder="0,00" Style="{StaticResource entryValor}"> <Entry.Triggers> <Trigger TargetType="Entry" Property="IsFocused" Value="True"> <Setter Property="Text" Value="" /> </Trigger> </Entry.Triggers> </Entry> </StackLayout> </Frame>
|
Neste Frame usamos uma Label
para exibir o texto Gorjeta e uma view Entry para receber o valor
da gorjeta onde aplicamos um estilo e usamos o recurso Triggers
para limpar a propriedade Text da view quando ela receber o foco(IsFocused). Este Frame inicialmente estará oculto e será exibido conforme a seleção do usuário capturada pela view Switch no evento Gorjeta_Toogled. Neste evento calculamos o valor padrão para a gorjeta considerando 10% e atribuimos o valor. |
6- Botão Calcular
<!--Calcular o rateio : button --> <Button x:Name="btnCalcular" Text="Calcular" Style="{StaticResource buttonApp}" Clicked="btnCalcular_Clicked"/>
|
Aqui temos apenas a view Button onde definimos o texto e aplicamos um estilo. No evento btnCalcular_Clicked será realizado o cálcula do valor do rateio. |
7- Exibição do valor total da conta, do rateio e dos botões para arredondar o valor para mais e para menos e do botão Limpar:
<StackLayout x:Name="stackResultado" IsVisible="False" Padding="5"> <!-- valor do conta : Label --> <StackLayout Orientation="Horizontal"> <Label Text="Total" Style="{StaticResource labelResultado}"/> <Label x:Name="lblValorTotalConta" Style="{StaticResource labelValores}"/> </StackLayout> <!-- valor do rateio : Label --> <StackLayout Orientation="Horizontal"> <Label Text="Rateio" Style="{StaticResource labelResultado}" /> <Label x:Name="lblValorRateio" Style="{StaticResource labelValores}" /> </StackLayout> <!-- botões para arrendondar o rateio : buttons --> <StackLayout Orientation="Horizontal" HorizontalOptions="Center" VerticalOptions="Center"> <Button x:Name="btnArredondarMais" Text="Arredonda (+)" Style="{StaticResource buttonApp}" Clicked="btnArredondarMais_Clicked"/> <Button x:Name="btnArredondarMenos" Text="Arredonda (-)" Style="{StaticResource buttonApp}" Clicked="btnArredondarMenos_Clicked"/> </StackLayout> <!-- Limpar os valores: button --> <Button x:Name="btnLimpar" Text="Limpar" Style="{StaticResource buttonApp}" Clicked="btnLimpar_Clicked"/> </StackLayout> |
Temos um StackLayout principal que
inicialmente tem sua propriedade IsVisible igual a False e que
somente será exibido ao se clicar no botão Calcular. No segundo StackLayout exibimos o valor Total da conta e no terceiro StackLayout exibimos o valor total do rateio para cada participante. No terceiro StackLayout com orientação horizontal temos duas views Button definindo os botões para arrendondar o valor da conta. Em cada Button definimos um evento e aplicamos um estilo. No final temos um Button para Limpar os valores e reiniciar o cálculo. Isso é feito no evento definido para este Button. |
Os Resources permitem compartilhar definições comuns em todo um aplicativo para ajudá-lo a reduzir valores codificados em seu código, facilitando assim a manutenção do código.
Geralmente definimos Resources agrupados e armazenados em um ResourceDictionary, que é um repositório para recursos que são usados pela aplicação Xamarin.Forms.
Os recursos típicos armazenados em um ResourceDictionary incluem : estilos, templates de controles, data templates, cores, e conversores.
Um ResourceDictionary utiliza um par de chaves key-value para armazenar as informações, assim no código XAML você terá que fornecer a palavra-chave x:Key para cada recurso definido
No arquivo MainPage.xaml.cs foram definidos o código relacionados ás Views usadas que dão vida à aplicação usando a linguagem C# :
A seguir a aplicação em execução:
Você encontra a vídeo aula que explica como criar essa aplicação, a documentação detalhada e o código fonte com o projeto completa você encontra no meu curso de Xamarin Forms.
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a Objetos com VB .NET
Xamarim - Desenvolvimento Multiplataforma com C# ... - Macoratti.net
Xamarin.Forms - Olá Mundo - Criando sua primeira ... - Macoratti.net
Xamarin.Forms - Olá Mundo - Anatomia da aplicação - Macoratti.net
https://developer.xamarin.com/api/type/Android.Widget.ListView/
https://developer.xamarin.com/api/property/Android.Widget.ListView.Adapter/
https://developer.xamarin.com/guides/xamarin-forms/user-interface/animation/