Sliding Tabs Toolbar, Material Design Android - Parte 8

Receba em primeira mão, e com prioridade, os conteúdos Android exclusivos do Blog. Você receberá um email de confirmação. Somente depois de confirma-lo é que poderei lhe enviar os conteúdos exclusivos.

Email inválido.
Blog /Android /Sliding Tabs Toolbar, Material Design Android - Parte 8

Sliding Tabs Toolbar, Material Design Android - Parte 8

Vinícius Thiengo
(8761) (81) (2)
Go-ahead
"Descobri que pequenas vitórias, pequenos projetos, pequenas diferenças muitas vezes fazem grandes diferenças."
Rosabeth Moss Kanter
Kotlin Android
Capa do livro Desenvolvedor Kotlin Android - Bibliotecas para o dia a dia
TítuloDesenvolvedor Kotlin Android - Bibliotecas para o dia a dia
CategoriasAndroid, Kotlin
AutorVinícius Thiengo
Edição
Capítulos19
Páginas1035
Acessar Livro
Treinamento Oficial
Android: Prototipagem Profissional de Aplicativos
CursoAndroid: Prototipagem Profissional de Aplicativos
CategoriaAndroid
InstrutorVinícius Thiengo
NívelTodos os níveis
Vídeo aulas186
PlataformaUdemy
Acessar Curso
Receitas Android
Capa do livro Receitas Para Desenvolvedores Android
TítuloReceitas Para Desenvolvedores Android
CategoriaDesenvolvimento Android
AutorVinícius Thiengo
Edição
Ano2017
Capítulos20
Páginas936
Acessar Livro
Código Limpo
Capa do livro Refatorando Para Programas Limpos
TítuloRefatorando Para Programas Limpos
CategoriaEngenharia de Software
AutorVinícius Thiengo
Edição
Ano2017
Capítulos46
Páginas599
Acessar Livro
Quer aprender a programar para Android? Acesse abaixo o curso gratuito no Blog.
Conteúdo Exclusivo
Receba em primeira mão, e com prioridade, os conteúdos Android exclusivos do Blog.
Email inválido

Opa, blz?

Nesse vídeo dou continuidade a série de vídeos sobre Material Design no Android, dessa vez colocando tabs na Toolbar. Não tão trivial como era quando utilizavamos ActionBar, para implementar tabs com efeito de sliding temos de utilizar algumas entidades como ViewPager, PageAdapter, SlidingTabLayout e SlidingTabStripe além de ter de realizar algumas modificações em nosso código implementado anteriormente, principalmente na parte do FloatingActionButton.

A sincronia com os itens do NavigationDrawer é tranquila de realizar apenas utilizando o método setCurrentItem() do ViewPager quando a troca acontece no NavigationDrawer e o método setSelection() do NavigationDrawer quando a mudança é direto na tab. Note que o onPageChangeListener que deve ser implmentado é o do SlidingTabLayout, pois a implementação da versão do ViewPager não funciona com esse tipo de implementacão de tabs. Apesar da utilização das entidades ImageSpan e SpannableString sem um vídeo anterior as explicando o entendimento ficou tranquilo, pois não faço muita coisa com elas a não ser adicionar a imagem (Drawable) a uma String.

Note que não cortei do vídeo alguns erros que cometi para mostrar onde foi o vacilo. Sem mais delongas vou deixar você assistir ao vídeo.

O link para download do projeto se encontra logo abaixo no post.

Veja todos os vídeos dessa série sobre Material Design no Android seguindo a YouTube PlayList abaixo:

Material Design

Segue link do vídeo sobre ViewPager já feito no Blog:

ViewPager no Android, Entendendo e Utilizando

Segue links das páginas apresentadas no vídeo:

Página da sessão Tabs nos guidelines do Material Design Android

Página do Google IO no GitHub

Página da view ViewPager no site de documento do Android

Página da classe PageAdapter no site de documentação do Android

Página da classe FragmentPageAdapter no site de documentação do Android

Página da classe FragmentStatePageAdapter no site de documentação do Android

Página da classe ImageSpan no site de documentação do Android

Página da classe SpannableString no site de documentação do Android

Vlw

Receba em primeira mão, e com prioridade, os conteúdos Android exclusivos do Blog.
Email inválido

Relacionado

Utilizando CardView, Material Design Android - Parte 4Utilizando CardView, Material Design Android - Parte 4Android
Utilizando NavigationDrawer, Material Design Android - Parte 5Utilizando NavigationDrawer, Material Design Android - Parte 5Android
FloatingActionButton Com Três Diferentes Libs, Material Design Android - Parte 6FloatingActionButton Com Três Diferentes Libs, Material Design Android - Parte 6Android
Material Dialog, Correção Bug StatusBar e Ações nos Fragments. Material Design Android - Parte 7Material Dialog, Correção Bug StatusBar e Ações nos Fragments. Material Design Android - Parte 7Android

Compartilhar

Comentários Facebook (13)

Comentários Blog (68)

Para código / script, coloque entre [code] e [/code] para receber marcação especifica.
Forneça seu nome válido.
Forneça seu email válido.
Forneça o comentário.
Enviando, aguarde...
Robson (1) (0)
24/08/2017
Olá Thiengo! Cara revi este seu vídeo e outros sobre Tabs mais todos mostram um exemplo clássico de leitura e apresentação, eu tenho uma demanda de um CheckList para veículos e pensei em utilizar Tabs para organizar o conteúdo, pensando em três Tabs, CheckList , Fotos e Ocorrências se eu estivesse em uma Activity mandava um Scroll e lá no fim um botão de Gravar, validava as informações e tranquilo já usando Tabs não estou sabendo como proceder pois o usuário ele precisa passar por cada uma e a unica que não precisa ser obrigatória é a Ultima , ou seja é como se fosse um Wizard que ao final terá os dados gravados teria alguma dica? bronca esta?
Responder
Vinícius Thiengo (1) (0)
26/08/2017
Robson, tudo bem?

