domingo, 22 de abril de 2012

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