Você está na página 1de 46

Programação para

Dispositivos Móveis

Conteúdo

• Menus
• NavigationView
• Introdução ao processamento
de Bancos de Dados em
Android

Prof. Alcides/Prof. Ledón


Menus
clássicos
Menus
• Podemos criar os menus por meio de um arquivo XML, no código Java puro ou
utilizando o assistente visual para edição de menus.
• Para criar um menu e editar o arquivo XML clique com o botão direito sobre a pasta
res e solicite um novo arquivo de recurso.
• Na tela do novo recurso, escolha ou digite Menu na opção Resource type, depois
insira o nome do seu arquivo de menu.
• Cada tela de um aplicativo poderá ter seu próprio menu de opções, ou seja, o menu
pode ser específico para cada Activity: defina o nome do arquivo conforme a tela à
qual esse menu pertence.
menu_main.xml
• Podemos editar as opções do menu no arquivo xml criado
<menu 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"
tools:context=".MainActivity">
<item
android:id="@+id/action_settings"
android:title="@string/action_settings"
android:orderInCategory="100"
app:showAsAction="never" />
<item
android:id="@+id/sair"
android:title="@string/sair" Opção de menu
android:orderInCategory="100" mostrada como
app:showAsAction="ifRoom" ícone na Action
android:icon="@drawable/sair4"/>
Obs: orderInCategory (ordem Bar, se houver
<item
de "importância" do item android:id="@+id/sobre" espaço.
dentro do grupo), android:title="@string/sobre"
showAsAction (a forma em android:orderInCategory="100"
que o item será mostrado na app:showAsAction="never" />
Action Bar: never, Always, </menu>
ifRoom etc.).
Edição visual do arquivo do menu

A forma mais simples de editar um menu será utilizando o assistente visual. Selecione com duplo click o
arquivo .xml do menu desejado e selecione a aba Design. Poderá arrastar novos itens para o menu,
editar suas propriedades etc. É importante adicionar atributos id para atender eventos para esses itens.
strings.xml

• Lembre que na pasta values ficarão os textos das opções


dos menu das telas (nos arquivos strings.xml, interessante
também para traduzir os textos dos menu para vários
idiomas). Veja no próximo slide.
<resources>
<string name="app_name">Exemplo1</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
<string name="sair">Sair</string>
<string name="sobre">Sobre</string>
</resources>
Tradução das opções de
um menu para vários
idiomas (Edit translations)
Método para a criação do menu

• Para a criação do menu (quando for aberta uma tela do app), será necessário
adicionar o método a seguir na classe da Activity (este método não é inserido
automaticamente, temos que digitar).
• Observe que onCreateOptionsMenu se comporta como um evento. O
assistente do Android Studio poderia ajudar na criação da estrutura básica
deste método.

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the
// action bar if it is present:
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
Resultado: app com um menu
• Executamos o programa e abrimos o menu da tela:
Criando o menu no Java (via mais difícil: pode pular estes dois slides)

• Primeiro definimos as constantes relacionadas com as opções do menu e sub-


menu (valores inteiros)

