Como Exibir Tabs Utilizando TabLayout e ViewPager no Android

A forma de programação para exibir Tabs no Android vem mudando em cada lançamento de uma nova versão do sistema operacional. A partir da API 22 do Android Lollipop surgiu uma nova forma de exibir telas com Tab, que possuem o efeito chamado de "Swipe". Este efeito permite visualizar cada Tab com um movimento horizontal na tela.

Mas e se quisermos utilizar a Tab no formato tradicional onde cada Tab é acessada clicando-se na aba. Ainda é possível montar este layout utilizando as classes TabLayout e ViewPager.

Para mostrar como podemos montar a tela com a apresentação tradicional de tabs, desenvolvi um projeto que exibe três Tabs de acordo com o apresentado na Figura 1.

Figura 1

O projeto é composto da tela principal MainActivity, das telas das Tabs a Tab1Fragment, Tab2Fragment e Tab3Fragment e da classe TabPagerAdapter utilizada para gerenciar os Fragments, neste caso as classes das Tabs.

O arquivo de layout da tela principal activity_main.xml deve ser composto de um TabLayout e de um ViewPager:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical" android:padding="4dip"
    android:gravity="center_horizontal"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabMode="fixed"
        app:tabGravity="fill" />

    <android.support.v4.view.ViewPager 
xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.v4.view.ViewPager>

</LinearLayout>

No widget TabLayout o atributo tabMode foi configurado como fixed, para que as Tabs fiquem fixadas e respondam ao clique na aba, ao invés do movimento de "swipe".

As telas de Tabs possuem cada uma somente um TextView para exibir um texto. Segue o código do arquivo xml que foi utilizado para construir a Tab1Fragment.


<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="15dp"
    tools:context="br.com.romarconsultoria.tabexemplo.Tab1Fragment">

    <TextView android:layout_width="match_parent" 
android:layout_height="match_parent"
        android:text="Tela da Tab1"
        android:textSize="25sp"/>

</FrameLayout>

As classes Tab1Fragment, Tab2Fragment e Tab3Fragment são utilizadas para exibir o conteúdo de cada Tab. Segue o código da classe Tab1Fragment. As classes Tab2Fragment e Tab3Fragment são similares.


public class Tab1Fragment extends Fragment {

    public static Tab1Fragment newInstance() {
        Tab1Fragment fragment = new Tab1Fragment();
        return fragment;
    }

    public Tab1Fragment() {
        // Deve existir um construtor vazio
        // na classe que estende um Fragment
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_tab1, container, false);
    }

}

Para gerenciar as Tabs é necessário criar uma classe que estende a classe FragmentPagerAdapter responsável pela paginação das Tabs.  Criei a classe TabsPagerAdapter e implementei os métodos:

  • getItem(int): Retorna a tab que deve ser exibida de acordo com a posição selecionada.
  • getCount(): Retorna o número total de tabs.
  • getPageTitle(int): Retorna o título da tab de acordo com a posição selecionada. 

Os métodos getItem(int) e getCount() são obrigatórios na classe que estende a classe FragmentPagerAdapter.


public class TabsPagerAdapter extends FragmentPagerAdapter {
    private static final int NUM_TABS = 3;

    public TabsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch(position){
            case 0:
                return Tab1Fragment.newInstance();
            case 1:
                return Tab2Fragment.newInstance();
            default:
                return Tab3Fragment.newInstance();
        }
    }

    @Override
    public int getCount() {
        return NUM_TABS;
    }

    @Override
    public CharSequence getPageTitle(int position) {

        if (position == 0){
            return "Tab 1";
        }

        if (position == 1){
            return "Tab 2";
        }

        return "Tab 3";
    }
}
A classe MainActivity inicia o TabLayout, o ViewPager e configura o adaptador que as tabs devem utilizar.


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Tabs
        TabLayout tabs = (TabLayout) findViewById(R.id.tabs);
        ViewPager pager = (ViewPager) findViewById(R.id.pager);
        TabsPagerAdapter adapter = new TabsPagerAdapter(getSupportFragmentManager());

        pager.setAdapter(adapter);
        tabs.setupWithViewPager(pager);
    }
}
Pronto agora já é possível navegar nas tabs no formato fixo.

Definição e Exemplo de Scrum


scrum trabalho em equipe


Esse post faz parte de uma série sobre Scrum, descreve a definição e mostra alguns exemplos práticos de utilização do Scrum em projetos de empresas.

