Download - Mini curso Android
Android 100% Hands-on
GOOGLE ANdroidMario Jorge Pereira
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
Por onde começar?
http://developer.android.com
ADT Bundle*:
• Eclipse + ADT plugin
• Android SDK Tools
• Android Platform-tools
*Pré requisito: JDK instalada
Desenvolvimento
Chega de Bla Bla Bla!
Vamos Começar?
Eclipse + ADT
Olá MundoFi
le >
New
> A
ndro
id A
pplic
atio
n Pr
ojec
t
File
> N
ew >
And
roid
App
licat
ion
Proj
ect
Olá Mundo
File
> N
ew >
And
roid
App
licat
ion
Proj
ect
Olá Mundo
File
> N
ew >
And
roid
App
licat
ion
Proj
ect
Olá Mundo
Olá Mundo
Para rodar precisamos do emulador
Vamos criar?
AVD Android Virtual Device Maneger
Android SDK Maneger
AVD Android Virtual Device Maneger
Inicie o emulador que voce criou?
Isso demora :( …
Depois que abrir não feche o Emulador!!
Run As.. Android application
Importante!
Activity
XML
public class OlaMundo extends Activity {! @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ola_mundo); } }
src/ (código fonte: .java)"
gen/ (código gerado: R.java )"
bin/ (bytecodes: .dex)"
libs/ (bibliotecas)"
res/ (recursos: layouts, strigs, icones …)"
assets/ (outros recursos: arquivos em geral)Es
trutu
ra
<?xml version="1.0" encoding="
utf-8"?>
<resources>! <string nam
e="app_name">Alo Mundo</string
>
<string name="action_setti
ngs">Settings</string>
<string name="hello_world"
>Hello world!</string>
!</resources>
strings.xml
/* AUTO-GENERATED FILE. DO NO
T MODIFY.*/
public final class R {
public static final class
attr {
} public stat
ic final class dimen {
public static final int
activity_horizontal_margin=0x
7f040000;
public static final in
t activity_vertical_margin=0x7
f040001;
} public stati
c final class layout {
public static final in
t activity_main=0x7f030000;
} ...}
R.java
<?xml version="1.0" encoding=“
utf-8"?>
<manifest ...>
... <applicatio
n ... >
<activity
android:name="br.c
om.mariojp.olamundo.OlaMundoAc
tivity"
android:label="@st
ring/app_name" >
<intent-filter>
<action androi
d:name="android.intent.action.
MAIN" />
<category andr
oid:name="android.intent.categ
ory.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
AndroidManifest.xml
Log.[nivel](“TAG”,“MENSAGEM”);
!
Log.v (Verbose)Log.d (Debug)Log.i (Info)Log.w (Warning)Log.e (Erro)Log.wtf (...)
Log
public class OlaMundoActivity extends Activity {! @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i("Ola mundo", "onCreate");! }!}
OlaMundoActivity.java
use o logging: Log.i(“Ciclo de Vida”,”<método>”) nos métodos onCreate, onStart, onResume, onRestart, onPause, onStop e onDestroy.
Entendendo o ciclo de vida
Run As.. Android application
Quais os métodos são chamados quando a aplicação inicia?
O que Aconteceu
Quando clicar em voltar qual método é executado?
Alterando o aplicativo de Retrato para paisagem (control +F11) o que acontece?
Ainda no OlaMundo
O arquivo OlaMundoActivity.java
public class OlaMundo extends Activity {! @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ola_mundo); }!}
Na pasta res/layout
1. Renomear o arquivo fragment_ola_mundo.xml para activity_ola_mundo.xml
!
2. Alterar a propriedade: tools:context=“br.com.mariojp.OlaMundoActivity”
Um pouco de Layout
activity_ola_mundo.xml
<RelativeLayout ... >
... <Button android
:id="@+id/botao"
android:layout_width="
wrap_content"
android:layout_height=
"wrap_content"
android:text="Botao" /
>
...</RelativeLayou
t>
activity_ola_mundo.xml
Run As.. Android application
<LinearLayout xmlns:android="h
ttp://schemas.android.com/apk/
res/android"
xmlns:tools="http://schema
s.android.com/tools"
android:layout_width="matc
h_parent"
android:layout_height="mat
ch_parent"
android:orientation="horiz
ontal"
tools:context="br.com.mariojp.
olamundo.OlaMundoActivity" >
!. . .
!</LinearLayout>
activity_ola_mundo.xml
Run As.. Android application
<LinearLayout xmlns:android="h
ttp://schemas.android.com/apk/
res/android"
xmlns:tools="http://schema
s.android.com/tools"
android:layout_width="matc
h_parent"
android:layout_height="mat
ch_parent"
android:orientation="verti
cal"
tools:context="br.com.mariojp.
olamundo.OlaMundoActivity" >
!. . .
!</LinearLayout>
activity_ola_mundo.xml
Run As.. Android application
<RelativeLayout ... >
... <Button android
:id="@+id/botao"
android:layout_width="
match_parent"
android:layout_height=
"wrap_content"
android:text="Botao" /
>
...</RelativeLayou
t>
activity_ola_mundo.xml
Run As.. Android application
Um pouco de Comportamento
OlaMundoActivity.java
[Tipo] var = ([Tipo]) findViewById(R.id.[id]);
!var.metodo();!
findbyid
<RelativeLayout ... >
... <TextView
android:id="@+id/texto
"
android:layout_width="
wrap_content"
android:layout_height=
"wrap_content"
android:text="@string/
hello_world" />
...</RelativeLayou
t>
activity_ola_mundo.xml
public class OlaMundoActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ola_mundo); TextView texto = (TextView) findViewById(R.id.texto); texto.setText("Outro Texto"); }!}
OlaMundoActivity.java
Run As.. Android application
Botão Aplicação
Listener
Clicou?
Ação do Botão
public class OlaMundoActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ola_mundo);! Button button = (Button) findViewById(R.id.botao); button.setOnClickListener(new Ouvinte()); }}
OlaMundoActivity.java
public class Ouvinte implements OnClickListener {! @Override public void onClick(View clicado) { Log.i("TAG", "Botao Clicado"); }!}
Ouvinte.java
Run As.. Android application
public class OlaMundoActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ola_mundo); Button button = (Button) findViewById(R.id.botao); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.i("TAG", "Botao Clicado"); } }); }}
OlaMundoActivity.java
Run As.. Android application
<RelativeLayout ... >
... <Button
android:id="@+id/botao
"
android:layout_width="
wrap_content"
android:layout_height=
"wrap_content"
android:text="Botao"
android:onClick="metod
o" />
...</RelativeLayou
t>
activity_ola_mundo.xml
public class OlaMundoActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ola_mundo); } public void metodo(View v) { Log.i("TAG", "Botao Clicado"); }
OlaMundoActivity.java
Run As.. Android application
Toast.makeText(this, "TEXTO", Toast.LENGTH_LONG).s
how();
!!Toast.LENGTH_LONG!Toast.LENGTH_SHORT!
TOAST
public class OlaMundoActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ola_mundo); } public void metodo(View v) { Toast.makeText(this, "AloMundo!", Toast.LENGTH_LONG).show();
}!}
OlaMundoActivity.java
Run As.. Android application
Faculdade
File > New > Android Application Project
Crie o projeto Android
File > New > Android Application Project
public class ListaDisciplinas extends Activity {! @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.lista_diciplinas); }}
ListaDisciplinas.java
<?xml version="1.0" encoding="
utf-8"?>
<LinearLayout
xmlns:android="http://schema
s.android.com/apk/res/android"
android:layout_width="match_
parent"
android:layout_height="match
_parent" >
! <ListView
android:id="@+id/lista
_disciplinas"
android:layout_width="
match_parent"
android:layout_height=
"match_parent" >
</ListView>
!</LinearLayout>
lista_disciplinas.xml
public class ListaDisciplinas extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.lista_diciplinas);! String[] disciplinas = {"Redes", "Algoritimos", "Programacao"};
int layout = android.R.layout.simple_list_item_1;! ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,layout, disciplinas);! ListView lista = (ListView) findViewById(R.id.lista_disciplinas);
! lista.setAdapter(adapter);! }}
ListaDisciplinas.java
Run As.. Android application
public class ListaDisciplinas extends Activity {! @Override protected void onCreate(Bundle savedInstanceState) { ...! lista.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> adapter, View view,
int posicao, long id) { Toast.makeText(ListaDisciplinas.this, "Clicou "+posicao,
Toast.LENGTH_SHORT).show(); } }); }}
ListaDisciplinas.java
Run As.. Android application
public class ListaDisciplinas extends Activity {! @Override protected void onCreate(Bundle savedInstanceState) { ... lista.setOnItemLongClickListener(new OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> adapter, View view, int posicao, long id) { Toast.makeText( ListaDisciplinas.this, adapter.getItemAtPosition(posicao).toString(),
Toast.LENGTH_SHORT).show(); return false; } }); }}
ListaDisciplinas.java
Run As.. Android application
O que aconteceu ate aqui?
Repare que o onItemLongClick retorna false => troque por
true.
Run As.. Android application
Vamos criar um formulário
File
> N
ew >
And
roid
XM
L Fi
le
res/layout/disciplina.xml
<?xml version="1.0" encoding="
utf-8"?>
<LinearLayout xmlns:android="h
ttp://schemas.android.com/apk/
res/android"
android:layout_width="matc
h_parent"
android:layout_height="mat
ch_parent"
android:orientation="verti
cal" >
<ImageView
android:layout_width="
wrap_content"
android:layout_height=
"wrap_content"
android:src="@drawable
/ic_launcher" />
<TextView
android:layout_width="
wrap_content"
android:layout_height=
"wrap_content"
android:text="Discipli
na" />
<EditText android:id="@+id
/disciplina"
android:layout_width="
match_parent"
android:layout_height=
"wrap_content"
android:ems="10" >
<requestFocus />
</EditText>
. . .</LinearLayout>
disciplinas.xml
<?xml version="1.0" encoding="
utf-8"?>
<LinearLayout xmlns:android=“h
ttp://schemas.android.com/apk/
res/android"
android:layout_width="matc
h_parent"
android:layout_height="mat
ch_parent"
android:orientation="verti
cal" >
!. . .! <EditText
android:id="@+id/nota2
"
android:layout_width="
match_parent"
android:layout_height=
"wrap_content"
android:ems="10"
android:inputType="num
berSigned" />
<Button android
:id="@+id/botao"
android:layout_width="
wrap_content"
android:layout_height=
"wrap_content"
android:text="Salvar"
/>
!</LinearLayout>
disciplinas.xml
Pode usar o Editor
android.app.Activity
File
> N
ew >
Cla
ss
public class DisciplinaActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.disciplina); }!}
DisciplinaActivity.java
public class ListaDisciplinas extends Activity { . . . public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.lista_disciplinas, menu); return super.onCreateOptionsMenu(menu); }}
ListaDisciplinas.java
<menu xmlns:android="http://sc
hemas.android.com/apk/res/andr
oid"
xmlns:tools="http://schema
s.android.com/tools"
tools:context="br.com.mari
ojp.faculdade.ListaDisciplinas
" >
! <item android
:id="@+id/novo"
android:showAsAction="
always"
android:icon="@android
:drawable/btn_plus"
android:title="Novo"/>
!</menu>
lista_disciplinas.xml
public class ListaDisciplinas extends Activity { . . . public boolean onOptionsItemSelected(MenuItem item) { int itemClicado = item.getItemId(); switch (itemClicado) { case R.id.novo: Intent intent = new Intent(this, Disciplina.class); startActivity(intent); break; default: break; } return super.onOptionsItemSelected(item); }}
ListaDisciplinas.java
Run As.. Android application
<?xml version="1.0" encoding=“
utf-8"?>
<manifest ...>
. . . <applicatio
n ... >
<activity android:name
="br.com.mariojp.faculdade.Dis
ciplina">
</activity>
. . . </applicati
on>
</manifest>
AndroidManifest.xml
Run As.. Android application
public class DisciplinaActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.disciplina); Button button = (Button) findViewById(R.id.botao); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); }
DisciplinaActivity.java
Run As.. Android application
Banco de dados
Vamos pensar um pouco…
DisciplinaDAO
SQLiteOpenHelper
ListaDisciplinas
public class Disciplina { private Long id; private String disciplina; private String professor; private String email; private Double nota1; private Double nota2;// Gerar Get’s e Set's}
Disciplina.java
public class DisciplinaDAO extends SQLiteOpenHelper {! private static final String DATABASE = "BancoDisciplinas"; private static final int VERSAO = 1;! public DisciplinaDAO(Context context) { super(context, DATABASE, null, VERSAO); }!//...!}
DisciplinaDAO.java
public class DisciplinaDAO extends SQLiteOpenHelper {! private static final String DATABASE = "BancoDisciplinas"; private static final int VERSAO = 1;! public DisciplinaDAO(Context context) { super(context, DATABASE, null, VERSAO); }! public void onCreate(SQLiteDatabase db) { String ddl ="CREATE TABLE Disciplinas (id INTEGER PRIMARY KEY,"
+ " disciplina TEXT UNIQUE NOT NULL," + " professor TEXT," + " email TEXT," + " nota1 REAL, nota2 REAL);"; db.execSQL(ddl); }!//...!}
DisciplinaDAO.java
public class DisciplinaDAO extends SQLiteOpenHelper {! private static final String DATABASE = "BancoDisciplinas"; private static final int VERSAO = 1;! public DisciplinaDAO(Context context) { super(context, DATABASE, null, VERSAO); }//...! @Override public void onUpgrade(SQLiteDatabase db, int velha, int nova) {
String ddl ="DROP TABLE IF EXISTS Disciplinas"; db.execSQL(ddl); onCreate(db); }!//...}
DisciplinaDAO.java
public class DisciplinaDAO extends SQLiteOpenHelper {!//...! public void salvar(Disciplina disciplina) { ContentValues values = new ContentValues(); values.put("disciplina", disciplina.getDisciplina()); values.put("professor", disciplina.getProfessor()); values.put("email", disciplina.getEmail()); values.put("nota1", disciplina.getNota1()); values.put("nota2", disciplina.getNota2()); getWritableDatabase().insert("Disciplinas", null, values );
}!//...}
DisciplinaDAO.java
public class DisciplinaActivity extends Activity { private EditText nomeDisciplina; // ...nomeProfessor, email, nota1, nota2;
! protected void onCreate(Bundle savedInstanceState) { nomeDisciplina = (EditText) findViewById(R.id.disciplina);
//... outros findViewById! Button button = (Button) findViewById(R.id.botao); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { Disciplina disciplina = new Disciplina(); disciplina.setDisciplina(nomeDisciplina.getText().toString());
// outros set's DisciplinaDAO dao = new DisciplinaDAO(DisciplinaActivity.this);
dao.salvar(disciplina); dao.close(); finish(); } }); }}
DisciplinaActivity.java
public class ListaDisciplinas extends Activity {!private ListView lista;!protected void onCreate(Bundle savedInstanceState) {//... lista = (ListView) findViewById(R.id.lista_disciplinas);! DisciplinaDAO dao = new DisciplinaDAO(this); ArrayList<Disciplina> disciplinas= dao.getLista(); dao.close();! ArrayAdapter<Disciplina> adapter = new ArrayAdapter<Disciplina>(
this, android.R.layout.simple_list_item_1, disciplinas);
lista.setAdapter(adapter);//... }//...}
ListaDisciplinas.java
Run As.. Android application
public class ListaDisciplinas extends Activity {//...protected void onResume() { super.onResume(); DisciplinaDAO dao = new DisciplinaDAO(this); ArrayList<Disciplina> disciplinas= dao.getLista(); dao.close();! ArrayAdapter<Disciplina> adapter = new ArrayAdapter<Disciplina>(
this, layout,android.R.layout.simple_list_item_1); lista.setAdapter(adapter);}//...}
ListaDisciplinas.java
Run As.. Android application
public class ListaDisciplinas extends Activity {//... @Override protected void onResume() { super.onResume(); carregarLista(); }! private void carregarLista() { DisciplinaDAO dao = new DisciplinaDAO(this); ArrayList<Disciplina> disciplinas= dao.getLista(); dao.close(); int layout = android.R.layout.simple_list_item_1; ArrayAdapter<Disciplina> adapter = new ArrayAdapter<Disciplina>(this, layout, disciplinas); lista.setAdapter(adapter); }//...}
ListaDisciplinas.java
public class DisciplinaDAO extends SQLiteOpenHelper {//...! public void deletar(Disciplina disciplina) { String[] args = { disciplina.getId().toString() }; getWritableDatabase().delete("Disciplinas", "id=?", args); }!//...}
DisciplinaDAO.java
public class ListaDisciplinas extends Activity {!private ListView lista;!protected void onCreate(Bundle savedInstanceState) {//... lista = (ListView) findViewById(R.id.lista_disciplinas); registerForContextMenu(lista);//... }//...}
ListaDisciplinas.java
public class ListaDisciplinas extends Activity {//... @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); menu.add("Enviar E-mail"); MenuItem deletar = menu.add("Deletar"); deletar.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override public boolean onMenuItemClick(MenuItem item) { DisciplinaDAO dao = new DisciplinaDAO(ListaDisciplinas.this);
dao.deletar(disciplina); dao.close(); carregarLista(); return false; } }); }//...}
ListaDisciplinas.java
public class ListaDisciplinas extends Activity {! private ListView lista; private Disciplina disciplina; protected void onCreate(Bundle savedInstanceState) // ... lista.setOnItemLongClickListener(new OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> adapter, View view,int posicao, long id) { disciplina = (Disciplina) adapter.getItemAtPosition(posicao);
return false; } });// ... } // ...}
ListaDisciplinas.java
Run As.. Android application
lista.setOnItemClickListener(new OnItemClickListener() {! public void onItemClick(AdapterView<?> adapter, View view, int posicao, long id) {! Disciplina disciplina = (Disciplina) adapter.getItemAtPosition(posicao);
! Intent intent = new Intent(ListaDisciplinas.this,DisciplinaActivity.class);
! intent.putExtra("disciplinaSelecionada", disciplina);! startActivity(intent);! }});
ListaDisciplinas.java
public class DisciplinaActivity extends Activity { private EditText nomeDisciplina; // ...nomeProfessor, email, nota1, nota2;
protected void onCreate(Bundle savedInstanceState) { Button button = (Button) findViewById(R.id.botao); Intent intent = getIntent(); disciplinaSelecionada = (Disciplina) intent.getSerializableExtra("disciplinaSelecionada"); if(disciplinaSelecionada!=null){ button.setText("Alterar"); nomeDisciplina.setText(disciplinaSelecionada.getDisciplina());
} button.setOnClickListener(new OnClickListener() { public void onClick(View v) { Disciplina disciplina = new Disciplina(); disciplina.setDisciplina(nomeDisciplina.getText().toString());
/. . . DisciplinaDAO dao = new DisciplinaDAO(DisciplinaActivity.this);
if(disciplinaSelecionada == null){ dao.salvar(disciplina); }else{ disciplina.setId(disciplinaSelecionada.getId());
dao.alterar(disciplina); } dao.close(); finish(); } }); }
}
DisciplinaActivity.java
public class DisciplinaDAO extends SQLiteOpenHelper {//... public void alterar(Disciplina disciplina) { ContentValues values = new ContentValues(); values.put("disciplina", disciplina.getDisciplina()); values.put("professor", disciplina.getProfessor()); values.put("email", disciplina.getEmail()); values.put("nota1", disciplina.getNota1()); values.put("nota2", disciplina.getNota2()); getWritableDatabase().update("Disciplinas", values, "id=?", new String[]{disciplina.getId().toString()}); }//...}
DisciplinaDAO.java
Run As.. Android application
public class ListaDisciplinas extends Activity { public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); //. . . MenuItem email = menu.add("Enviar E-mail"); Intent intentEmail = new Intent(Intent.ACTION_SEND); intentEmail.setType("message/rfc822"); intentEmail.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" }); intentEmail.putExtra(Intent.EXTRA_SUBJECT, "ANDROID"); intentEmail.putExtra(Intent.EXTRA_TEXT, "LEGAL!!!"); email.setIntent(intentEmail);//. . . }}
ListaDisciplinas.java
Run As.. Android application
public class DisciplinaActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { foto = (ImageView) findViewById(R.id.foto); foto.setOnClickListener(new OnClickListener() { ! @Override public void onClick(View v) { Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
caminho = Environment.getExternalStorageDirectory().toString()
+"/"+System.currentTimeMillis()+".png"; File arquivo = new File(caminho); Uri localImage = Uri.fromFile(arquivo); camera.putExtra(MediaStore.EXTRA_OUTPUT, localImage);
startActivityForResult(camera, 999); } });}}
DisciplinaActivity.java
public class DisciplinaActivity extends Activity { @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == 999){ if(resultCode == Activity.RESULT_OK){ Bitmap bitmap = BitmapFactory.decodeFile(caminho); Bitmap bitmapReduzido = Bitmap.createScaledBitmap(bitmap, 100, 100, true); foto.setImageBitmap(bitmapReduzido); }else{ caminho =null; } } }}
DisciplinaActivity.java
<?xml version="1.0" encoding=“
utf-8"?>
<manifest ...>
… <uses-permi
ssion android:name="android.pe
rmission.WRITE_EXTERNAL_STORAG
E" />
<uses-permission android:n
ame="android.permission.READ_E
XTERNAL_STORAGE" />
…
</manifest>
AndroidManifest.xml
Run As.. Android application
Esta obra está licenciada sob a licença Creative Commons Atribuição-CompartilhaIgual 3.0 Não Adaptada. Para ver uma cópia desta licença, visite http://creativecommons.org/licenses/by-sa/3.0/.
ANDROIDMario Jorge Pereira
Como me encontrar? http://www.mariojp.com.br twitter.com/@mariojp [email protected]