public class ActOla extends Activity {

//Opções para o menu:


public static final int SALVAR = 1;
public static final int EXCLUIR = 2;
public static final int SEGUNDA = 3;
public static final int SAIRAPP = 4;

//Opções do sub-menu:
public static final int PESQUISAR = 5;
public static final int LIMPAR = 6;
public static final int SAIR = 7;
public static final int OUTROS = 8;

//Observe as opções nas figuras do slide anterior.


Criando um menu no Java (via mais difícil: pode pular este slide)
@Override
public boolean onCreateOptionsMenu(android.view.Menu menu) {
super.onCreateOptionsMenu(menu);
// Adicionamos quatro opções no menu:
MenuItem item;
• Lógica para criar o menu e item = menu.add(0, SALVAR, 1, "Salvar");
o sub-menu (no método item.setIcon(R.drawable.salvar);
onCreateOptionsMenu) item = menu.add(0, SEGUNDA, 2, "Segunda");
item.setIcon(R.drawable.novo);
item = menu.add(0, EXCLUIR, 3, "Excluir");
item.setIcon(R.drawable.excluir);
item = menu.add(0, SAIRAPP, 4, "Sair");
item.setIcon(R.drawable.sair);
Observe que utilizamos o método // Criamos um sub-menu com três opções:
setIcon para especificar o ícone de SubMenu subMenu = menu.addSubMenu(0, OUTROS, 5, "Outros");
cada opção do menu, por exemplo: subMenu.setIcon(R.drawable.outros);
item = subMenu.add(0, PESQUISAR, 8, "Pesquisar");
item.setIcon(R.drawable.excluir); item.setIcon(R.drawable.pesquisar);
As figuras serão procuradas dentro item = subMenu.add(0, LIMPAR, 10, "Limpar");
do diretório res/drawable do projeto. item.setIcon(R.drawable.limpar);
item = subMenu.add(0, SAIR, 9, "Sair");
item.setIcon(R.drawable.sair);
return true; // o menu foi criado satisfatoriamente
}
Exemplo1 - atendendo eventos do menu

Eventos de menu - como atender este evento?


• Para tratar eventos de menu, deverá ser implementado na classe Activity o método
onOptionsItemSelected.
• Este método se comporta como evento: ele será chamado quando o usuário
selecione uma opção do menu.
• Este método não é inserido automaticamente, temos que digitar. Veja o exemplo as
seguir, de um menu com três opções: configurações, sobre e sair.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();

if (id == R.id.action_settings) {
return true; // opção atendida; não faz nada neste caso
}
if (id == R.id.sobre){ // nesta opção de menu abrimos outra tela do app
Intent i = new Intent(getApplicationContext(),Main2Activity.class);
startActivity(i);
}
if (id == R.id.sair){ // nesta opção de menu terminamos o app
finish();
}
return super.onOptionsItemSelected(item);
}
Comentários (1)
• Em um programa com várias telas, cada uma poderá ter seu próprio menu e
submenus.

• Os métodos onCreateOptionsMenu e onOptionsItemSelected devem estar


dentro da classe derivada de Activity, que define uma tela da aplicação.

• Os métodos onCreateOptionsMenu e onOptionsItemSelected se comportam


como eventos  serão chamados pelo sistema operacional do aparelho no
momento adequado.

• Nos exemplos anteriores mostramos: abrir uma nova janela (startActivity),


apresentar uma mensagem (Toast.makeText ... show), terminar o app, como
respostas à seleção de uma opção de menu.

• O menu será ativado quando for pressionada a opção do menu do dispositivo


Android.
Comentários (2)
• Se um menu for criado no código Java (uma forma mais complexa), poderiam ser
utilizados os métodos da classe Menu:

o public abstract MenuItem add (int groupId, int itemId,


int order, CharSequence title)
o public abstract SubMenu addSubMenu (int groupId, int itemId,
int order, CharSequence title)

• O valor em groupId permite classificar os itens dentro de um grupo. Utilizamos no


exemplo um grupo único 0 (zero).

• Os identificadores dos itens de menu (parâmetro itemId) foram declarados


previamente como constantes e devem ser valores inteiros diferentes.

• O parâmetro order permite decidir a ordem preferida para os itens do menu.

• O texto em title define o texto de cada item do menu.


Exemplo3 - personalizar a ActionBar

Personalizando a Action Bar - em versões anteriores de Android


Em Exemplo3.zip encontrará este outro exemplo:

• Alteramos o formato da "barra de ações" (Action Bar). Observe


no arquivo activity_main.xml a tag que altera as características
desta barra:
<android.support.v7.widget.Toolbar>
android:id="@+id/my_toolbar" ...

• Observe, também, que no método onCreate de


MainActivity.java acrescentamos:

Toolbar myToolbar = (Toolbar) findViewById (R.id.my_toolbar);


