Botões um ao lado do outro

Meus amigos, preciso montar um layout ocupando a tela toda, parecido com esse modelo:

Button1 Button2 Button3 …
Buttonx …

Gostaria de fazer com que os botões coubessem na tela qtos fossem possível nessa modelo, um ao lado do outro e ao acabar a linha recomeçar embaixo do de cima e assim por diante.

Boa tarde!

Então, olhe com carinho para a construção de uma GridView, acho que pode ajudar bastante!

http://developer.android.com/guide/topics/ui/layout/gridview.html

O site do próprio Android sempre deve ser sua grande aliada! :smiley:

Obrigado pelo retorno. Estou usando o AbsoluteLayout, pode ser esse também?

Cara, sinceramente, NÃO faça isso!

O AbsoluteLayout já está depreciado pelo Android, e isso é péssimo! Utilize recursos mais atuais e avançados para sua programação.
Acredite, implementar GridView não é tão difícil quanto parece…

Como ficaria um layout com os botões usando GridView? Nunca utilizei isso. Poderia postar aqui um exemplo com alguns botões?

Cara, é o exemplo do link que vc passou pra mim, só que com botões. Como faço isso?

Então, olhe para o exemplo do link, o que você necessita mudar é a sua classe BaseAdapter, pois o GridView está sendo preenchido com diversos ImageView’s, e no seu caso deve ser Button’s.

Então, adapte o método getView para te responder como desejar. Exemplo:

[code]public class ButtonAdapter extends BaseAdapter {

// Demais códigos…

public View getView(int position, View convertView, ViewGroup parent) {
Button button;
if (convertView == null) {
button = new Button(context);
// Modifique aqui o Button como desejar, inclusive colocando o seu OnClickListener…
} else {
button = (Button) convertView;
}
return button;
}

}[/code]

Meu amigo, obrigado mesmo, mas poderia ja fazer com pelo menos dois botões para eu ver como é? Nunca usei esse cara, rs. To meio que viajando. Tem como me passar um exemplo com dois botões, ou um só.

Bom, pegue este mesmo código que te passei acrescente o seguinte:

Abaixo da linha:

Lembrando que você pode pegar a mesma estrutura dos demais códigos da classe ImageAdapter que está no link, apenas não precisa da array mThumbIds, que fica em baixo.
E no método getCount, coloque quantos botões você quer ter na GridView. Exemplo:

public int getCount() { return 5; }

Então, no método onCreate da sua Activity, coloque a mesma estrutura do link, apenas mude:

Para:

Isso já deve ajudar…

oK, e como que coloco nome nos botões? Exemplo: Cadastro Cliente, Cadastro N

Crie uma array com todos os nomes de seus botões. Exemplo:

E indique o nome no setText de cada Button, baseado na posição da array, substituindo a linha:

Por esta:

Ok, obrigado, vou mudar de AbsoluteLayout para GridView. Poderia me ajudar numa outra coisa, aproveitando a deixa?

Tenho a seguinte Classe DbAdapter. Poderia dar uma analisada para ver se está correto? Ainda falta algumas tabelas.

package br.me.aqua.banco;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;

public class DbAdapter {
	
	private static final String DATABASE_NAME = "bancoaqua";
	private static final int DATABASE_VERSION = 1;
	