Você pode também baixar o Ebook Introdução ao Scrum que apresenta todos os posts da série sobre Scrum.

Introdução


O Scrum não é um processo ou uma técnica para construir produtos, ao invés disto é um framework no qual se podem empregar várias técnicas ou processos, para melhorar as práticas de desenvolvimento e gestão do produto.

O Scrum é um framework de processo que tem sido usado para administrar o desenvolvimento de produtos complexos desde o início dos anos 90. O nome Scrum é derivado de uma atividade que ocorre dentro de um jogo chamado Rugby. O Scrum dentro do jogo de Rugby significa que o jogo deve recomeçar, sempre que uma regra é infringida.

O framework do Scrum consiste de Scrum Teams, seus papéis, eventos, artefatos e regras. Cada componente dentro do framework serve a um propósito específico e é essencial para o uso e sucesso do Scrum.

A Teoria do Scrum


O Scrum é fundamentado na teoria de controle do processo empírico, ou empirismo. O empirismo afirma que o conhecimento vem da experiência e tomadas de decisões baseado no que é conhecido. O Scrum emprega uma abordagem iterativa e incremental, para aperfeiçoar a previsibilidade e controlar os riscos.

Três pilares apoiam toda a implementação de controle de um processo empírico: transparência, inspeção e adaptação.


Transparência

Os aspectos do processo devem ser visíveis pelas pessoas responsáveis pelo resultado. A transparência requer que estes aspectos sejam definidos em um padrão comum, de forma que os observadores compartilhem o mesmo entendimento do que está sendo visto. Um exemplo de transparência é definir que todos os participantes do processo, utilizem uma linguagem comum, para que todos tenham o mesmo entendimento.

Inspeção

A inspeção deve ser feita durante todo o processo de trabalho, para detectar se ocorreram variações indesejáveis no processo. Mas é preciso ter cuidado para que as inspeções não sejam frequentes demais, de forma a atrapalhar o andamento do trabalho. A inspeção é mais eficiente se as pessoas que executam são conhecedoras do assunto

Adaptação

Se o inspetor detecta que um ou mais aspectos do processo sofreu desvios de forma que o produto resultante seja inaceitável, o processo deve ser ajustado. O ajuste deve ser feito o mais rápido possível para minimizar futuros desvios.

Exemplo de Scrum


Normalmente encontramos muita teoria do que é o Scrum, mas não encontramos com facilidade publicações de exemplos práticos de empresas que adotaram o Scrum.

Nesse post inseri dois exemplos de utilização, um com uma aplicação na área de software e o outro na área de construção. Os exemplos tem um link para os artigos com a história completa, detalhando a utilização do Scrum no processo de desenvolvimento do produto. Os artigos estão originalmente em inglês.

Scrum Aplicado em Projeto de Software nas Ferrovias Holandesas


A ferrovia holandesa tinha a necessidade de desenvolvimento de um software de informações de viagens para os passageiros. As informações como horários, destinos, intervalos, deveriam ser exibidas em displays e comunicadas através de som automaticamente.

A ferrovia contratou uma consultoria que aplicou o Scrum no desenvolvimento do projeto, utilizando equipes na Índia e na Holanda.  O projeto era muito grande envolvendo várias equipes localizadas nos dois países, e com uma integração complicada com outros produtos, além de possuir uma interface de usuário bem complexa.

Uma das exigências do cliente neste projeto era ter a possibilidade de ver o projeto funcionando em etapas, desde o início e não somente na entrega final do produto. Com a utilização do Scrum foi possível fazer entregas incrementais e permitir uma maior participação do cliente em todas as fases. Também permitiu um melhor gerenciamento de todas as equipes envolvidas no projeto.

O artigo descreve detalhadamente como foi todo o processo de desenvolvimento, bem como as dificuldades e as lições aprendidas sobre o início do projeto, a importância da escolha do dono do produto (Product Owner), a importância de estimativas, a efetividade da comunicação e a importância de uma documentação bem elaborada.

A história completa está descrita no artigo Case Study: Distributed Scrum Project for Dutch Railways.

Scrum Aplicado em Projeto de Construção de Viaduto 


Na Índia em Bangalore, existia a necessidade de construir dois viadutos um para cada sentido, para melhorar o tráfego na região. A estimativa do projeto era de entregar os viadutos em dezoito meses.

A ideia era construir duas rotas temporárias uma para cada sentido antes de construir os viadutos, para desviar o tráfego da área de construção. Com a utilização do conceito incremental foi construída uma rota temporária e um viaduto, que ficou pronto em nove meses, e já passou a ser utilizado pelos usuários.