setSupportActionBar(myToolbar);

• Neste exemplo, duas opções do menu serão mostradas como


ícones, caso caibam na barra Action Bar.
Exemplo3 - personalizar a ActionBar

Personalizando a Action Bar - em versões anteriores de Android


<LinearLayout 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:orientation="vertical"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".MainActivity">

/*
teste também com:
android:layout_height="50dp"
android:background="@drawable/backgroundegradeazul2"

*/

<android.support.v7.widget.Toolbar
android:id="@+id/my_toolbar"
android:layout_width="match_parent"
android:layout_height="120dp"
android:background="@android:color/holo_blue_light"
android:elevation="4dp"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

...
Exemplo3a - personalizar a ActionBar

Personalizando a Action Bar - em versões atuais de Android


No arquivo .xml da tela:
<android.widget.Toolbar
android:id="@+id/my_toolbar"
android:layout_width="match_parent"
android:layout_height="70dp"
android:background="@drawable/backgroundegradeazul2/>

Obs.: backgroundegradeazul2.png é uma figura na pasta drawable

No arquivo .java da tela:


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//para ocultar a action bar padrão:
getSupportActionBar().hide();
//e agora mostrar a nossa barra:
Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
setActionBar(myToolbar);
}
Exemplo3b - personalizar a ActionBar

No arquivo .xml da tela:

<android.widget.Toolbar
android:id="@+id/my_toolbar" em versões atuais de Android
android:layout_width="match_parent"
android:layout_height="70dp"
android:background="@drawable/barrabackground"
tools:ignore="MissingConstraints" />

O arquivo barrabackground.xml, na pasta drawable:

<?xml version="1.0" encoding="utf-8"?>


<shape
xmlns:android="http://schemas.android.com/apk/res/android">
<gradient android:startColor="#DDFFFFFF"
android:endColor="#66FFDD96"
android:angle="0"/>
No arquivo .java da tela:
<stroke android:width="1dp" @Override
android:color="#F89D31" /> protected void onCreate(Bundle savedInstanceState) {
<padding android:left="10dp" android:top="5dp" super.onCreate(savedInstanceState);
android:right="10dp" android:bottom="5dp" /> setContentView(R.layout.activity_main);
</shape> getSupportActionBar().hide();
Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
setActionBar(myToolbar);
}
Exemplo4 - personalizar a ActionBar

Personalizando a Action Bar - em versões atuais de Android


Sobre AndroidX, veja Visão geral do AndroidX em developer.android.com/jetpack/androidx,
biblioteca de suporte melhorada existente a partir da API 28 - Pie.

• Prepararemos um arquivo actionbarpersonalizada.xml com o visual desejado para


nossa barra (Action Bar). Veja no próximo slide.
• No código .java especificamos (setCustomView) este visual para a ActionBar do app.
Exemplo4 - personalizar a ActionBar

Personalizando a Action Bar - em versões atuais de Android


<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" <ImageView
android:layout_height="36dp" android:layout_width="30dp"
android:background="#00BCD4"> android:layout_height="30dp"
android:layout_margin="2dp"
<LinearLayout android:src="@drawable/f3" />
android:layout_width="match_parent" <TextView
android:layout_height="36dp" android:id="@+id/toolbar_title"
android:gravity="center_horizontal" android:layout_width="wrap_content"
android:orientation="horizontal"> android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="8dp"
android:text="ActionBar personalizada"
android:textColor="#fff"
actionbarpersonalizada.xml android:textSize="19dp"
android:textStyle="bold" />
</LinearLayout>
</androidx.appcompat.widget.Toolbar>
Exemplo4 - personalizar a ActionBar

Personalizando a Action Bar - resultado final do Exemplo4

Utilizamos a personalização em:


actionbarpersonalizada.xml

Definimos uma cor em values/colors.xml com:


<color name="cordabarra">#00BCD4</color>
(veja mais sobre temas a seguir)

