Programar para Android - 05
Try03 - Layout com código Java.
Vamos agora tentar o mesmo layout, mas usando apenas Java.
Vamos criar o projeto Try03, e abrimos o Try03Activity.java, main.xml e strings.xml.
Primeiro vamos analisar o conteúdo.
package pt.omeusite.try03;
import android.app.Activity;
import android.os.Bundle;
public class Try03Activity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
A identificação do package e os imports são o normal do Java.
Apenas está definida a classe Try03Activity que extends a classe Activity. Dentro da nossa classe apenas temos um método onCreate(), que faz o override do onCreate() da classe Activity. O método onCreate() é chamado cada vez que uma atividade é criada, por isso é o local ideal para colocar o código que constrói a atividade (é como se fosse o construtor do objeto). A primeira ação é chamar o onCreate() da classe pai, passando-lhe o Bundle savedInstanceState. Deixemos a explicação do que é este Bundle para mais tarde. Fiquemos só com a noção que precisa estar lá.
A única outra instrução é um enigmático setContentView(R.layout.main), O setContentView() define qual é a view desta atividade (uma View, recordemos é um widget ou um layout), ou seja define o que vai aparecer no écrã. Neste caso passamos-lhe o argumento R.layout.main. O objeto R refere-se à diretoria res, o layout.main é uma referência ao ficheiro main.xml na diretoria layout. Ou seja, vai ler o nosso velho amigo main.xml! Por isso é que quando editamos o main.xml as alterações aparecem no écrã!
Percebido isto, vamos começar a apagar coisas:
- no Try03Activity.java apagamos exatamente a linha setContentView(R.layout.main);
- no main.xml apagamos a TextView;
- no strings.xml apagamos a string hello.
Ficamos com uma aplicação que nada faz (semelhante ao que fizemos em Try00, mas agora há mais algum código no ficheiro .java).
A partir de agora não mexemos mais nos ficheiros XML.
O ficheiro .java fica assim:
package pt.omeusite.try03;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;
public class Try03Activity extends Activity {
// estas views vão ser necessárias
LinearLayout vLayout, hLayout;
TextView tvTitle, tvName;
EditText etEdit;
Button btOk;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* estes layouts cumprem a mesma função do:
* android:layout_width="..."
* android:layout_height="..."
*/
LinearLayout.LayoutParams lpFF = new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT);
LinearLayout.LayoutParams lpFW = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
// esta layout acrescenta o valor 1.0f, que é o peso relativo da view
LinearLayout.LayoutParams lpWW = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT, 1.0f);
// criamos o layout vertical que será o topo da view
vLayout = new LinearLayout(this);
// definimos orientação como vertical
vLayout.setOrientation(LinearLayout.VERTICAL);
// definimos os parametros de layout como FILL_PARENT, FILL_PARENT
vLayout.setLayoutParams(lpFF);
// criamos uma nova TextView
tvTitle = new TextView(this);
// definimos o texto
tvTitle.setText("Try03Activity");
// definimos os parâmetros de layout
tvTitle.setLayoutParams(lpFW);
// adicionamos esta View ao layout vertical
vLayout.addView(tvTitle);
// criamos um novo layout
hLayout = new LinearLayout(this);
// definimos layout horizontal
hLayout.setOrientation(LinearLayout.HORIZONTAL);
// definimos os parâmetros
hLayout.setLayoutParams(lpFW);
// criamos uma nova TextView
tvName = new TextView(this);
// definimos o texto
tvName.setText("Nome");
// definimos os parâmetros
tvName.setLayoutParams(lpWW);
// adicionamos a View ao layout horizontal
hLayout.addView(tvName);
// criamos uma nos caixa de texto
etEdit = new EditText(this);
// definimos tamanho como 10 ems
etEdit.setEms(10);
// definimos layout
etEdit.setLayoutParams(lpWW);
// adicionamos ao layout horizontal
hLayout.addView(etEdit);
// adicionamos o layout horizontal ao vertical
vLayout.addView(hLayout);
// criamos um botão
btOk = new Button(this);
// definimos o texto
btOk.setText("Ok");
// definimos os parâmetros
btOk.setLayoutParams(lpFW);
// adicionamos o botão ao layout vertical
vLayout.addView(btOk);
// definimos a vista ativa como sendo o layout vertical que acabámos de definir
// e o layout é mostrado no écrã
setContentView(vLayout);
}
}
Acho que não há melhor motivação para usar o editor gráfico ou o XML.
O programa continua a não fazer absolutamente nada, mas foi preciso escrever uma quantidade considerável de código para isso. Mesmo com as ajudas do Eclipse (Ctrl+Shift+O para adicionar os imports automaticamente e Ctrl+Space para ajudar na conclusão das palavras) não é um exercício trivial.
Por isso normalmente as interfaces gráficas não são criadas usando código. Há alturas em que é inevitável, como por exemplo preencher uma lista pendente (Spinner, na nomenclatura Android) com dados retirados de uma base de dados.
Apesar de funcionar, o programa tem um erro conceptual: as strings estão hardcoded na atividade, o que já tínhamos dito que não se deve fazer. Para usar os id das strings é preciso primeiro criá-las no ficheiro strings.xml (ou noutro ficheiro XML, não é obrigatório ser no strings.xml).
Afinal sempre temos de editar o XML. Criamos então as seguintes strings no strings.xml, usando o editor ou diretamente no XML:
<string name="tvTitle">Try02Activity</string>
<string name="tvName">Nome</string>
<string name="btOk">Ok</string>
Notar que para identificador de cada string foi usado o mesmo nome que para o objeto no código Java. Isto NÃO é obrigatório, mas ajuda a manter a sanidade do programador.
Agora precisamos alterar as linhas do código que se referem às strings:
(...)
tvTitle.setText(getString(R.String.tvTitle));
(...)
tvName.setText(getString(R.string.tvName));
(...)
btOk.setText(getString(R.string.btOk));
(...)
E pronto, um programa que não faz nada, mas arrumadinho.
Sem comentários:
Enviar um comentário