Como um viaduto estava pronto, ele começou a ser utilizado pelos usuários, ao invés de ter que construir a outra rota temporária para o outro sentido. Nos nove meses restantes foi construído o segundo viaduto.

A utilização do Scrum neste caso com a entrega incremental se mostrou eficaz tanto para o projeto como para os usuários, que tiveram a entrega de um viaduto na metade do tempo sem a necessidade de construir duas rotas temporarias.

O detalhe completo do projeto está descrito no artigo A Real Life Example of Agile.

Como podemos observar nos exemplos de Scrum, ele pode ser aplicado tanto na área de software onde a utilização é mais conhecida, como em várias outros áreas de projetos complexos.

História do Scrum

Photo by Fabrizio Verrecchia on Unsplash

Esse post faz parte de uma série sobre Scrum que descreve a história do processo de criação do Scrum.

Você pode também baixar o Ebook Introdução ao Scrum que apresenta todos os posts da série sobre Scrum.

A História

O Scrum foi criado por Jeff Sutherland e Ken Schwaber em 1995, e apresentado na conferência Ospsla em Austin no Texas. Neste mesmo ano foi publicado o artigo “SCRUM Software Development Process”.

Os autores herdaram o termo “Scrum” do artigo “The New Product Development Game”, publicado por Takeuchi e Nonaka em 1986. Neste artigo eles utilizam o termo “Scrum” obtido do jogo de Rugby, onde fazem uma analogia entre o processo de desenvolvimento de um produto com as táticas de jogo de Rugby, que valorizam o trabalho em equipe.

Neste artigo Takeuchi e Nonaka concluem que as equipes pequenas e auto-organizadas têm um desempenho melhor no desenvolvimento de produtos complexos, quando são definidos objetivos ao invés de tarefas a serem executadas.

No artigo eles mencionam que o mundo do negócio mudou muito, para que uma empresa seja competitiva não basta ter uma boa qualidade, custo baixo e um diferencial no mercado. As empresas também precisam de rapidez e flexibilidade.

O framework do Scrum para desenvolvimento de software foi criado para desenvolver e manter produtos complexos, baseado nos princípios deste artigo.

Durante o desenvolvimento inicial do Scrum, Ken pediu auxílio para o Professor Babatunde A. Ogunnaike Tunde, que é um engenheiro famoso na área de pesquisa de controle de processo, para verificar os processos de desenvolvimento. Ele investigou várias metodologias de desenvolvimento de software e chegou à conclusão que o processo cascata e preditivo não era bom para o desenvolvimento de software, confirmando que a abordagem empírica do Scrum era um processo preferido.

O empirismo é utilizado em trabalhos complexos onde o desconhecido prevalece sobre o conhecido, e predições têm pouco valor devido à alta taxa de alterações e incertezas.

Em 2001 Jeff e Ken estavam entre os 17 líderes de desenvolvimento de software, criando o Manifesto de Desenvolvimento de Software Ágil. Logo em seguida a Agille Alliance foi fundada com Ken sendo o primeiro presidente.

Ainda em 2001, Ken foi coautor juntamente com Mike Beedle do primeiro livro sobre Scrum, “Agile Software Development with Scrum”.

Em 2002 Ken Schwaber fundou o Scrum Alliance juntamente com Mike Cohn e Esther Derby, com Ken presidindo a organização. Nos anos seguintes o programa de certificação em Scrum Master e seus derivativos foram criados.

Em 2006 Jeff Sutherland criou sua companhia a Scrum Inc., enquanto continuava a oferecer e ministrar cursos de Certificações em Scrum.

Ken saiu da Scrum Alliance em 2009 e fundou a Scrum Org., para melhorar a qualidade e efetividade do Scrum.

O primeiro Scrum Guide foi publicado em 2010 e sofreu atualizações em 2011 e 2013, enquanto Jeff e Ken tinham estabelecido o reconhecimento mundial do Scrum.

Evolução do Scrum
Desde a sua publicação em 1995 até os dias de hoje, o Scrum foi adotado por várias empresas de desenvolvimento de software em todo o mundo.

Entretanto, o método também foi aplicado com sucesso em outros domínios como por exemplo, manufatura, marketing, operações e educação.

Como Abrir Arquivo CSV no Planilhas Google