E alteramos o tema em values/themes.xml com:


<item name="colorPrimary">@color/cordabarra</item>

Podemos atender evento de click em ícones da barra,


por exemplo, definindo android:onClick="clickEmItemDaBarra"
no ImageView adicionado e atendemos o evento em:
public void clickEmItemDaBarra(View v) {
Toast.makeText(getApplicationContext(),
"Click num ImageView da ActionBar!",
Toast.LENGTH_LONG).show();
}
Temas e estilos

Uma forma geral de personalizar nossos app: temas e estilos

• Na pasta values/themes encontramos estilos, definidos com o nome


name="Theme.MyApplication", relacionados com cores que podemos editar no
arquivo values/colors.xml.
• Observe que no arquivo AndroidManifest.xml temos algo assim:
<application ... android:theme="@style/Theme.MyApplication" ...
NavigationView

Utilizando NavigationView

Na Google I/O 2015 foram


anunciados novos elementos de
interface. Um deles permite mostrar
este novo menu lateral conhecido
como NavigationView.

Em NavigationDrawerActivity1.zip e
Exemplo4NavigationActivity.zip
encontrará dois exemplos completos.
Veja algumas orientações nos
próximos slides.

No segundo exemplo encontrará


também como criar e mostrar um
Toast personalizado.
Utilizando NavigationView

Existe um template pronto, Navigation Drawer Activity, para criar um projeto com este
tipo de objeto para navegação. O exemplo que mostramos nestes primeiros slides se
encontra no arquivo NavigationDrawerActivity1.zip. Veja mais sobre templates em
https://developer.android.com/studio/projects/templates.
Utilizando NavigationView

O botão das três linhas horizontais mostrará as três opções construídas automaticamente.
Utilizando NavigationView

A estrutura gerada, baseada em "fragmentos", é um pouco complexa: dois arquivos Java


para cada "fragmento" e vários arquivos XML em geral. Alterando os arquivos
activity_main_drawer.xml e strings.xml podemos alterar facilmente os textos das opções.
Utilizando NavigationView

Podemos alterar o visual de cada "fragmento" no arquivo XML correspondente.


Observe nas figuras acima que adicionamos um botão em cada visual e definimos seu
atributo id.
Utilizando NavigationView

Podemos continuar alterando o visual de cada "fragmento" e atender os eventos que


consideremos necessários. Na figura acima, por exemplo, atendemos o evento de click no botão
que foi colocado no fragmento relacionado com GalleryFragment.java, que tem um visual descrito
em fragment_gallery.xml.
E se desejamos utilizar o NavigationView, mas
ignorar a estrutura de "fragmentos"?

Veja um exemplo completo em


Exemplo4NavigationActivity.zip
(anterior ao AndroidX, mas funciona)
e também o passo a passo a seguir
Preparando o NavigationView
A classe principal deverá ser alterada, como mostrado a seguir:

public class MainActivity extends AppCompatActivity {


private ActivityMainBinding binding; //este template utiliza o conceito de "view binding"
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
setSupportActionBar(binding.appBarMain.toolbar);
DrawerLayout drawer = binding.drawerLayout;
NavigationView navigationView = binding.navView;
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer,
binding.appBarMain.toolbar, R.string.navigation_drawer_open,
R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
navigationView.setNavigationItemSelectedListener(this::onNavigationItemSelected);

}
Para atender o evento de click de cada opção, adicionemos:
public boolean onNavigationItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.nav_gallery) {
Toast.makeText(getApplicationContext(),
"Opção Gallery atendida", Toast.LENGTH_LONG).show();
} else if (id == R.id.nav_home) {
Toast.makeText(getApplicationContext(),
"Opção Home atendida", Toast.LENGTH_LONG).show();
} else if (id == R.id.nav_slideshow) {
finish();
}
DrawerLayout drawer = findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}

