Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Views e ações distintas para cada sistema

Oi,

Eu fiz o curso de Xamarin Com Visual Studio, e por sinal é muito bom (parabéns ao Marcelo), mas me bateu uma dúvida, que eu não consegui achar uma forma certa na Internet.

Eu tenho uma aplicação Xamarin, Cross-Plataform.

E eu gostaria de criar Views ou Ações diferentes para os S.O's;

Exemplo:

Botão "Ação" no meu XAML quando clicado, se o usuário estiver no Android mostra uma mensagem, se estiver no IOS, mostre uma view ( ou qualquer coisa do tipo).

Procurando na internet eu notei que isso é possível colocando alguns códigos

#if __ANDROID__
 // mostrar mensagem
#endif

#if __IOS__
//Navega até a View
#endif

O certo não seria programar dentro de cada "projeto" dentro da solução ?

Terias um link mostrando como funciona em um código ou na documentação?

3 respostas
solução!

Olá, Vítor!

Obrigado por prestigiar nosso curso de Xamarin!

O certo não seria programar dentro de cada "projeto" dentro da solução ?

Você está correto.

A solução que você mencionou se chama "Compilação Condicional" (para detalhes, veja: https://developer.xamarin.com/guides/cross-platform/application_fundamentals/building_cross_platform_applications/part_4_-_platform_divergence_abstraction_divergent_implementation/#Conditional_Compilation). A estratégia de Compilação Condicional funciona melhor em soluções baseadas em Shared Asset Projects (Projetos de Recursos Compartilhados).

Isso que acabei de de dizer significa que, infelizmente para você, a compilaçao condicional como "#if ANDROID" não funciona com PCL (Portable Class Library), que é aquele projeto portátil que usamos no curso, compartilhado entre as plataformas. Para a compilação condicional "#if ANDROID" funcionar, você teria que criar um novo projeto, mas em vez de "Xamarin Forms (Portable Class Library)", você teria que escolher "Xamarin Forms (Shared Asset Projects)".

A estratégia adequada para variação de funcionalidade por plataforma em PCL é o uso de abstração, registro e injeção de dependência. Significa que você não deveria utilizar "ifs" no meio de um projeto PCL, e sim chamar métodos de uma interface. Cada projeto de plataforma (iOS, Android, WinPhone, etc) teria então uma implementação concreta, ou seja, uma classe implementando essa interface genérica. Cada vez que o projeto PCL requisitar a funcionalidade que varia por plataforma, o Xamarin procura no projeto da plataforma (iOS, Android, WinPhone, etc) qual a class implementa a interface requisitada. Por exemplo, o jeito "correto" de chamar um método "genérico" via PCL seria através do Serviço de Injeção de Dependência do Xamarin Forms:

DependencyService.Get<IMinhaInterfaceMultiplataforma>().MostrarMensagem("Alura Cursos Online");

Infelizmente, não vimos o conceito de DependencyService na parte 1 do curso. Mas felizmente abordaremos DependencyService no curso 2, quando utilizamos o banco de dados e a Câmera do Android. Se você tiver paciência, em breve a parte 2 do curso será lançada (está nas últimas edições) e veremos detalhes de como implementar isso. Por enquanto, você pode dar uma olhada em como o serviço de dependência do Xamarin Forms funciona.

https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/dependency-service/introduction/

Mas se mesmo assim você quiser utilizar código condicional num projeto PCL, existe uma forma "alternativa" (não conte pra ninguém!) de fazer isso:

if (Device.OS == TargetPlatform.iOS)

else if (Device.OS == TargetPlatform.Android)

else if (Device.OS == TargetPlatform.WindowsPhone)

Boa sorte e bons estudos!

Muito Obrigado.

Salvaste minha vida.

Aguardarei o curso sim.

Obrigado, grande abraço

Excelente, Vítor, fico feliz! Abraços