No Google Drive além do armazenamento de arquivos, existem alguns aplicativos de produtividade como o Documentos, Planilhas e Apresentações, que podem ser utilizados como uma opção ao Word, Excel e PowerPoint. Neste post vou mostrar como abrir um arquivo CSV no Planilhas Google.



Há algum tempo era comum utilizar arquivos CSV para armazenar informações em um formato parecido com uma tabela. As informações eram separadas por um caractere separador. Cada linha tinha várias informações, e cada separador representava uma coluna. Usava-se como separadores, vírgula, ponto e vírgula, tab ou algum outro caractere especial que não fazia parte do texto. 

Mesmo nos dias de hoje ainda é comum usar arquivos CSV, e alguns programas gravam informações neste formato.

O único problema é a visualização destes arquivos. Eles podem ser abertos em qualquer editor de texto, o problema é a formatação apresentada. O texto vai aparecer de uma forma difícil de ler e entender. Segue um exemplo de um arquivo CSV aberto no Notepad. Ele exibe informações de livros com o título, autor e ano de publicação, separados em colunas, usando o separador ponto e vírgula.



O Excel e outros programas similares como o Planilhas Google permitem a abertura destes arquivos no formato de tabela.

Para abrir o arquivo CSV em formato de tabela temos que utilizar o recurso de importar arquivo  do Planilhas Google. Para importar o arquivo CSV siga os seguintes passos:

1. Abra uma planilha nova nas Planilhas Google e selecione o menu ARQUIVO > IMPORTAR. O Planilhas Google vai exibir uma janela onde você pode selecionar o local do seu arquivo .CSV, que pode estar no Meu Drive, Compartilhado, Recentes ou você pode fazer o Upload do arquivo. Vou optar em usar a opção "Upload". Depois de selecionado o arquivo, o Planilhas Google apresenta a janela de importação.



2. Na janela "Importar Arquivo" você deve preencher a opção dos campos "Importar local" e "Tipo de Separador".

No campo "Importar local" você pode escolher entre:
  • Criar planilha: Nesta opção os dados do arquivo importado serão inseridos em uma nova planilha.
  • Inserir novas páginas: Nesta opção os dados do arquivo importado serão inseridos em uma nova página.
  • Substituir planilha: Nesta opção os dados do arquivo importado serão inseridos na planilha atual. 
  • Substituir página atual: Nesta opção os dados do arquivo importado irão substituir a página atual.
  • Anexar à página atual: Nesta opção os dados do arquivo importado serão anexados na página atual, ou seja eles serão inseridos logo após o último dado existente na página atual.
  • Substituir dados na célula selecionada: Nesta opção os dados do arquivo importado irão substituir os dados existentes na página, a partir da célula selecionada. Portanto a célula onde se deseja iniciar a importação deverá estar selecionada, antes mesmo de iniciar a importação.
No campo "Tipo de separador" você pode escolher entre:
  • Detectar automaticamente: A Planilha do Google faz a leitura do arquivo e tenta detectar automaticamente o tipo de caractere separador utilizado. Por exemplo, se o arquivo está separado por vírgula, por tab, por espaço ou outro tipo de separador.
  • Guia: Esta opção é para arquivos separados por tabulação.
  • Vírgula: Esta opção é para arquivos separados por vírgula.
  • Personalizado: Esta opção é para arquivos com qualquer outro tipo de separador, e pode ser selecionado desde que você saiba qual é o tipo de separador o arquivo está utilizando. Por exemplo, se o arquivo estiver utilizando um separador tipo ponto e vírgula, digite no campo "Separador personalizado" o símbolo do ponto e vírgula.
3. O campo "Converter, texto em números, datas e fórmulas", quando selecionado, converte automaticamente os campos numéricos e de data, do arquivo CSV, em números, datas e fórmulas. Selecione este campo se deseja fazer a conversão automática na importação.

Para demonstrar como abrir um arquivo CSV no Planilhas Google, utilizei um arquivo que possui as informações de livros, nome do livro, autor e ano de publicação. O arquivo utiliza o separador ponto e vírgula, portanto utilizei a seguinte configuração de importação:

No campo "Importar local" selecionei "Criar Nova Planilha", no campo "Tipo de separador" selecionei "Personalizado" e preenchi o campo com o símbolo de ponto e vírgula ";". Veja como ficou o arquivo CSV no Planilhas Google, após a importação:


Agora temos um arquivo CSV aberto em uma planilha no formato de tabela, e a partir de agora o arquivo pode ser editado e salvo em uma planilha, facilitando a visualização dos dados e tratamento dos dados, se necessário.