Escreva este código para atender as diferentes opções do menu de navegação. Trata-se do
método public boolean onNavigationItemSelected, que deverá ficar na classe MainActivity,
como mostrado acima. Também, elimine qualquer outro método gerado neste template.
Os import na classe MainActivity agora simplificamos:

import android.os.Bundle;
import android.view.MenuItem;
import android.widget.Toast;
import com.google.android.material.navigation.NavigationView;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.appcompat.app.AppCompatActivity;
import com.example.testenavigationview.databinding.ActivityMainBinding;
Depois, podemos configurar as opções do menu, nos arquivos
menu/activity_main_drawer.xml e layout/nav_header_main.xml
Eliminemos tudo o relacionado com os "fragmentos"
Colocaremos, por exemplo, objetos TextView, botões, campos EditText etc. na tela em
content_main.xml. Também, como já não vamos utilizar fragments, apagaremos do projeto
todos os arquivos relacionados.

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Exemplo de NavigationView"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

E podemos adicionar outros objetos na tela em


content_main.xml.
Eliminamos a tag fragment da tela em content_main.xml
Finalmente, executemos o app
com o NavigationView
funcionando
Processando Bancos de Dados
em Android
Processando Bancos de Dados em Android (1)
• Todos conhecemos a importância da utilização de bancos de dados (ou arquivos, caso
não exista a possibilidade de processamento de BDs), para armazenar dados em
forma permanente.
• O Android fornece um mecanismo para criar BDs dentro da aplicação, acessar e
modificar seus dados.
• O sistema gerenciador banco de dados que o Android suporta é o SQLite
(www.sqlite.org), que é uma biblioteca de bancos de dados baseada em SQL e que
atua como um "pequeno" e "leve" SGBD. Embora seja pequeno se comparado com
outros SGBD, é potente e permite controlar diversos bancos de dados que podem
conter várias tabelas.
• O Android SDK oferece uma biblioteca de classes para manipular BDs de tipo SQLite.
Dentro do pacote android.database.sqlite encontraremos as classes SQLiteDatabase e
SQLiteOpenHelper, que utilizaremos nas descrições deste material.
• Com estas e outras classes podemos abrir e fechar bancos de dados
(getReadableDatabase, getWritableDatabase, close).

http://developer.android.com/intl/pt-br/training/basics/data-storage/databases.html
Processando Bancos de Dados em Android (2)
• Cada aplicação poderá criar um ou mais bancos de dados. Um banco de
dados só poderá ser acessado pela aplicação que o criou (critério de
segurança).
• Os bancos de dados ficam localizados na pasta databases do diretório da
aplicação, o caminho será: /data/data/nome_do_pacote/databases/
• Um banco de dados pode ser criado em duas formas principais:
• A primeira seria utilizando a própria API do Android, que, após a criação
do banco, permite executar comandos SQL para criar tabelas, inserir,
eliminar, alterar e consultar dados.
• A segunda forma seria através de alguma IDE (software separado) do
SQLite. Podemos utilizar estas ferramentas para criar o banco de dados,
mas depois precisamos importar para o projeto o banco que foi criado.
• É recomendada a criação do banco de dados através da própria aplicação.
DB Browser: http://sqlitebrowser.org/
SQLite expert: http://www.sqliteexpert.com/
SQLite Studio: http://sqlitestudio.pl/
Processando Bancos de Dados em Android (3)
• Podemos executar comandos SQL para alteração do Banco de Dados, como INSERT
INTO, DELETE, UPDATE, CREATE TABLE etc., utilizando o método execSQL ou,
preferivelmente, métodos específicos: insert, delete, update, da classe
SQLiteDatabase.

• E, claro, podemos processar os dados do BD em modo leitura com a classe Cursor e


os métodos: query, rawQuery, getCount, moveToFirst, moveToNext,
moveToPrevious, getInt, getLong, getString, getFloat, getDouble, byte[]
getBlob...).

• Podemos manipular transações se for necessário (métodos beginTransaction,


endTransaction, setTransactionSuccessful).