	private static final String DATABASE_TABLE_CLIENTES = "clientes";
	private static final String DATABASE_TABLE_CARROS = "carros";
	private static final String DATABASE_TABLE_TIPO_CARRO = "tipo_carro";
	private static final String DATABASE_TABLE_SERVICOS = "servicos";
	private static final String DATABASE_TABLE_HORARIOS = "horarios";
	private static final String DATABASE_TABLE_OS = "os";
	
//  CAMPOS DA TABELA CLIENTES	
	public static final String KEY_IDCLI = "_id";
	public static final String KEY_NOME = "nome";
	public static final String KEY_ENDERECO = "endereco";
	public static final String KEY_TELEFONE = "telefone";
	public static final String KEY_CELULAR = "celular";
	public static final String KEY_EMAIL = "email";

//  CAMPOS DA TABELA CARROS	
	public static final String KEY_IDCARRO = "_id";
	public static final String KEY_IDCLIENTE_CARRO = "id_cliente";
	public static final String KEY_IDTIPO_CARRO = "id_tipo";
	public static final String KEY_MODELO = "modelo";
	public static final String KEY_PLACA = "placa";

//  CAMPOS DA TABELA TIPO_CARRO	
	public static final String KEY_IDTIP = "_id";
	public static final String KEY_TIPDESC = "tip_desc";
	
//  CAMPOS DA TABELA SERVICOS	
	public static final String KEY_IDSER = "_id";
	public static final String KEY_IDTIPO_SER = "id_tipo";
	public static final String KEY_DESCRICAO_SER = "descricao";
	public static final String KEY_VALOR = "valor";
	
//  CAMPOS DA TABELA HORARIOS	
	public static final String KEY_IDHOR = "_id";
	public static final String KEY_HORARIO = "horario";
	
//  CAMPOS DA TABELA OS	
	public static final String KEY_IDCARRO_OS = "_id";
	public static final String KEY_IDCLIENTE_OS = "id_cliente";
	public static final String KEY_IDSERVICO = "id_servico";
	public static final String KEY_IDHORARIO = "id_horario";
	public static final String KEY_DATA = "data";
	
	
//  CRIA A TABELA CLIENTES
	private static final String DATABASE_CREATE_CLIENTES = "create table " + DATABASE_TABLE_CLIENTES + " ("
	+ KEY_IDCLI + " integer primary key autoincrement, "
	+ KEY_NOME + " text, "
	+ KEY_ENDERECO + " text, "
	+ KEY_TELEFONE + " text, "
	+ KEY_CELULAR + " text, "
	+ KEY_EMAIL + " text);";
	
//  CRIA A TABELA CARROS
	private static final String DATABASE_CREATE_CARROS = "create table " + DATABASE_TABLE_CARROS + " ("
	+ KEY_IDCARRO + " integer primary key autoincrement, "
	+ KEY_IDCLIENTE_CARRO + " integer, "
	+ KEY_IDTIPO_CARRO + " integer, "
	+ KEY_MODELO + " text, "
	+ KEY_PLACA + " text, FOREIGN KEY ( " + KEY_IDCLIENTE_CARRO
	+ " ) REFERENCES " + DATABASE_TABLE_CLIENTES + " (" + KEY_IDCLI
	+ " ) ON DELETE RESTRICT ON UPDATE CASCADE), FOREIGN KEY ( " 
	+ KEY_IDTIPO_CARRO + " ) REFERENCES " + DATABASE_TABLE_TIPO_CARRO + " (" 
	+ KEY_IDTIPO_CARRO + " ) ON DELETE RESTRICT ON UPDATE CASCADE);";

	
//  CRIA A TABELA TIPO_CARRO
	private static final String DATABASE_CREATE_TIPO_CARRO = "create table " + DATABASE_TABLE_TIPO_CARRO + " ("
	+ KEY_IDTIP + " integer primary key autoincrement, "
	+ KEY_TIPDESC + " text;";

//  CRIA A TABELA SERVICOS
	private static final String DATABASE_CREATE_SERVICOS = "create table " + DATABASE_TABLE_SERVICOS + " ("
	+ KEY_IDSER + " integer primary key autoincrement, "
	+ KEY_IDTIPO_SER + " integer, "
	+ KEY_DESCRICAO_SER + " text, "
	+ KEY_VALOR + " text, FOREIGN KEY ( " + KEY_IDTIPO_SER
	+ " ) REFERENCES " + DATABASE_TABLE_TIPO_CARRO + " (" + KEY_IDTIPO_SER
	+ " ) ON DELETE RESTRICT ON UPDATE CASCADE);";
	
//  CRIA A TABELA HORARIOS
	private static final String DATABASE_CREATE_HORARIOS = "create table " + DATABASE_TABLE_HORARIOS + " ("
	+ KEY_IDHOR + " integer primary key autoincrement, "
	+ KEY_HORARIO + " text);";

//  CRIA A TABELA OS
	private static final String DATABASE_CREATE_OS = "create table " + DATABASE_TABLE_OS + " ("
	+ KEY_IDCARRO_OS + " integer primary key autoincrement, "
	+ KEY_IDCLIENTE_OS + " integer, "
	+ KEY_MODELO + " text, "
	+ KEY_PLACA + " text, FOREIGN KEY ( " + KEY_IDCLIENTE_OS
	+ " ) REFERENCES " + DATABASE_TABLE_CLIENTES + " (" + KEY_IDCLI
	+ " ) ON DELETE RESTRICT ON UPDATE CASCADE), FOREIGN KEY ( " 
	+ KEY_IDSERVICO + " ) REFERENCES " 
	+ DATABASE_TABLE_SERVICOS + " (" + KEY_IDSERVICO
	+ " ) ON DELETE RESTRICT ON UPDATE CASCADE), FOREIGN KEY ( " 
	+ KEY_IDHORARIO + " ) REFERENCES " + DATABASE_TABLE_HORARIOS + " (" 
	+ KEY_IDHORARIO + " ) ON DELETE RESTRICT ON UPDATE CASCADE);";
	
	
	private final Context mCtx;
	