Neste caso você pode passar os conteúdos de um fragmento ao outro (Tabs) por meio de um Bundle utilizando o setArguments() do próximo fragment, que pode ser o anterior em caso de volta: https://stackoverflow.com/a/9245510/2578331

Eu particularmente não precisei desse tipo de implementação ainda, pode ser que você tenha de trabalhar um pouco mais na lógica de negócio, pois as Tabs têm seus conteúdos já carregados.

Uma melhor maneira, mas aparentemente trabalhosa, mesmo eu não achando isso, é utilizar um simples SharedPreferences onde você terá chaves de acesso / salvar os conteúdos de acordo com cada tela das Tabs, sendo assim seria trivial salvar os conteúdos de uma tela e também acessa-los quando necessário, na própria tela ou na tela final.

Utilize os métodos do ciclo de vida do Fragment, onCreateActivity() e onPause(), para poder, respectivamente, obter os dados do SharedPreferences e salva-los nele.

Pode utilizar a base local que quiser, incluindo o SQLite, mas eu acredito que o SP é o suficiente.

Mais sobre essa API no link a seguir: https://www.thiengo.com.br/sharedpreferences-no-android-entendendo-e-utilizando

Abraço.
Responder
Robson (1) (0)
21/09/2017
Olá Thiengo! cara fui a pratica e evolui a tela, e ai chegou o momento de gravar os dados, eu não achei muito bom passar dados de um fragmento para o outro mais salvar qdo houver a mudança de Tab, a principio eu observei o que ocorre com as Tabs os eventos por padrão há o carregamento de duas Tabs, isto por conta do setOffscreenPageLimit se vc não o mudar.
Então pensei porque não fazer assim usar um Listener do TabLayout e qdo houver a mudança de Tab pegar a Anterior? mais ai tô com algo que não consigo resolver um famoso NullPointerException
// Na Activity coloquei um metodo para pegar dados da Aba Veiculos
private void obterDadosVeiculo(){
    VeiculoFragment fragment = (VeiculoFragment)
      customFragmentPageAdapter.getItem(0);

   if (fragment != null){
      EditText edtNumero = (EditText)
      fragment.getView().findViewById(R.id.edtNumero);
      // Erro ocorre aqui
      Log.i(TAG, "Frota: " + edtNumero.getText().toString());
   }
}
ai não consegui sair do erro, vou tentar fazer de outra forma usando o onPause() do fragment
Responder
Vinícius Thiengo (1) (0)
28/09/2017
Robson, tudo bem?

Tente o seguinte:

- Coloque o EditText edtNumero em uma variável de instância dentro de VeiculoFragment;
- Crie o método getEdtNumero() para acesso a este EditText;
- Utilize getEdtNumero() ao invés de getView().findViewById() para ter acesso ao EditTex.

Veja se assim passa sem problemas.

