Olá povo,
Tive a satisfação de ser convidado para palestrar na FEECBR, uma convenção para profissionais de internet de diversas áreas. O evento foi idealizado por um grupo experiente, reconhecido pela qualidade e grau de inovação de projetos educacionais no Nordeste do Brasil.
Na oportunidade, palestrantes regionais, nacionais e até internacionais estarão discutindo temas relevantes sobre tecnologia em vários segmentos.
Estarei falando sobre a criação de interfaces inteligentes para smartphones e tablets Android, mostrando os principais padrões e técnicas para obter uma usabilidade atraente, eficiente e seguindo os padrões adotados por aplicações de sucesso.
Editado em 02/12/2012
Segue abaixo os slides da minha palestra.
4br4ç05,
nglauber
segunda-feira, 19 de novembro de 2012
segunda-feira, 5 de novembro de 2012
ActionBar no Android 2.x
Olá povo,
Quem me conhece saber que não sou muito fã de frameworks e bibliotecas, gosto de procurar ao máximo uma solução nativa da plataforma ao qual estou trabalhando. E uma coisa que me deixava muito chateado no Android era a não retrocompatibilidade da ActionBar com versões anteriores à 3.0 (quando ela foi lançada).
Felizmente esse problema acabou com a biblioteca SherlockActionBar, que traz o recurso da ActionBar para aparelhos com Android 2.3 ou inferior, e mantém os nomes de métodos iguais à plataforma nativa. E o que é melhor, quando a aplicação está rodando em versões 3.0 ou superior, o Sherlock só faz chamar a API padrão, ou seja, utiliza a ActionBar nativa.
Vou fazer um exemplo que utiliza dois recursos da ActionBar: Menus e Abas. Faça o download em http://actionbarsherlock.com e descompacte em algum local do seu computador. No Eclipse, importe o projeto library para dentro do seu workspace, para tal acesse File/New.../Project, e na janela que for exibida selecione Android/Android Project From existing code selecione o diretório onde você descompactou o Sherlock. Aparecerá além do projeto library, os demos do Sherlock, por agora só importe o projeto library.
Crie um novo projeto selecionando o Build SDK 4.1 (o Sherlock utiliza Temas e Estilos dessa versão do Android) e o Minimum Required para 2.2. Depois de criado, vá até a pasta lib do projeto e apague o arquivo android-support-v4.jar (o Sherlock já inclui esse arquivo). Agora adicione a referência ao projeto library do Sherlock, para tal, clique com o botão direito no projeto e selecione Properties.
Selecione Android, e na parte inferior direita, clique em Add... e selecione o projeto library e clique em OK. Agora, deixe a Activity do seu projeto conforme abaixo:
No onCreate setamos o tema do Sherlock, e em seguida setamos o arquivo de layout da Activity (que está logo abaixo). Depois inicializamos os fragmentos e definimos a forma de navegação da ActionBar para o modo de abas. E por fim, criamos e adicionamos as abas na ActionBar.
Abaixo temos o arquivo de layout da aplicação (res/layout/activity_exemplo_sherlock.xml):
Note que o nome da classe é composto do pacote da aplicação + o nome da classe. Como estamos usando uma Inner Class, o sinal de $ é usado. Se você definir os Fragmentos em arquivos separados (o que é o normal) coloque apenas o nome completo da classe.
E abaixo o arquivo de menu da aplicação (res/menu/activity_exemplo_sherlock.xml) ele é carregado no método onCreateOptionsMenu. Para tratar cada opção adicione o método onMenuItemSelected.
Ao mandar executar a aplicação devemos ter uma tela similar a abaixo.
Esse post é em homenagem aos meus alunos da FA7, que me obrigaram a aprender essa biblioteca durante a aula :) Abraço a todos!
Qualquer dúvida, deixem seus comentários.
4br4ç05,
nglauber
Quem me conhece saber que não sou muito fã de frameworks e bibliotecas, gosto de procurar ao máximo uma solução nativa da plataforma ao qual estou trabalhando. E uma coisa que me deixava muito chateado no Android era a não retrocompatibilidade da ActionBar com versões anteriores à 3.0 (quando ela foi lançada).
Felizmente esse problema acabou com a biblioteca SherlockActionBar, que traz o recurso da ActionBar para aparelhos com Android 2.3 ou inferior, e mantém os nomes de métodos iguais à plataforma nativa. E o que é melhor, quando a aplicação está rodando em versões 3.0 ou superior, o Sherlock só faz chamar a API padrão, ou seja, utiliza a ActionBar nativa.
Vou fazer um exemplo que utiliza dois recursos da ActionBar: Menus e Abas. Faça o download em http://actionbarsherlock.com e descompacte em algum local do seu computador. No Eclipse, importe o projeto library para dentro do seu workspace, para tal acesse File/New.../Project, e na janela que for exibida selecione Android/Android Project From existing code selecione o diretório onde você descompactou o Sherlock. Aparecerá além do projeto library, os demos do Sherlock, por agora só importe o projeto library.
Crie um novo projeto selecionando o Build SDK 4.1 (o Sherlock utiliza Temas e Estilos dessa versão do Android) e o Minimum Required para 2.2. Depois de criado, vá até a pasta lib do projeto e apague o arquivo android-support-v4.jar (o Sherlock já inclui esse arquivo). Agora adicione a referência ao projeto library do Sherlock, para tal, clique com o botão direito no projeto e selecione Properties.
Selecione Android, e na parte inferior direita, clique em Add... e selecione o projeto library e clique em OK. Agora, deixe a Activity do seu projeto conforme abaixo:
import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.actionbarsherlock.app.*; import com.actionbarsherlock.app.ActionBar.*; import com.actionbarsherlock.view.Menu; public class ExemploSherlockActivity extends SherlockFragmentActivity implements TabListener { private Fragmento1 f1; private Fragmento2 f2; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTheme(R.style.Theme_Sherlock_Light); setContentView(R.layout.activity_exemplo_sherlock); f1 = (Fragmento1)getSupportFragmentManager() .findFragmentById(R.id.fragmento1); f2 = (Fragmento2)getSupportFragmentManager() .findFragmentById(R.id.fragmento2); getSupportActionBar().setNavigationMode( ActionBar.NAVIGATION_MODE_TABS); Tab aba1 = getSupportActionBar().newTab() .setText("Aba 1") .setTabListener(this); Tab aba2 = getSupportActionBar().newTab() .setText("Aba 2") .setTabListener(this); getSupportActionBar().addTab(aba1); getSupportActionBar().addTab(aba2); } @Override public boolean onCreateOptionsMenu(Menu menu) { getSupportMenuInflater().inflate( R.menu.activity_exemplo_sherlock, menu); return super.onCreateOptionsMenu(menu); } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { if (tab.getPosition() == 0){ ft.show(f1).hide(f2); } else { ft.show(f2).hide(f1); } } @Override public void onTabUnselected( Tab tab, FragmentTransaction ft) {} @Override public void onTabReselected( Tab tab, FragmentTransaction ft) {} public static class Fragmento1 extends Fragment { @Override public View onCreateView(LayoutInflater infltr, ViewGroup container, Bundle savedState){ TextView txt = new TextView(getActivity()); txt.setText("Fragmento 1"); return txt; } } public static class Fragmento2 extends Fragment { @Override public View onCreateView(LayoutInflater infltr, ViewGroup container, Bundle savedState){ TextView txt = new TextView(getActivity()); txt.setText("Fragmento 2"); return txt; } } }Como estamos trabalhando com Fragment, nossa classe herda de SherlockFragmentActivity. Implementamos a interface TabChangeListener para detectarmos quando houver a alternância entre abas. Declaramos dois fragmentos que serão nas abas, essa classes estão declaradas no final do arquivo, obviamente o ideal é que cada fragmento fique em um arquivo separado.
No onCreate setamos o tema do Sherlock, e em seguida setamos o arquivo de layout da Activity (que está logo abaixo). Depois inicializamos os fragmentos e definimos a forma de navegação da ActionBar para o modo de abas. E por fim, criamos e adicionamos as abas na ActionBar.
Abaixo temos o arquivo de layout da aplicação (res/layout/activity_exemplo_sherlock.xml):
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/FrameLayout1" android:layout_width="match_parent" android:layout_height="match_parent" > <fragment android:id="@+id/fragmento1" android:name="ngvl.android.exemplosherlock.ExemploSherlockActivity$Fragmento1" android:layout_width="match_parent" android:layout_height="match_parent" /> <fragment android:id="@+id/fragmento2" android:name="ngvl.android.exemplosherlock.ExemploSherlockActivity$Fragmento2" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>
Note que o nome da classe é composto do pacote da aplicação + o nome da classe. Como estamos usando uma Inner Class, o sinal de $ é usado. Se você definir os Fragmentos em arquivos separados (o que é o normal) coloque apenas o nome completo da classe.
E abaixo o arquivo de menu da aplicação (res/menu/activity_exemplo_sherlock.xml) ele é carregado no método onCreateOptionsMenu. Para tratar cada opção adicione o método onMenuItemSelected.
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/menu_new" android:showAsAction="always|withText" android:icon="@android:drawable/ic_menu_add" android:title="Novo"/> <item android:id="@+id/menu_edit" android:showAsAction="ifRoom|withText" android:icon="@android:drawable/ic_menu_edit" android:title="Editar"/> <item android:id="@+id/menu_listar" android:showAsAction="ifRoom" android:icon="@android:drawable/ic_menu_my_calendar" android:title="Listar Itens"/> </menu>O primeiro item sempre aparece com ícone e texto. No segundo, o ícone sempre aparece, mas texto só aparece (na barra) se houver espaço. O último só aparecerá se houver espaço, para vê-lo, você deverá pressionar a tecla menu (ou nos dispositivo que não tenham, esse item ficará "colapsed" mas a direita).
Ao mandar executar a aplicação devemos ter uma tela similar a abaixo.
Esse post é em homenagem aos meus alunos da FA7, que me obrigaram a aprender essa biblioteca durante a aula :) Abraço a todos!
Qualquer dúvida, deixem seus comentários.
4br4ç05,
nglauber
Assinar:
Postagens (Atom)