	private DatabaseHelper mDbHelper;
	private SQLiteDatabase mDb;
	
	public DbAdapter(Context ctx){
		this.mCtx = ctx;
	}
	
	public DbAdapter open() throws SQLiteException{
		if(isClosed()){
			mDbHelper = new DatabaseHelper(mCtx);
			mDb = mDbHelper.getWritableDatabase();
		}
		return this;
	}
	
	public void close(){
		mDbHelper.close();
	}
	
	public boolean isClosed(){
		return mDb == null || !mDb.isOpen();
	}
	
// TABELA CLIENTES
	
//  GRAVAR CLIENTE
	public long gravarCliente(String nome, String endereco, String telefone, String celular, String email){
		ContentValues valores = new ContentValues();
		valores.put(KEY_NOME, nome);
		valores.put(KEY_ENDERECO, endereco);
		valores.put(KEY_TELEFONE, telefone);
		valores.put(KEY_CELULAR, celular);
		valores.put(KEY_EMAIL, email);
		return mDb.insert(DATABASE_TABLE_CLIENTES, null, valores);
	}

//  ALTERAR CLIENTE
	public boolean atualizarCliente(long Id, String nome, String endereco, String telefone, String celular, String email){
		ContentValues valores = new ContentValues();
		valores.put(KEY_NOME, nome);
		valores.put(KEY_ENDERECO, endereco);
		valores.put(KEY_TELEFONE, telefone);
		valores.put(KEY_CELULAR, celular);
		valores.put(KEY_EMAIL, email);
		return mDb.update(DATABASE_TABLE_CLIENTES, valores, KEY_IDCLI + "=" + Id, null) > 0;
	}

//  APAGAR CLIENTE
	public boolean apagarCliente(long Id){
		int qt = mDb.delete(DATABASE_TABLE_CLIENTES, KEY_IDCLI + "=" + Id, null);
		return qt > 0;
	}

// TABELA TIPO CARRO
	
//  GRAVAR TIPO CARRO
	public long gravarTipoCarro(String tipo){
		ContentValues valores = new ContentValues();
		valores.put(KEY_TIPDESC, tipo);
		return mDb.insert(DATABASE_TABLE_TIPO_CARRO, null, valores);
	}

//  ALTERAR TIPO CARRO
	public boolean atualizarTipoCarro(long Id, String tipo){
		ContentValues valores = new ContentValues();
		valores.put(KEY_TIPDESC, tipo);
		return mDb.update(DATABASE_TABLE_TIPO_CARRO, valores, KEY_IDTIP + "=" + Id, null) > 0;
	}

//  APAGAR TIPO CARRO
	public boolean apagarTipoCarro(long Id){
		int qt = mDb.delete(DATABASE_TABLE_TIPO_CARRO, KEY_IDTIP + "=" + Id, null);
		return qt > 0;
	}
	
	
// TABELA CARROS
	
// GRAVAR CARRO
	public long gravarCarroCliente(String modelo, String placa, String idcliente, String idtipo){
		ContentValues valores = new ContentValues();
		valores.put(KEY_IDCLIENTE_CARRO, Integer.valueOf(idcliente.trim()));
		valores.put(KEY_IDTIPO_CARRO, Integer.valueOf(idtipo.trim()));
		valores.put(KEY_MODELO, modelo);
		valores.put(KEY_PLACA, placa);
		return mDb.insert(DATABASE_TABLE_CARROS, null, valores);
	}

//  ALTERAR CARRO
	public boolean atualizarCarro(long Id, String modelo, String placa, String idcliente, String idtipo){
		ContentValues valores = new ContentValues();
		valores.put(KEY_IDCLIENTE_CARRO, Integer.valueOf(idcliente.trim()));
		valores.put(KEY_IDTIPO_CARRO, Integer.valueOf(idtipo.trim()));
		valores.put(KEY_MODELO, modelo);
		valores.put(KEY_PLACA, placa);
		return mDb.update(DATABASE_TABLE_CARROS, valores, KEY_IDCLI + "=" + Id, null) > 0;
	}

//  APAGAR CARRO
	public boolean apagarCarro(long Id){
		int qt = mDb.delete(DATABASE_TABLE_CARROS, KEY_IDCLI + "=" + Id, null);
		return qt > 0;
	}

// CONSULTAS	
	
//  TODOS OS CLIENTES	
	public Cursor getTodosClientes(){
		return mDb.query(DATABASE_TABLE_CLIENTES, null, null, null, null, null, null);
	}
	
// CLIENTE POR ID	
	public Cursor getCliente(long Id){
		return mDb.query(DATABASE_TABLE_CLIENTES, null, KEY_IDCLI + "=" + Id, null, null, null, null);
	}
	
// CLIENTE POR NOME	
	public Cursor getClientePorNome(String nomeString){
		String[] selectionArgs = {nomeString + "%"};  
//		return mDb.query(DATABASE_TABLE_CLIENTES, null, KEY_NOME + "=" + selectionArgs, null, null, null, null);
		return mDb.rawQuery("SELECT * FROM clientes WHERE nome like ?", selectionArgs);
	}


//  CARRO POR PLACA
	public Cursor getCarro(String modeloString){
//		return mDb.query(DATABASE_TABLE_CARROS, null, KEY_NOME + "=" + nomeString, null, null, null, null);
		String[] selectionArgs = {modeloString + "%"};  
		return mDb.rawQuery("SELECT * FROM carros WHERE placa like ?", selectionArgs);
	}

	
//  CARRO X CLIENTE POR PLACA
	public Cursor getCarroPorPlaca(String placaString){
		String[] selectionArgs = {placaString};  
//		return mDb.rawQuery("SELECT ca.placa, ca.modelo, c.nome FROM clientes c INNER JOIN carros ca ON c._id = ca.id_cliente",null);
		return mDb.rawQuery("SELECT ca.placa, ca.modelo, c._id, c.nome FROM clientes c INNER JOIN carros ca ON c._id = ca.id_cliente WHERE ca.placa = ?", selectionArgs);
	}

//  CARRO X CLIENTE POR NOME CLIENTE
	public Cursor getCarroPorCliente(String nomeString){
		String[] selectionArgs = {nomeString + "%"};  
		return mDb.rawQuery("SELECT ca.placa, ca.modelo, c._id, c.nome FROM clientes c INNER JOIN carros ca ON c._id = ca.id_cliente WHERE c.nome like ?", selectionArgs);
	}

// CARRO X CLIENTE TODOS
	public Cursor getCarrosCliente(){
		return mDb.rawQuery("SELECT ca.placa, ca.modelo, c._id, c.nome FROM clientes c INNER JOIN carros ca ON c._id = ca.id_cliente", null);
	}
	
	
	private class DatabaseHelper extends SQLiteOpenHelper{

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

