Slide 1

Slide 1 text

FRAGMENTS Rafael Toledo @_rafaeltoledo

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

FRAGMENTS

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

POR QUE USAR FRAGMENTS?

Slide 6

Slide 6 text

POR QUE NÃO USAR FRAGMENTS?

Slide 7

Slide 7 text

LIFECYCLE

Slide 8

Slide 8 text

LIFECYCLE

Slide 9

Slide 9 text

LIFECYCLE

Slide 10

Slide 10 text

LIFECYCLE

Slide 11

Slide 11 text

LIFECYCLE

Slide 12

Slide 12 text

LIFECYCLE [CRIES IN ANDROIDISH]

Slide 13

Slide 13 text

WTF??? • IllegalStateException • getActivity() == null • executePendingTransactions() •

Slide 14

Slide 14 text

WTF???

Slide 15

Slide 15 text

EM 2017, VALE A PENA USAR FRAGMENTS?

Slide 16

Slide 16 text

EM 2017, VALE A PENA USAR FRAGMENTS?

Slide 17

Slide 17 text

DIFERENTES LAYOUTS, DIFERENTES TELAS

Slide 18

Slide 18 text

DIFERENTES TAMANHOS DE TELA

Slide 19

Slide 19 text

DIFERENTES TAMANHOS DE TELA Nexus One!

Slide 20

Slide 20 text

Quem usa tablet hoje em dia???

Slide 21

Slide 21 text

DIFERENTES TAMANHOS DE TELA Moto C (480x854) Samsung Galaxy S8+ (1440x2960)

Slide 22

Slide 22 text

DIFERENTES TAMANHOS DE TELA

Slide 23

Slide 23 text

Quem usa app em landscape???

Slide 24

Slide 24 text

Quem usa app em landscape??? EU!

Slide 25

Slide 25 text

ENCAPSULAMENTO DA NAVEGAÇÃO

Slide 26

Slide 26 text

ENCAPSULAMENTO DE NAVEGAÇÃO

Slide 27

Slide 27 text

ENCAPSULAMENTO DE NAVEGAÇÃO getSupportFragmentManager() .beginTransaction() .add(R.id.container, new Step1Fragment()) .addToBackStack(null) .commit(); // Back button = fragmentManager.popBackStack()

Slide 28

Slide 28 text

ENCAPSULAMENTO DE NAVEGAÇÃO getSupportFragmentManager() .beginTransaction() .add(R.id.container, new Step1Fragment()) .addToBackStack(null) .commit();

Slide 29

Slide 29 text

BACKSTACK? !=

Slide 30

Slide 30 text

BACKSTACK? Volta para a home

Slide 31

Slide 31 text

BACKSTACK?

Slide 32

Slide 32 text

BACKSTACK? Volta para a home?

Slide 33

Slide 33 text

BACKSTACK? Toolbar na Activity Fragment com conteúdo

Slide 34

Slide 34 text

BACKSTACK getSupportFragmentManager() .beginTransaction() .add(R.id.container, new Step1Fragment()) .addToBackStack(null) // ??? .commit();

Slide 35

Slide 35 text

BACKSTACK getSupportFragmentManager() .beginTransaction() .add(R.id.container, new Step1Fragment()) .addToBackStack("Cart") .commit();

Slide 36

Slide 36 text

BACKSTACK getSupportFragmentManager() .beginTransaction() .add(R.id.container, new Step1Fragment()) .addToBackStack("Cart") .commit(); fragmentManager.popBackStack("Cart"); fragmentManager.popBackStack("Cart", FragmentManager.POP_BACK_STACK_INCLUSIVE);

Slide 37

Slide 37 text

STATEFUL DIALOGS

Slide 38

Slide 38 text

POR QUE EU PRECISO DE DIALOGS COM ESTADO?

Slide 39

Slide 39 text

MUDANÇAS DE CONFIGURAÇÃO

Slide 40

Slide 40 text

EVITANDO INTERAÇÕES DEAD-END

Slide 41

Slide 41 text

CUIDADO COM O DIALOG INFINITO

Slide 42

Slide 42 text

COMPONENTIZAÇÃO DA UI

Slide 43

Slide 43 text

COMPONENTIZAÇÃO DA UI Fragments como uma porção da Activity View Fragment View Fragment Fragment Activity Fragment Activity

Slide 44

Slide 44 text

// Dentro do Fragment ((MainActivity) getActivity()).method(); COMPONENTIZAÇÃO DA UI - DON'T!

Slide 45

Slide 45 text

// Dentro do Fragment ((MainActivity) getActivity()).method(); COMPONENTIZAÇÃO DA UI - DON'T!

Slide 46

Slide 46 text

// Dentro da View ((MainActivity) context).method(); COMPONENTIZAÇÃO DA UI - DON'T!

Slide 47

Slide 47 text

// Dentro da View ((MainActivity) context).method(); COMPONENTIZAÇÃO DA UI - DON'T!

Slide 48

Slide 48 text