• Android sugere a utilização da classe SQLiteOpenHelper para facilitar o


mecanismo de criação/abertura do Banco de Dado e suas tabelas (e também
gerenciar as versões do BD). Basicamente, criaremos uma classe derivada de
SQLiteOpenHelper, onde especificaremos o nome do BD e a estrutura da/s
tabela/s do BD. Resumindo, a classe SQLiteOpenHelper é uma ajudante (helper)
na criação, abertura e manutenção de versões de BDs.
Tipos de dados suportados pelo SQLite

Os tipos de dados suportados pelo SQLite são:

INTEGER, REAL, TEXT, BLOB, NULL

Mas são permitidos alguns sinônimos (varchar, float, int), por exemplo:

private static final String TABLE_CREATE =


"CREATE TABLE contatos (nome Varchar(80) PRIMARY KEY, "
+ " celular Varchar(15), email Varchar(100), salario float)";
A classe derivada de SQLiteOpenHelper - um exemplo
package com.example.mfpledonaf.hotel; //o mesmo nome de pacote das outras classes de seu app
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class HotelHelper extends SQLiteOpenHelper {


private static final int DATABASE_VERSION = 1;
private static final String TABELA = "tbl_habitacoes"; //nome da tabela
private static final String DATABASE_NAME = "db_hotel"; //nome do BD
private static final String TABLE_CREATE = "create table " + TABELA
+ " (codhabitacao int PRIMARY KEY, qtdepessoas int, precodiaria float);";

HotelHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(TABLE_CREATE);
}

@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
}
}
Para apagar um banco de dados durante o desenvolvimento.
Em versões mais recentes do Android Studio:
Os exemplos desta aula
• Exemplo1. Este aplicativo simples utiliza um menu de opções. Dentre das
opções, uma permite navegar para uma segunda tela.

• Exemplo2. Este aplicativo mostra duas formas de implementar inserir registros


em um banco de dados. Também, mostra os registros (contatos) cadastrados no
BD em forma bem simples: um TextView dentro de um ScrollView. Também
Exemplo2Resolvido.

• Exemplo3, Exemplo3a. Estes exemplos mostram como personalizar a Action Bar


de um aplicativo Android, especificando altura, fontes, cores, backbround etc.
personalizados.

• Exemplo4. Este exemplo mostra uma forma de personalizar a Action Bar com a
biblioteca de suporte mais atual AndroidX.

• Exemplo4NavigationActivity. Este é um exemplo que mostra como utilizar o


NavigationView, um tipo de menu lateral bastante utilizado por apps Android,
mas eliminando a estrutura de fragmentos.
Exercício (será solicitado na próxima aula)

• Complete o exemplo passado em aula (em


Exemplo2.zip) adicionando a lógica necessária
para excluir um contato e alterar o telefone e o
e-mail de um contato a partir do nome (que é a
PK).

• Pode eliminar o botão INSERIR1.

• Resolva o exercício utilizando os métodos


delete e update da classe SQLiteDatabase do
Android.

Em Exemplo2.zip →
Bibliografia sugerida
• ANDROID. Android Developers. Disponível em http://developer.android.com.
• LECHETA, RICARDO R. Google Android, Aprenda a criar aplicações para dispositivos
móveis com o Android SDK. São Paulo: Novatec, 2010.
• MEDNIEKS, Z. et. al. Desenvolvimento de Aplicações Android. São Paulo: Novatec,
2009.
• LEE, Wei-Meng. Introdução ao Desenvolvimento de Aplicativos para o Android. Rio
de Janeiro: Editora Ciência Moderna, 2011.
• https://developer.android.com/guide/topics/ui/menus?hl=pt-br
• https://developer.android.com/training/appbar/setting-up.html
• https://developer.android.com/guide/topics/resources/menu-resource.html
• https://developer.android.com/reference/android/support/design/widget/Navigati
onView
• https://ricardolecheta.com.br/?p=699

Você também pode gostar