		@Override
		public void onCreate(SQLiteDatabase db) {
			db.execSQL(DATABASE_CREATE_CLIENTES);
			db.execSQL(DATABASE_CREATE_CARROS);
			db.execSQL(DATABASE_CREATE_TIPO_CARRO);
			db.execSQL(DATABASE_CREATE_SERVICOS);
			db.execSQL(DATABASE_CREATE_HORARIOS);
			db.execSQL(DATABASE_CREATE_OS);
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		}
		
	}
	
}

Confesso que não sou muito “chegado” em criar tabelas via código, prefiro utilizar o SQLite Expert Personal, acho que fica mais simples, pois ele cria o arquivo .db para mim e eu apenas abro através de um SQLiteOpenHelper.
Mas sua classe está certa sim, não sei se em questão de padrões de código é agradável o uso de muitas constantes (private static final), mas para mim está certo sim!

Como vc faz? Estou acostumado a fazer assim. Tem skype? O meu é frederico.brigatte@itelefonica.com.br

Opa, irei te adicionar assim que possível…

Lembre-se que se suas dúvidas foram esclarecidas, coloque [RESOLVIDO] para o tópico, ok?

Até mais!

Ok, obrigado. Assim fica mais fácil de conversar. Como que vc faz no sqlite?

No caso do main.xml, usando o GridView e esse exemplo não precisa dele?

Precisa sim do GridView, ele que implementará a lógica do BaseAdapter para dinamizar os componentes da forma que você precisa… :slight_smile:

Cara, brigadão por estar online, eu to fazendo assim:

Classe Principal

package br.me.gridview;

import android.app.Activity;
import android.os.Bundle;

public class GridViewActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

ImageAdapter

package br.me.gridview;

import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

public class ImageAdapter extends BaseAdapter {

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public Object getItem(int arg0) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		return null;
	}

}

main.xml

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    android:orientation="vertical" >  
  
    <TextView  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:text="@string/hello" />  
  
</LinearLayout>