Abraço.
Responder
Robson (1) (0)
28/09/2017
Cara valeu pelo comentário, fiz assim e rolou
[code]InstalacaoActivity extends AppCompatActivity implements  {


    private CustomFragmentPageAdapter customFragmentPageAdapter;
    private ViewPager viewPager;
    private TabLayout tabLayout;

    private int id;
    private OrdemServico ordemServico;
    private OrdemServicoService service;
    // Atributos dos fragmentos
    private VeiculoFragment veiculoFragment;
    private EquipamentoFragment equipamentoFragment;
    private ObservacaoFragment observacaoFragment;
    private FotosFragment fotosFragment;
    // .... no onCreate
     customFragmentPageAdapter = new CustomFragmentPageAdapter(getSupportFragmentManager(), getResources()
                .getStringArray(R.array.titles_tabs), this);

        viewPager = (ViewPager) findViewById(R.id.view_pager);
        //viewPager.setOffscreenPageLimit(4);
        viewPager.setAdapter(customFragmentPageAdapter);
        //
        customFragmentPageAdapter.startUpdate(viewPager);
        veiculoFragment = (VeiculoFragment) customFragmentPageAdapter.instantiateItem(viewPager, 0);
        equipamentoFragment = (EquipamentoFragment) customFragmentPageAdapter.instantiateItem(viewPager, 1);
        observacaoFragment = (ObservacaoFragment) customFragmentPageAdapter.instantiateItem(viewPager, 2);
        fotosFragment = (FotosFragment) customFragmentPageAdapter.instantiateItem(viewPager, 3);
        customFragmentPageAdapter.finishUpdate(viewPager);
        //
        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
[/code]

e com isto agora quando o usuário muda de TAB eu vou na TAB Anterior e gravo os dados
[/code]
private void setupTabListener() {
        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());

                View customView = tab.getCustomView();
                if (customView != null) {
                    ImageView icon = (ImageView) customView.findViewById(R.id.itemImage);
                    int tabIconColor = ContextCompat.getColor(getApplicationContext(), android.R.color.white);
                    icon.setColorFilter(tabIconColor, PorterDuff.Mode.SRC_IN);
                }
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                Log.i(TAG, "onTabUnselected()" + tab.getPosition());
                Log.d(TAG, "onTabUnselected() - Fragment: " + ((BaseFragment) customFragmentPageAdapter.getItem(tab.getPosition())).getFragmentName());
                View customView = tab.getCustomView();

                Boolean valido;

                if (service.estaAberta(ordemServico)) {

                    if (tab.getPosition() == 0) {
                        if (veiculoFragment != null) {
                            Log.i(TAG, "ver Validação dos dados");
                            valido = veiculoFragment.isValid();

                            if (!valido) {
                                mostraSnackErro("Dados do veiculo invalidos!");
                            } else {
                                salvarVeiculo();
                            }
                        }
                    }

                    if (tab.getPosition() == 1) {
                        salvarEquipamento();
                    }

                    if (tab.getPosition() == 2) {
                        salvarObservacao();
                    }
                }
[/code]
Responder
19/06/2017
Olá, Thiengo, primeiramente parabens pelos conteúdos. Gostaria de tirar uma dúvida. Estou desenvolvendo uma aplicação android. Tenho uma tela que cadastra algumas informações. Porem preciso fazer o seguinte colocar um icone + (por exemplo) e dados pessoais na frente e os editText estarão toos ocultos, e quando clicar nesses + os campos editText aparecem. Porem terei isso umas 3 vezes na mesma tela. Como eu posso fazer isso? Me falaram do setVisibility mas não entendi muito bem como eu usaria. Poderia me ajudar, ou dar algum exemplo?
Responder
Vinícius Thiengo (1) (0)
20/06/2017
Jaqueline, tudo bem?

O setVisibility() permitirá que você apresente o que estava oculto ou vice-versa.

Para o ícone ?+?, ele estando em qualquer View (TextView, Button, ImageView, ?) você consegue vincular a ele um listener de clique:

editTextExemplo = (EditTex) findViewById( R.id.edit_text_exemplo );
bt = (Button) findViewById( R.id.button_plus );
bt.setOnClickListener( new OnClickListener(){
        @Override
        public void onClick( View view ){
                /*
                 * TODO O CÓDIGO DE APRESENTAÇÃO
                 * DE VIEWS, COM O setVisibility(), PARTE
                 * DESTE PONTO.
                **/
                
                if( editTextExemplo.getVisibility() == View.VISIBLE ){
                        // ESCONDER
                        editTextExemplo.setVisibility( View.INVISIBLE ); // OU View.GONE
                }
                else{
                        // APRESENTAR
                        editTextExemplo.setVisibility( View.VISIBLE );
                }
        }
} );

Assim, como dito no comentário do trecho de código acima, será possível atualizar a apresentação das Views.

A complexidade do código de apresentar / esconder Views vai depender do que é necessário em sua lógica de negócio. O exemplo com editTextExemplo é o mais simples.

Abraço.
Responder
20/06/2017
Valeu Thiengo, vou implementar ainda esta semana, e comento aqui se deu certo.
Responder
27/09/2016
Thiengo, primeiramente parabéns pela série, até gringo acompanha seu blog =D!
Bom, notei que ao deslizar a viewpager, na diagonal... troca de aba normalmente, MAS a ToolBar move um pouco para cima, coisa que não acontece no Whatsapp. Após muita procura pela solução, e finalmente, encontrei uma.
Segue a pergunta que criei no Stack Overflow:
http://pt.stackoverflow.com/questions/154415/como-desabilitar-o-scroll-top-da-toolbar
Solução: Substituir app:layout_scrollFlags="scroll|enterAlways" por
app:layout_scrollFlags="scroll|enterAlways|snap" app:layout_collapseMode="pin" (em ToolBar)
Responder
Vinícius Thiengo (0) (0)
27/09/2016
Vlw Jonathan. Abraço
Responder
Redondo (2) (0)
13/09/2016
Thiengo, acrescentando, não estou fazendo via XML, pois a qtd de tabs é grande e o conteúdo é modificado dinamicamente. Estou usando FragmentManager, FragmentTransaction, add, replace, commit, etc.
Responder
Redondo (1) (0)
13/09/2016
Olá, Thiengo, tudo bem? Muito boas suas explicações. Mas tenho uma dúvida. Como faço para enviar dados de uma Activity para seus Fragments? Já fiz inúmeros testes. Consigo passar os dados para o primeiro Tab/Fragment, mas o Tab/Fragment vizinho está sendo construído com os mesmos dados do primeiro.

Chequei getArguments e vi que para o primeiro Tab ela retorna o valor correto, mas no segundo, ela retorna NULL.

Cada Fragment tem sua própria classe (public class Fragment_A extends Fragment) com sua própria onCreateView. Passei os dados da Activity com Bundle/putString/setArgumets. Tudo funciona OK para o primeiro Fragment.

É possível fazer isso? Obrigado. Abç
Responder
Vinícius Thiengo (0) (0)
17/09/2016
Redondo, blz?
Utilize o EventBus (http://www.thiengo.com.br/eventbus-lib-comunicacao-entre-entidades-android ), com ele será possível, porém não se esqueça de entrar na página da library e utilizar a versão mais atual que a apresentada em vídeo (muda pouca coisa). Abraço
Responder
Ewerton (1) (0)
25/08/2016
E aí Thiengo blz? Precisava identificar quando uma determinada Tab foi ativada dentro da classe do Fragment correspondente, no Main Activity pra mim não resolve. Por exemplo quando ativar a Tab "Luxo" lá dentro da LuxuryCarFragment ter como saber que foi ativada para que eu possa chamar uma função. Já tentei com o OnCreateView mas não funciona pois ele dispara antes da Tab estar ativa, Tem como fazer isso?
Responder
Vinícius Thiengo (0) (0)
27/08/2016
Fala Eweron, blz?
Tente verificando pelo onResume(), mas se não me engano essa versão com onResume() tende a não funcionar tb. Nesse caso utilize o EventBus (http://www.thiengo.com.br/eventbus-lib-comunicacao-entre-entidades-android ) no SlidingTabLayout para de acordo com a posição atual em tela, informar o fragment referente a tab. Abraço
Responder
11/07/2016
Olá Thiengo, ai sua MainActivity é uma Activity, porém eu gostaria de saber se posso usar essas tabs em uma extends Fragment?
Responder
Vinícius Thiengo (0) (0)
13/07/2016
Fernanda, eu particularmente não utilizei tabs dentro de fragment ainda. Sei que dentro de uma Activity que extends FragmentActivity é possível.

Lembrando que AppCompatActivity extends FragmentActivity.

De qualquer forma, vi uma implementação utilizando TabHost aqui (http://stackoverflow.com/a/21605672/2578331 ), de repente funciona contigo. Abraço
Responder
Vinicius (1) (1)
09/03/2016
Parabéns pelos vídeos cara, tem me ajudado muito. Fiquei com uma dúvida com esse das TabsSliding: como faço para, estando em uma tab, executar uma ação (apertar um botão, clicar numa lista) e ir para outra Tab ?!
Responder
Vinícius Thiengo (0) (0)
09/03/2016
Fala Vinicius, blz?
Está utilizando ViewPager?
Se sim, tente isso dentro de seus listeners:

viewPager.setCurrentItem(itemIndex);

Caso nada ainda, volte ae que testo outra opção aqui. Abraço

Fonte: http://stackoverflow.com/a/29582101/2578331
Responder
Ricardo (1) (0)
03/12/2015
Thiengo, bom dia, blz? Primeiro, parabéns pelo site e pelo conteúdo, tenho aprendido muito com seus vídeos. Fiz um App de teste usando o seu video sobre toolbars (http://www.thiengo.com.br/sliding-tabs-toolbar-material-design-android-parte-8 ). E tenho duas dúvidas, que faz tempo que estou quebrando a cabeça mas não consegui implementar. 1 - Quando utilizo o navigationDrawer e seto uma Toolbar, ele insere um ícone (aquele com tres linhas horizontais, que não sei o nome)... e quando clico nele, ele mostra o navigationDrawer.. porém, esse ícone está com linhas brancas, e eu preciso deixar elas em preto. Já tentei várias coisas e não consegui.
navigationDrwawerLeft = new DrawerBuilder()
                    .withTranslucentNavigationBar(true)
                    .withToolbar(mToolbar)
                    .withSavedInstance(savedInstanceState)
                    .withActionBarDrawerToggle(true)
                    .withActionBarDrawerToggleAnimated(true)
                    .withActivity(this)
                    .withAccountHeader(headerNavLeft)
                    .withSelectedItem(0)
                    .withFooterDivider(false)
                    .withStickyFooterShadow(false)
                    .build();
2 . Nas tabs (SlidingTabLayout), eu quero implementar uma funcionalidade que, quando o usuário fizer um scrooll para cima, ele atualize o fragmento da tab selecionada..o meu fragmento popula uma listaview com dados retornados de um webservice. Então, essa ação de scrooll, faria uma nova requisição para o WS para atualizar a listview. Tipo o que o google chrome, quando vc está no topo da página e quer dar um "refresh". É possível? Abraço, e mais uma vez, parabéns.
Responder
Vinícius Thiengo (0) (0)
04/12/2015
Fala Ricardo, blz?
A dúvida 2 tenho dois vídeos que lhe respondem, um é com RecyclerView (http://www.thiengo.com.br/volley-gson-e-retrypolicy-em-material-design-android-serie-app ) e o outro é com ListView (http://www.thiengo.com.br/carregando-dados-no-listview-com-onscrolllistener-e-volley-no-android ).

A dúvida 1 se não me engano faço alguns testes neste vídeo 1 da série (http://www.thiengo.com.br/toolbar-material-design-android-parte-1 ). Mas uma resposta rápida é essa (http://stackoverflow.com/a/31870783/2578331 ). O nome daquele icon é hamburger. Abraço
Responder
Ruan Alves (1) (0)
05/11/2015
Fala Thiengo bele?

Seguinte como coloco o resultado da quantidade dos itens listados no cabeçalho da TAB, tipo o whats aonde quando possui uma nova conversa, fica a quantidade la encima informando o mesmo ... desde já agradeço!...
Responder
Vinícius Thiengo (1) (0)
07/11/2015
Fala Ruan, blz? O que pode fazer é na classe SlidingTabLayout criar um método que percorra a variavel de instancia mTabStrip e então nesse método acessar o elemento child correto para então adicionar a ele um layout personalizado que conterá tb um TextView para receber esse número de pendencia. Pode enviar a informação para esse método que vai criar por meio do EventBus (http://www.thiengo.com.br/eventbus-lib-comunicacao-entre-entidades-android ). Veja uma exemplo de acesso ao LinearLayout da tab na posição tabIndex (isso no método scrollToTab):
private void scrollToTab(int tabIndex, int positionOffset) {
        final int tabStripChildCount = mTabStrip.getChildCount();
        if (tabStripChildCount == 0 || tabIndex < 0 || tabIndex >= tabStripChildCount) {
            return;
        }

        View selectedChild = mTabStrip.getChildAt(tabIndex);
        if (selectedChild != null) {
            LinearLayout ll = (LinearLayout) selectedChild;
            //Log.i("LOG", "TYPE: "+((TextView) ll.getChildAt(0)).getText());
            //((TextView) ll.getChildAt(0)).setText("1212121");
            ll.setBackgroundColor(Color.BLACK);
            int targetScrollX = selectedChild.getLeft() + positionOffset;

            if (tabIndex > 0 || positionOffset > 0) {
                // If we're not at the first child and are mid-scroll, make sure we obey the offset
                targetScrollX -= mTitleOffset;
            }

            scrollTo(targetScrollX, 0);
        }
    }
Abraço
Responder
Ruan Alves (1) (0)
19/10/2015
Beleza?

Seguinte tenho 3 abas, e cada uma dela tem dados diferentes, por exemplo (1 - tem produtos, 2 - tem os itens que escolhe na 1, 3 - tem os dados de finalização), no caso quando vou salvar, preciso juntar essas 3 informações .... e cada uma ta em fragmente separado, no caso como ficaria pra juntar, o mesmo tb serve come exemplo um cadastro, onde separo por abas os requisitos, DADOS PESSOAIS, ENDEREÇO, FINANCEIRO .... Obrigado pela ótima vídeo aula!
Responder
Vinícius Thiengo (1) (0)
20/10/2015
Fala Ruan, blz?
Tem "n" maneiras de resolver esse problema, a que vejo como mais fácil e provavelmente a mais eficiente em termos de uso de memória, é utilizar um objeto central que conterá esses dados dos fragments (somente as informações necessárias e não todas), esse objeto fecará na Activity que contém os fragments, dessa forma todos os frags tem acesso ao mesmo objeto direto da Activity pelo cast ((SuaMainActivity) getActivity()).getObjCentral(); note que o método getObjCentral seria criado por ti e public. Abraço
Responder
Ruan Alves (1) (0)
20/10/2015
opa beleza? Tinha pensado nessa forma, mais queria saber se era mesmo uma boa pratica, mais já que vc disse o mesmo, show de boa ... Te perguntar em cada ABA eu teria um onCreateOptionsMenu com menus diferentes, aonde eu implemento esse quesito?
Responder
Vinícius Thiengo (1) (0)
21/10/2015
Ruan, dê uma olhada nessa resposta do stackoverflow (http://stackoverflow.com/a/15654039/2578331 ), aparentemente é o que vc está precisando, onCreateOptionsMenu  dentro do fragment de cada Aba. Abraço
Responder
Ruan Alves (1) (0)
23/10/2015
No caso quando coloco minha lista na Activity principal para meus fragmentes acessarem, toda vez que vou setar um valor ela está como null, pois do fragment eu chamo uma Activity, de la faço um cadastro, toda vez o mesmo fica null, então quando insiro ela fica com o valor correto, mais quando vou inserir mais e chamo novamente o mesmo está com o valor null ....
Responder
Vinícius Thiengo (0) (0)
24/10/2015
Ruan, comportamento estranho, certifique-se de que a lista está sendo criada no onCreate() da Activity (pode ser em outro método do ciclo de vida até chegar ao onResume) e que sua lista é uma variavel de instancia na Activity e não uma variavel local em que terá de ser instanciada toda vez que for acessada por um de seus fragments. Dessa forma a lista deve ser a mesma para todos os frags. Como está realizando o acesso a essa lista da Activity, digo, o código que está sendo utilizado no fragment? Abraço
Responder
Ruan Alves (1) (0)
25/10/2015
A lista de itens está sendo setado no onCreate na Activity, declaro na Activity (public static List<PedidoItem> listItensPedido;) e dentro do onCreate inicializo a mesma, dentro dos meus fragemtos eu cosigo acessar, mais tem uma ABA que preciso chamar uma nova Activity onde insiro o novo pedido, e quando salvo ou cancelo tenho que voltar aos meus fragmets, então essa lista ficá zerada ... No cado para min acessar essa lista de um Activity sem ser pelo Fragmente uso dessa maneira (RealizarPedidosActivity.listItensPedido.add(pedidoItem);) ... pedidoItem -> será meu objeto que vou inserir na minha lista ....
Responder
Vinícius Thiengo (1) (0)
30/10/2015
Hum... então o problema é que quando uma nova Activity atinge o topo da pilha de Activities de sua APP a anterior perde o foreground e então é chamado o onCreate() novamente na volta a ela, nesse caso os dados que não foram salvos com o onSaveInstanceState, ou outra entidade como o SharedPreferences ou o SQLite, são perdidos e têm de ser inicializados novamente. Salve sua lista com o onSaveInstanceState sendo que os objetos da lista têm de ser de uma classe que implemente o Parcelable (http://www.thiengo.com.br/parcelable-no-android-entendendo-e-utilizando ), na verdade somente para a serialização e deserialização serem mais rápidos. Tente assim para ver se vai sem problemas. Esse vídeo pode ajudar a utilizar o onSaveInstanceState (http://www.thiengo.com.br/otimizando-sua-app-android-com-onsaveinstancestate ). Outra opção é colocar a lista na classe que herda de Application (http://www.thiengo.com.br/application-class-no-android-entendendo-e-utilizando ), mas essa opção é menos inteligente que a anterior pelos problemas que podem ocorrer caso a lista fique mt grande e não seja necessária em todas as partes da APP, espaço de memória sendo utilizado indevidamente podendo ocorrer um memory leak. Abraço
Responder
leonmanickchand (1) (0)
09/08/2015
Ótimos vídeos Thiengo!

tenho três tabs no slidingtab e a primeira carrega dados do sqlite, porém quando passo para a segunda tab e adicionou itens ao sqlite e retorno à primeira tab o recyclrerView não é atualizado. Ele atualiza apenas quando passo para a terceira tab e retorno para a primeira.
alguma sugestão de como posso resolver este problema?
abraços.
Responder
Vinícius Thiengo (1) (0)
10/08/2015
Fala Leon, blz?
Faça o seguinte, utilizando o método do ciclo de vida do Fragment, onResume(), coloque nele uma chamada a um método personalizado que vai limpar a lista atual que está vinculada ao adapter do RecyclerView e então re-preenche-la (new word) com os novos dados do SQLite e logo em seguida chame o método notifyDataSetChanged() do adapter vinculado ao RecyclerView. Note que não é para criar uma nova instancia da lista e sim utilizar a mesma, porém limpando os dados anteriores (list.clear()) e adicionando os novos de uma list auxiliar ( list.addAll(auxList) ). Veja se assim vai sem problemas. Abraço
Responder
11/11/2015
Eu tentei fazer dessa maneira e não funcionou, no meu caso tenho 3 abas, 1 config o pedido, 2 acesso ao produto, 3 eu excluo os itens inseridos .. no caso quando eu exclui um item do pedido, ele deveria liberar o produto da aba 2 (aonde se eu ja inseri o produto, eu não posso inserir de novo), no caso ele não atualiza ... é a mesma dúvida do leonmanickchand
Responder
Vinícius Thiengo (0) (0)
29/11/2015
Ruan, continue com o mesmo script do onResume(), porém set seu ViewPager para carregar apenas um tab por vez (o atual, no caso). Veja esse exemplo (http://stackoverflow.com/a/13575984/2578331 ). Dessa forma ele passará pelo onResume(). Abraço
Responder
07/08/2015
Olá Thiengo implementei, porém o título das abas não estão aparecendo, só aparece quando eu tiro o setCustomView
Responder
Vinícius Thiengo (0) (0)
08/08/2015
Fala Everson, blz?
Tentou trocando a cor da fonte? Provavelmente a cor da fonte está igual a cor de background. Abraço
Responder
06/08/2015
Boa tarde Thiengo. Minha dúvida é o seguinte,  eu queria colocar Sliding Tabs diferentes para cada Fragment,  tipo ao invés de ter os Slindings interagindo entre os fragments como vc em fez,  eu teria um sliding para cada Fragment,  ex: pela minha ActionDrawer,  eu clicaria no item de Pessoas,  daí Pessoas é um Fragment  nele eu teria 2 slidings,  física e jurídica,  mas quando eu voltar pro Fragment início,  nele não tem nenhum siliding é possível isso?
Responder
Vinícius Thiengo (1) (0)
08/08/2015
Fala Danilo, blz?
Veja se essa discussão (http://stackoverflow.com/questions/23678513/swapable-tabs-in-slider-menu-fragment ) e consequentemente essa resposta (http://stackoverflow.com/a/23678630/2578331 ) ajudam na implementação desse SlidingTabs interno no fragment. Mas a principio é possível sim. A questão do voltar sem sliding tabs, utilize o addToBackStack() do FragmentTransaction para criar uma pilha de fragments e permitir a volta para a fragment anterior, em seu caso a fragment sem sliding. Abraço
Responder
Bruno Massa (1) (0)
26/07/2015
Thiengo o que acha de fazer tabs com uma library?
Eu em minha App usei uma lib para fazer as slidingtabs e achei bem fácil colocou até ripple effect em versões anteriores ao lollipop e tem a possibilidade de escolher entre texto e ícones nas tabs.
O link está no meu comentário no seu vídeo no YouTube.

Abraço
Responder
Vinícius Thiengo (0) (0)
26/07/2015
Vlw a dica Bruno, abraço
Responder
23/07/2015
Opa, blz Thiengo?

No IOS o componente TabBar tem um comportamento diferente, cada tab tem uma sequencia de telas, quando você troca de tab e volta, continua na tela que você tinha parado, é como se cada tab tivesse sua pilha de activity, isso é possível em Android?
Responder
Vinícius Thiengo (0) (0)
24/07/2015
Fala Diego, blz sim.
É possível sim, manter o conteúdo da tab intacto, porém vc terá de utilizar um saveInstanceState() tb. Abraço
Responder
17/07/2015
Olá Thiengo, como sempre seus conteúdos são de excelente qualidade e estão sempre me ajudando, parabéns!
Estou fazendo uma tela de cadastro, onde para melhorar na visualização, adicionei 2 tabs (Dados Pessoais e Endereço). Como faço na activity para quando a operação for de edição eu conseguir setar os EditText's de cada aba, pois não entendi como acessar os fragments que estão no adapter. Obrigado!
Responder
Vinícius Thiengo (0) (0)
18/07/2015
Fala James, blz?
Os dados vão vir de onde (entrada usuário, SQLite, Servidor Web, ...)? Vc consegue setar os dados nos EditTexts dos Fragments diretamente de algum dos métodos dos ciclo de vida do fragment entre o onCreateView() e o onResume(), incluindo ambos. Mas provavelmente vc fará isso no onCreateView(). Caso os dados venham da Activity e o fragment já esteja sendo apresentado, o que pode fazer é utilizar um EventBus na Activity para que com um listener no fragment respondendo a chamadas do EventBus, seu script possa capturar a mensagem e coloca-la em seus respectivos campos EditText. Deu para ter mais ou menos uma ideia? Abaixo o link do vídeo do EventBus que tenho aqui no Blog. Abraço

http://www.thiengo.com.br/eventbus-lib-comunicacao-entre-entidades-android
Responder
23/07/2015
Opa Thiengo, estou bem sim e vc? Demorei pra responder pois tentei várias vezes, mas ainda não consegui, sou novato em Android, e agradeço sua ajuda. Os dados estão vindo do SQLite, na activity eu chamo o DAO que carrega os dados. Como você citou, meu caso é o segundo, eu tenho uma activity, que chama o Fragment, só que a chamada é feita pelas tabs, igual no vídeo. Eu coloquei o seguinte no onCreate da activity:
//registrando o Eventbus
EventBus.getDefault().register(CadastrarAlterarEmpresaActivity.this);

//enviando dados pro fragment
MessageEB m = new MessageEB();
m.setClassTester(DadosEmpresaFrag.class+"");
m.setEmpresa(empresa);
EventBus.getDefault().post(m);
e no onDestroy dou o unregister, no fragment, registro ele no onCreateView e fiz o seguinte listener:
//listener
public void onEvent(MessageEB mMessageEB) {
    if(!mMessageEB.getClassTester().equalsIgnoreCase(DadosEmpresaFrag.class+""))
            return;

    if (mMessageEB.getEmpresa() != null) {
        Empresa empresa = mMessageEB.getEmpresa();
    txtIdEmpresa.setText(Integer.toString(empresa.getIdEmpresa()));
    }
}
Porém quando chamo a Activity o Fragment não vem com os dados carregados. Agradeço a atenção Thiengo.
Responder
Vinícius Thiengo (0) (0)
24/07/2015
Fala James, blz?
E carregar os dados do SQLite diretamente dentro dos fragments, no onCreateView(), seria possível ou o script tem uma limitação quanto a isso? Pois vejo essa sendo uma excelente opção. Outra opção é no contrutor do fragment, digo, enviar os dados no momento de instanciar o fragment, mas dessa forma vc teria de inventar um gambiarra. Indiquei o EventBus, mas ele não é a melhor opção nesse caso, carregando os dados do SQLite diretamente no fragment é a opção. Abraço
Responder
24/07/2015
Thiengo, muito obrigado, deu certinho. Agora desculpa abusar, mas uma última dúvida nessa questão ainda, na activity eu tenho um botão para salvar os dados, como eu faço pra recuperar o texto digitado pelo usuário no fragment que está instanciado? Como estou usando o tab isso me deixou confuso.
Grato
Responder
Vinícius Thiengo (0) (0)
25/07/2015
Fala James, blz?
Vc pode utilizar tag no momento de criar o Fragment, dessa forma quando o button que tem o listener na Activity for clicado vc pode recuperar o fragment via tag e então acessar um método público desse fragment, um método que retorne o valor do EditText do fragment que recebeu o texto digitado pelo user. Dessa maneira vc terá de testar para ver se funciona, pois vc está utilizando SlidingTabs, provavelmente pode ser um pouco mais dificil do que somente setar o fragment com tags.

Outra maneira é utilizar um EventBus (http://www.thiengo.com.br/eventbus-lib-comunicacao-entre-entidades-android ) para enviar uma mensagem para o fragment , essa mensagem nada mais sinaliza que a Activity está necessitando dos dados informandos pelo user no EditText, por exemplo. Então nesse caso o Activity teria um método publico no qual o fragment, dentro do listener de eventos do EventBus, acessaria e enviaria os dados necessários informados pelo user. Tem outras formas, provavelmente, mas essas são as duas que vejo de inicio, tendo em mente que o listener do button é no Activity e os dados estão na fragment. Abraço
Responder
Aricelio de Souza (1) (0)
01/07/2015
Fala Thiengo blz? Primeiramente parabéns pelos videos, muito show!
Minha dúvida é a seguinte, em minha app uso apenas duas tabs, o que faz com as duas fiquem juntas á esquerda, deixando um espaço na direita. Tem como fazer com que as tabs preencham todo o espaço na horizontal?
Responder
Vinícius Thiengo (0) (0)
02/07/2015
Fala Aricelio, blz?
Esse comportamento das tabs é padrão do Material Design. Nos dois links abaixo têm duas implementações com tabs da maneira que vc quer, a principio veja com foi preenchido o XML com o SlidingTabs e o VIewPager, pois provavelmente alterando somente esses XMLx pode já ser o suficiente, caso contrário terá de implementar o exemplo desses posts mesmo. Abraço

http://www.android4devs.com/2015/01/how-to-make-material-design-sliding-tabs.html

http://www.exoguru.com/android/material-design/navigation/android-sliding-tabs-with-material-design.html
Responder
Aricelio de Souza (1) (0)
02/07/2015
Vlw! Mto obrigado! Ajudou muito
Responder
20/06/2015
Blz Thiengo! Poderia dar uma olhada em como ficou meu método? Até consegui passar o texto e imagem com base no seu video e ajuda de fóruns, mas não consigo colocar a imagem em cima e o texto em baixo como disse no comentário anterior. Fiz a inclusão de um ImagemView no xml tab_view Olha como ficou: http://i.imgur.com/mnme3pq.png

Segue método atualmente:

public CharSequence getPageTitle(int position) {

    Drawable tab = mContext.getResources().getDrawable(icons[position]);
    tab.setBounds(0, 0, heightIcon, heightIcon);  
    
    ImageSpan is = new ImageSpan(tab);
    SpannableString sp = new SpannableString(titles[position);
    sp.setSpan(is, sp.length()-1, sp.length(), 0);

    return sp;
    }
Responder
Vinícius Thiengo (1) (0)
21/06/2015
Fala Bruno, blz?
Veja se centralizando a imagem no SpannableString (http://stackoverflow.com/questions/19818654/need-to-center-align-a-single-portion-of-text-in-a-textview ) depois de adiciona-la e então logo após, antes mesmo de adicionar a String (title) adicione uma quebra de linha no Spannable (\n é uma break line - http://stackoverflow.com/questions/7120377/string-format-and-line-break ), coloque então o title e centralize ele tb. Veja se dessa forma vai.

Uma outra maneira é colocar o ImageView e um TextView dentro de um LinearLayout com orientation vertical, centralizar o conteúdo do LinearLayout com o atributo android:gravity="center" e então trabalhar um pouco o tamanho da ImageView para ficar igual vc deseja. Tenta essas duas formas e ve se alguma funciona para ti. Qualquer coisa volte ae. Abraço
Responder
19/06/2015
Thiengo, blz? Tenho aprendido MUITO acompanhando seus videos! Parabéns pelo conteúdo e didatica!
Gostaria de te pedir ajuda em relação ao Sliding tabs toolbar: preciso colocar texto e icon nas minhas tabs, seguindo este modelo do site Material Design: http://material-design.storage.googleapis.com/publish/material_v_4/material_ext_publish/0B6Okdz75tqQsS2pLN2MwWmUyRW8/components_tabs_usage_specs8.png

Dá para aproveitar a mesma estrutura que você usou neste video? Se não, teria alguma sugestão de material que possa me ajudar?
Responder
Vinícius Thiengo (1) (0)
20/06/2015
Fala Bruno, blz sim.
Da para aproveitar sim, veja até a parte de View personalizada na tab do sliding. Abraço
Responder
Rafaela (1) (0)
05/06/2015
Thiengo, incrível os vídeos como sempre. Mas gostaria que me explicasse uma coisa, estou fazendo um projeto e ao invés de utilizar a classe TabHost (utilizada para exibir tela com abas) estou usando botões para dar esse efeito. Porém ao sair de uma tela para outra, as informações desaparecem, exemplo: digitei informações na aba A e cliquei na aba B, e digitei informações na aba B também, depois cliquei novamente na aba A, porém as informações digitadas anteriormente não estão mais lá na tela. Sabe qual é o procedimento que devo realizar?
Responder
Vinícius Thiengo (1) (0)
06/06/2015
Fala Rafaela, blz?
Está com buttons mesmo ou é uma forma diferente de se referir a SlidingTabs com ViewPager? Enfim, está com os conteúdos sendo apresentados em fragments, correto? Assumindo que sim, vc pode utilizar o SaveInstanceState do ciclo de vida do fragment () para salvar os dados já informados nessa tela, se mesmo assim não funcionar isso indica que cada vez que vc muda de tela o script está criando novos fragments (that's bad!). Nesse caso, uma solução para salvar os dados é utilizar o SQLite ou o SharedPreferences, porém terá um pouco mais de lógica devido a verificação de quando os dados estão ainda válidos para serem novamente apresentados na tela. Com o SlidingTab vc não deve ter esse problema. Os vídeos abaixo podem ser uma ajuda se ainda não conhece os conteúdos citados acima. Abraço

http://www.thiengo.com.br/otimizando-sua-app-android-com-onsaveinstancestate

http://www.thiengo.com.br/fragments-no-android-trabalhando-com-multiplas-activities

http://www.thiengo.com.br/ciclo-de-vida-e-otimizacao-de-fragments-no-android

http://www.thiengo.com.br/sqlite-no-android-entendendo-e-utilizando

http://www.thiengo.com.br/sharedpreferences-no-android-entendendo-e-utilizando
Responder
Rafaela (1) (0)
08/06/2015
Thiengo, obrigada pelo breve retorno. Realmente estou utilizando botões, já tinha visto as suas aulas do BD SQLite, estou vendo novamente essa vídeo aula para conseguir extrair a lógica que vou ter que realizar para conseguir navegar de uma tela para outra sem conseguir perder os dados que digitei.
Responder
Vinícius Thiengo (2) (0)
08/06/2015
Ok Rafaela, dê uma olhada tb nesse post do Hive sobre SQLite no Android (http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/ ). Abraço
Responder
Rodolfo Lima Jesus (1) (0)
03/06/2015
Show de bola o Artigo. Usando slidetabs eu posso colocar aquela linha vertical na divisória de cada item? Como se fosse celulas de uma linha com margem. Além disso, quando utilizamos menu, tabs e background da activity tudo na cor branca. É possível colocar também uma linha na horizontal abaixo do slidetabs para dividir tabs de tela ou só posso usar slidetabs quando a cor do slidetabs e menu for diferente do background da acticity?
Responder
Vinícius Thiengo (0) (0)
03/06/2015
Fala Rodolfo, blz?
A linha horizontal com o layout todo em brando é tranquilo, basta em cada layout de fragment vc começar com um View na horizontal (completamente) e com um altura de 1dp, assim escolha a cor desse view e está td ok. Essa linha vertical nas tabs teria de dar uma pesquisada mais a fundo, mas lembre que vc pode fornecer uma VIew personalizada na tab, logo vc pode colocar a linha vertical ali mesmo, sem problemas, porém note que essas linhas verticais nas tabs não fazem parte do Material Design (http://www.google.com/design/spec/components/tabs.html#tabs-usage ). Abraço
Responder
BeargLincoln (1) (0)
20/05/2015
Ola thiengo. Acabei constantando na minha app que ela so funciona bem as tabs em modo portable pois quando mudo para lonscape da bug... alguma solucao pra este problema?
Responder
Vinícius Thiengo (1) (0)
20/05/2015
Fala Lincoln, blz?
A correção é simples, no xml tab_view.xml vc apenas coloque nos atributos do ListView container android:layout_width e android:layout_height o valor "wrap_content". Abraço
Responder
juniogro10 (1) (0)
19/05/2015
Muito bom o vídeo, tem alguma maneira de eu mudar o menu junto com a troca do fragment?
Tipo:

Fragment 1 - > menu1 no toolbar
Fragment 2 - > menu2 no toolbar
Responder
Vinícius Thiengo (1) (0)
19/05/2015
Fala Junio, blz?
Dei uma pesquisada aqui e não encontrei uma nada falando sobre, a principio vc terá de fazer com Activity, pois dessa forma é possível, pode carregar o fragment dentro da nova Activity, assim reaproveita o código se já tiver implementado ele. Isso tanto para mudar as tabs (digo, colocar novas tabs) quanto para o menu. Abraço
Responder
juniogro10 (1) (0)
19/05/2015
Para min não seria prático fazer essa modificação no projeto para o incremento desse modo
Se tivesse um modo de mudar visibilidade dos ícone no menu?
Queria uma maneira prática sem carregar nada além já tá..
Tenho que colocar um ícone em um carregamento específico da drawer..
Vou procurar algum solução para isso, se não acha vou acaba usando um floating button

Abraço
Responder
miguelslemos (7) (0)
18/05/2015
Parabéns pelo vídeos, muito show!
Responder