Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Treinamento Android

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Paula Rosa Paula Rosa
November 24, 2018

Treinamento Android

Treinamento utilizado no evento WoMakers Code com intuito de apresentar o desenvolvimento Android para pessoas que possam ter ou não contato prévio com programação.
O objetivo deste treinamento é começar com uma tela simples e chegar até trazer dados de uma API e setar estes dados na tela.
Qualquer dúvida pode me encontrar nas redes sociais:
@_paulacr (Twitter)
[email protected]
[email protected]

Avatar for Paula Rosa

Paula Rosa

November 24, 2018
Tweet

More Decks by Paula Rosa

Other Decks in Programming

Transcript

  1. X TREINAMENTO ANDROID | ANDROID STUDIO • 1 - árvore

    de arquivos • 2 - arquivo aberto • 3 - Ferramentas de build • 4 - Toolbar de Log/ debug/terminal 4 1 2 3
  2. X TREINAMENTO ANDROID | ANDROID STUDIO 4 3 2 1

    • 1 - Manifest Files - onde colocamos especificações de cada tela (como tema, nome do app, permissões, etc) • 2 - Arquivos Java/Kotlin (Parte lógica da aplicação) • 3 - Res (ou resources) é a parte visual da aplicação, onde estão arquivos de layout, estilos, textos, etc. • 4 - Arquivos do Gradle (Gerenciador de dependências do projeto)
  3. X TREINAMENTO ANDROID | 1ª ENTREGA: CRIE UM PROJETO •

    Criar um novo projeto • Criar um emulador • Rodar o projeto com um texto simples “Hello word"
  4. X TREINAMENTO ANDROID | LAYOUTS • Representam a parte visual

    de uma aplicação Android. • Existem vários tipos de layouts, e cada um tem um propósito • Acontece também de combinarmos tipos de layouts (quando necessário)
  5. X TREINAMENTO ANDROID | LAYOUTS: CONSTRAINT LAYOUT <?xml version="1.0" encoding="utf-8"?>

    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/splashImagem" android:layout_width="200dp" android:layout_height="200dp" app:layout_constraintBottom_toTopOf="@+id/botaoIrParaHome" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.296" app:srcCompat="@drawable/gihub" /> <Button android:id="@+id/botaoIrParaHome" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Ir para Home" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> </android.support.constraint.ConstraintLayout>
  6. X TREINAMENTO ANDROID | LAYOUTS: RELATIVE LAYOUT <?xml version="1.0" encoding="utf-8"?>

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ic_launcher" android:layout_above="@id/button" android:layout_centerInParent="true"/> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="button name" android:layout_alignParentBottom="true"/> </RelativeLayout>
  7. X TREINAMENTO ANDROID | LAYOUTS: LINEAR LAYOUT <?xml version="1.0" encoding="utf-8"?>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ic_launcher"/> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="button name" android:layout_weight="1"/> </LinearLayout>
  8. X TREINAMENTO ANDROID | LAYOUTS: FRAME LAYOUT <?xml version="1.0" encoding="utf-8"?>

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:src="@mipmap/ic_launcher" android:scaleType="centerCrop"/> <ImageView android:layout_width="150dp" android:layout_height="150dp" android:src="@drawable/gihub" android:layout_gravity="center" /> </FrameLayout>
  9. X TREINAMENTO ANDROID | LAYOUTS • Os layouts são arquivos

    com extensão .xml que possuem atributos, e assim o Android é capaz de entender como montar certo layout. • Existe sempre um layout pai (root) • ViewGroups são containers de views (permitem que nós adicionemos views dentro deles) • As views também podem existir sem um ViewGroup (aí seu pai passa a ser o root do layout)
  10. X TREINAMENTO ANDROID | LAYOUTS <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp"

    android:layout_marginStart="20dp" android:layout_marginTop="32dp" android:text="Hello World!" android:textSize="30sp" android:textColor="@android:color/darker_gray" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toEndOf="@+id/imageView" app:layout_constraintTop_toTopOf="parent" /> Wrap Content Match Parent Texto Texto Medidas exatas • Dimensões: dp • Textos: sp { Relações de layout { Atributos de View
  11. X TREINAMENTO ANDROID | LAYOUTS { Filhos da ViewGroup {

    Atributos de ViewGroup <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> <ImageView /> <TextView /> </LinearLayout> • ScrollView • LinearLayout • RelativeLayout • ConstraintLayout • Recyclerview (listas) • CardView • ViewPager Exemplos de ViewGroups
  12. X TREINAMENTO ANDROID | 2ª ENTREGA: CRIE UM LAYOUT •

    Criar um layout • Colocar todos atributos necessários • Rodar o aplicativo com o layout
  13. X <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent">

    <ImageView android:id="@+id/splashImagem" android:layout_width="match_parent" android:layout_height="0dp" android:scaleType="centerCrop" app:layout_constraintBottom_toTopOf="@+id/botaoIrParaHome" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat=“@drawable/github" android:contentDescription=“@string/imagem_tela_inicial” /> <Button android:id="@+id/botaoIrParaHome" android:layout_width="match_parent" android:layout_height="0dp" android:text="Ir para Home" android:textSize="18sp" android:textAllCaps="false" android:background="@color/cor_botao" android:textColor="@color/branca" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> </android.support.constraint.ConstraintLayout>
  14. X TREINAMENTO ANDROID | ACTIVITY • É a parte lógica

    da nossa tela (atividade) • Colocamos informações como o layout que será utilizado • Também podemos adicionar métodos para tratar os eventos gerados pelas views (como por exemplo click, long click, foco, etc)
  15. X TREINAMENTO ANDROID | ACTIVITY • A herança é necessária

    para que possamos utilizar as funcionalidades do framework • O termo “compat" é utilizado no Android para indicar que o componente utilizado permite compatibilidade com versões anteriores do Android class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //Layout que nossa activity irá "inflar" setContentView(R.layout.activity_main) } } Nome da Classe Herança Método
  16. X TREINAMENTO ANDROID | CICLO DE VIDA • A activity

    possui um ciclo de vida específico. O Android controla o ciclo de vida • A activity pode entrar num estado de espera ao receber uma ligação telefônica por exemplo • As vezes será preciso sobrescrever alguns métodos do ciclo de vida, para a aplicação funcionar como o esperado
  17. X

  18. X TREINAMENTO ANDROID | INTENTS • As intents são intenções,

    que podem trazer ou não dados (metadados) • O Android possui um sistema de mensagem envio/ receptor para executar certas tarefas • As intents são escutadas pelo sistema operacional ou até mesmo pelo seu aplicativo, para executar certas ações
  19. X TREINAMENTO ANDROID | INTENTS Google photos lança uma intent

    Todos aplicativos que respondem a intent são mostrados
  20. X TREINAMENTO ANDROID | INTENTS botaoIrParaHome.setOnClickListener { val uriIntent =

    Uri.parse("geo:37.7749,-122.4194") val mapIntent = Intent(Intent.ACTION_VIEW, uriIntent) startActivity(mapIntent) }
  21. X TREINAMENTO ANDROID | INTENTS • No Android uma Activity

    não é instanciável, para navegar entre telas usamos as Intents. • Quando precisamos passar dados adicionais da tela atual para a próxima tela usamos objetos denominados EXTRAS e depois iniciamos nossa activity passando estes extras para ela.
  22. X TREINAMENTO ANDROID | 3ª ENTREGA: ABRIR NOVA TELA AO

    CLICAR NO BOTÃO botaoIrParaHome.setOnClickListener { val intent = Intent(this@SplashActivity, MainActivity::class.java) startActivity(intent) } • No Android uma Activity não é instanciável, para navegar entre telas usamos as Intents. • Primeiro criamos um objeto intent, passando o contexto atual (activity atual) e passamos a tela que queremos abrir • Depois pedimos pra que o Android inicie a activity nova, passando a intent que criamos
  23. X TREINAMENTO ANDROID | 4ª ENTREGA: PASSAR UM EXTRA PARA

    PRÓXIMA TELA • Criamos o objeto intent igual fizemos anteriormente • Para passar um extra dizemos uma chave e depois qual um valor (key-value) • Evitamos passar objetos gigantes entre uma tela e outra val extras = intent.extras val texto = extras.getString("chave") textoSegundaTela.text = texto val extras: Bundle? = intent.extras val texto: String? = extras?.getString("chave") textoSegundaTela.text = texto?: "Não tem extras"
  24. X TREINAMENTO ANDROID | CUSTOMIZAÇÃO DE ESTILOS • Os elementos

    do layout podem ser customizados • Estas customizações são salvas em arquivos .xml na pasta drawable • Para aplicarmos a customização em um componente, declaramos o resource criado como background <shape xmlns:android="http://schemas.android.com/apk/res/android"> <stroke android:width="2sp" android:color="@color/cor_botao"/> <gradient android:startColor="@color/purple_dark" android:endColor="@color/cor_botao" android:gradientRadius="20dp" android:type="linear" android:angle="180"/> </shape>
  25. X TREINAMENTO ANDROID | INTERNACIONALIZAÇÃO • Permite que uma aplicação

    Android use a mesma String com textos diferentes dependendo da linguagem selecionada nas configurações • Criamos uma pasta values-XX dentro da pasta resources (onde xx é a sigla para a linguagem). Exemplo: values-en <Button android:id="@+id/botaoIrParaHome" android:layout_width="match_parent" android:layout_height="wrap_content" android:text=“@string/ir_para_home_text”/>
  26. X TREINAMENTO ANDROID | LISTAS COM RECYCLER VIEW Adapter Item

    1 Item 2 Item 3 … Item n Items Lista
  27. X TREINAMENTO ANDROID | 7ª ENTREGA: CRIAR UMA LISTA DE

    REPOSITÓRIOS dependencies { implementation 'com.android.support:recyclerview-v7:27.0.0' } class RepositoriesAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder { TODO("not implemented") } override fun getItemCount(): Int { TODO("not implemented") } override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) { TODO("not implemented") } }
  28. X TREINAMENTO ANDROID | 7ª ENTREGA: CRIAR UMA LISTA DE

    REPOSITÓRIOS override fun getItemCount(): Int { return items.size } class ViewHolder(viewItem: View): RecyclerView.ViewHolder(viewItem) { val nameView = viewItem.repository_item fun bind(name: String) { nameView.text = name } }
  29. X TREINAMENTO ANDROID | 7ª ENTREGA: CRIAR UMA LISTA DE

    REPOSITÓRIOS override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder { val view = LayoutInflater.from(parent?.context) .inflate(R.layout.repository_item, parent, false) return ViewHolder(view) } override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) { val viewHolder = holder as ViewHolder viewHolder.bind(items[position]) }
  30. X TREINAMENTO ANDROID | 8ª ENTREGA: CARREGAR AS IMAGENS ATRAVÉS

    DA URL DA IMAGEM dependencies { (...) implementation 'com.squareup.picasso:picasso:2.71828' }
  31. X TREINAMENTO ANDROID | 8ª ENTREGA: CARREGAR AS IMAGENS ATRAVÉS

    DA URL DA IMAGEM Picasso.get() .load(URL_IMAGEM) .into(splashImagem) <uses-permission android:name="android.permission.INTERNET"/> AndroidManifest.xml SplashActivity.kt companion object { const val URL_IMAGEM = "http://i.imgur.com/DvpvklR.png" }
  32. X TREINAMENTO ANDROID | 9ª ENTREGA: CONECTAR COM API DO

    GITHUB dependencies { (…) implementation 'com.squareup.picasso:picasso:2.71828' implementation 'com.squareup.retrofit2:retrofit:2.4.0' }
  33. X TREINAMENTO ANDROID | 9ª ENTREGA: CONECTAR COM API DO

    GITHUB var retrofit = Retrofit.Builder() .baseUrl("https://api.github.com/") .addConverterFactory(GsonConverterFactory.create()) .build() interface GithubService { @GET("repositories") fun getCharacters(): Call<List<Character>> } fun getService(): GithubService? { return retrofit.create(GithubService::class.java) }
  34. X TREINAMENTO ANDROID | PARA ESTUDAR EM CASA • https://br.udacity.com/course/new-android-fundamentals--ud851

    (gratuito) • https://developer.android.com/ (documentação oficial / tutoriais ) • https://www.youtube.com/user/androiddevelopers • http://slack.androiddevbr.org/ (Slack AndroidDevBr)