OLHA O REÚSO...

Slide 49

Slide 49 text

FALANDO EM VIEWS...

Slide 50

Slide 50 text

CUSTOM VIEWS x FRAGMENTS • Micro interações isoladas? Custom Views! • Interação complexa, lida com rede, hardware, intents? Fragments! • View Pager? •Com interação rica (é uma tela de fato?) - Fragments! •Conteúdo simples (carrossel, vitrine, cards?) - Custom Views!

Slide 51

Slide 51 text

VOLTANDO...

Slide 52

Slide 52 text

COMO TROCAR DADOS ENTRE FRAGMENTS?

Slide 53

Slide 53 text

COMO TROCAR DADOS ENTRE FRAGMENTS? ● EventBus?

Slide 54

Slide 54 text

COMO TROCAR DADOS ENTRE FRAGMENTS? ● EventBus?

Slide 55

Slide 55 text

COMO TROCAR DADOS ENTRE FRAGMENTS? ● EventBus? ● Através da Activity, implementando um listener

Slide 56

Slide 56 text

COMO TROCAR DADOS ENTRE FRAGMENTS? ● EventBus? ● Através da Activity, implementando um listener ● Architecture Components!

Slide 57

Slide 57 text

COMO TROCAR DADOS ENTRE FRAGMENTS? ● EventBus? ● Através da Activity, implementando um listener ● Architecture Components!

Slide 58

Slide 58 text

// No Fragment viewModel = ViewModelProviders.of(this) .get(MyViewModel.class); COMO TROCAR DADOS ENTRE FRAGMENTS?

Slide 59

Slide 59 text

// No Fragment viewModel = ViewModelProviders.of(getActivity()) .get(MyViewModel.class); COMO TROCAR DADOS ENTRE FRAGMENTS?

Slide 60

Slide 60 text

// No Fragment viewModel = ViewModelProviders.of(getActivity()) .get(MyViewModel.class); COMO TROCAR DADOS ENTRE FRAGMENTS?

Slide 61

Slide 61 text

INICIALIZAÇÃO DE COMPONENTES

Slide 62

Slide 62 text

INICIALIZAÇÃO DE COMPONENTES

Slide 63

Slide 63 text

MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map); INICIALIZAÇÃO DE COMPONENTES

Slide 64

Slide 64 text

MapView mapView; @Override public void onCreate(Bundle savedInstanceState) { ... mapView = findViewById(R.id.map); } INICIALIZAÇÃO DE COMPONENTES

Slide 65

Slide 65 text

@Override public void onStart() { super.onStart(); mapView.onStart(); } @Override public void onStop() { mapView.onStop(); super.onStop(); } INICIALIZAÇÃO DE COMPONENTES

Slide 66

Slide 66 text

@Override public void onStart() { super.onStart(); mapView.onStart(); } @Override public void onStop() { mapView.onStop(); super.onStop(); } INICIALIZAÇÃO DE COMPONENTES Boilerplate?

Slide 67

Slide 67 text

INICIALIZAÇÃO DE COMPONENTES

Slide 68

Slide 68 text

INICIALIZAÇÃO DE COMPONENTES

Slide 69

Slide 69 text

@Override public void onInflate(Context context, AttributeSet attrs, Bundle savedInstanceState) { ... } INICIALIZAÇÃO DE COMPONENTES

Slide 70

Slide 70 text

@Override public void onInflate(Context context, AttributeSet attrs, Bundle savedInstanceState) { ... } INICIALIZAÇÃO DE COMPONENTES

Slide 71

Slide 71 text

@Override public void onInflate(Context context, AttributeSet attrs, Bundle savedInstanceState) { ... } INICIALIZAÇÃO DE COMPONENTES

Slide 72

Slide 72 text

DICAS FINAIS • Sempre guarde estado dos seus Fragments! • setRetainInstance(true) não deve ser usado para Fragments com Views! (Architecture Components usa!)

Slide 73

Slide 73 text

QUE TAL DAR UMA SEGUNDA CHANCE AOS FRAGMENTS?

Slide 74

Slide 74 text

Fragment Tricks youtube.com/watch?v=eUG3VWnXFtg What the Fragment? youtube.com/watch?v=k3IT-IJ0J98 Documentação developer.android.com/guide/components/fragments.html LINKS

Slide 75

Slide 75 text

Fragment Tricks youtube.com/watch?v=eUG3VWnXFtg What the Fragment? youtube.com/watch?v=k3IT-IJ0J98 Documentação developer.android.com/guide/components/fragments.html LINKS

Slide 76

Slide 76 text

Centro Av. Presidente Wilson, 231 - 29º andar (21) 2240-2030 Cidade Monções Av. Nações Unidas, 11.541 - 3º andar (11) 4119-0449 Savassi Av. Getúlio Vargas, 671 Sala 800 - 8º andar (31) 3360-8900 www.concrete.com.br speakerdeck.com/rafaeltoledo github.com/rafaeltoledo twitter.com/_rafaeltoledo