Eu quero ter uma grade 2x2 com botões dentro. Este é apenas o ICS, então estou tentando usar o novo GridLayout fornecido.
Aqui está o XML do meu layout:
<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/favorites_grid"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00ff00"
android:rowCount="2"
android:columnCount="2">
<Button
android:text="Cell 0"
android:layout_row="0"
android:layout_column="0"
android:textSize="14dip" />
<Button
android:text="Cell 1"
android:layout_row="0"
android:layout_column="1"
android:textSize="14dip" />
<Button
android:text="Cell 2"
android:layout_row="1"
android:layout_column="0"
android:textSize="14dip" />
<Button
android:text="Cell 3"
android:layout_row="1"
android:layout_column="1"
android:textSize="14dip" />
</GridLayout>
O problema é que minhas visualizações não se estendem uniformemente para cada linha. Isso causa muito espaço extra à direita do meu GridLayout.
Tentei definir, layout_gravity="fill_horizontal"
mas isso só se aplica à última exibição na linha. Isso significa que a célula 1 se estende por todo o caminho para fornecer espaço suficiente para a célula 0.
Pensamentos sobre como lidar com isso?
Respostas:
ATUALIZAÇÃO : Os pesos são suportados na API 21. Consulte a resposta de PaulT para obter mais detalhes. ATUALIZAÇÃO FINAL Existem limitações ao usar o GridLayout, a seguinte citação é retirada da documentação .
Aqui está um pequeno exemplo que usa as subviews LinearLayout. (Usei as Vistas espaciais que ocupam áreas não utilizadas e pressionam os botões na posição desejada.)
fonte
A partir da API 21, a noção de peso foi adicionada ao GridLayout. Para oferecer suporte a dispositivos Android mais antigos, você pode usar o GridLayout da biblioteca de suporte da v7.
O XML a seguir fornece um exemplo de como você pode usar pesos para preencher a largura da tela.
fonte
FrameLayout
que continha umButton and an
ImageView` (para ter um ícone sobreposto em um botão que mostrava feedback visual quando tocado ... história longa) como parte de um teclado. DefinircolumnWeight
egravity
em todos os outrosButton
funcionou bem, mas quebrou noFrameLayout
. Deixando para fora apenas para oFrameLayout
feito, tudo fica uniformemente conforme o esperado.O Appcompat21 GridLayout possui os pesos das colunas e linhas que podem ser usados como abaixo para criar uniformemente cada item da grade no layout da grade, como na imagem acima.
fonte
compile "com.android.support:gridlayout-v7:$supportVersion"
app:columnCount="2"
):xmlns:app="http://schemas.android.com/apk/lib/android.support.v7.widget.GridLayout"
Iniciando na API 21 sem a biblioteca de suporte v7 com o ScrollView:
XML:
fonte
Você pode definir a largura de cada filho dinamicamente:
fonte
useDefaultMargins="true"
- funciona perfeitamente com eles configurados parafalse
Tente adicionar o seguinte à sua especificação GridLayout. Isso deve funcionar.
fonte
Esta é a resposta certa
fonte
Finalmente encontrei a solução. Como Rotemmiz disse, você deve fazer isso dinamicamente depois. Esse código estende os botões para preencher a visualização horizontalmente, mas o mesmo pode ser feito verticalmente.
(O 20 é para preenchimento interno e externo e margens. Isso pode ser feito de maneira mais universal, mas é muito mais limpo)
Então pode ser chamado assim:
Isso deve ser feito com um observador, pois precisamos esperar que a vista seja desenhada antes de chamá-los.
fonte
No meu caso, estava adicionando os botões dinamicamente para que minha solução exigisse alguma parte XML e outra parte Java. Eu tive que encontrar e misturar soluções de alguns lugares diferentes e pensei em compartilhá-lo aqui para que outras pessoas que procurem a solução semelhante possam achar útil.
Primeira parte do meu arquivo de layout XML ...
grid:useDefaultMargins="true"
não é necessário, mas acrescentei porque isso me pareceu melhor, você pode aplicar outros efeitos visuais (por exemplo, preenchimento), conforme mencionado em algumas respostas aqui. Agora, para os botões, eu tenho que adicioná-los dinamicamente. Aqui está a parte Java do meu código para criar esses botões, incluindo apenas as linhas relacionadas a esse contexto. Suponha que eu precise criar botões a partir de quantosmyOptions
estão disponíveis para o meu código e não estou copiando o código OnClickListener também.Como estamos usando o GridLayout da biblioteca de suporte e não o GridLayout padrão, precisamos informar a nota sobre isso no
YourProject.grade
arquivo.fonte
Você pode agilizar esse processo substituindo o método ViewGroup onLayout. Esta é a minha solução universal:
EDIT: Não esqueça match_parent para crianças!
fonte
getChildAt(i).layout(viewWidth * columnIndex + margin, viewHeight * rowIndex + margin, viewWidth * columnIndex + viewWidth - margin, viewHeight * rowIndex + viewHeight - margin);
A melhor solução que encontrei é usar um layout linear (horizontal) para cada linha desejada e, dentro dele, atribuir a largura do botão (célula) a 0dp e o peso a 1. Para cada um dos layouts lineares (linhas), atribua a altura para 0dp e o peso para 1. Encontre o código abaixo - também android: layout_gravity = "center_vertical" é usado para alinhar os botões em uma linha, caso eles contenham texto de comprimento variável. O uso de 0dp e o peso é um truque bem legal, mas não tão conhecido.
fonte
Olha Você aqui :
fonte
Eu queria ter uma tabela centralizada com os rótulos alinhados à direita e os valores deixados alinhados. O espaço extra deve estar ao redor da mesa. Depois de muito experimentar e não seguir o que a documentação dizia que eu deveria fazer, criei algo que funciona. Aqui está o que eu fiz:
Isso parece funcionar, mas o GridLayout mostra a mensagem:
"Este layout GridLayout ou seu pai LinearLayout é inútil"
Não sei por que é "inútil" quando funciona para mim.
Não sei por que isso funciona ou se é uma boa ideia, mas se você tentar e puder fornecer uma idéia melhor, uma pequena melhoria ou explicar por que ele funciona (ou não funcionará), eu apreciaria o feedback.
Obrigado.
fonte
Esta é uma pergunta bastante antiga, mas obviamente de interesse para muitas pessoas. Para um layout simples de 4 botões como este, parece que um TableLayout é a maneira mais fácil de obter o resultado desejado.
Aqui está um código de exemplo mostrando as 2 primeiras linhas de uma tabela com 6 colunas que abrangem a largura de seu pai. O LinearLayout e o ImageView em cada célula são usados para permitir a "ativação e desativação" de uma imagem dentro da célula, mantendo a cor da célula.
fonte
Pergunta antiga, mas queria adicionar minha solução. Criei um "layout de grade linear" que simula uma grade, mas usando layouts lineares aninhados. Isso permite que ele se estique para preencher o espaço.
fonte
Eu desejo que isso ajude alguém
Resultado
Código:
fonte
Resultado:
Tente algo como isto:
Se você deseja largura e altura específicas para suas células, use:
fonte
Este é o código para um aplicativo mais padrão sem os botões, isso é muito útil para mim
fonte
Eu tenho o mesmo problema e acho que apenas definir largura e altura programaticamente:
definir largura dos botões com metrics.widthPixels / 2 metrics é objeto de DisplayMetrics.
fonte
você pode encontrar todos os tutoriais aqui, Layout da grade do Android com CardView e OnItemClickListener
fonte
Aqui está o que eu fiz e fico feliz em dizer que isso funcionou para mim. Eu também queria uma grade de itens 2x2, 3x3 etc. para cobrir a tela inteira. Os layouts de grade não aderem à largura da tela. O tipo de trabalho LinearLayouts, mas você não pode usar pesos aninhados.
A melhor opção para mim foi usar Fragments . Usei este tutorial para começar o que queria fazer.
Aqui está um código:
Atividade principal:
activity_main_6 XML (infla 3 fragmentos)
Layout do fragmento base
A Classe de Fragmento (somente lida com a inicialização de uma exibição personalizada) infla 2 blocos por fragmento
}
É isso aí!
Esse é um trabalho estranho para usar pesos aninhados, essencialmente. Isso me dá uma grade 2x3 perfeita que preenche toda a tela do meu tablet de 10 polegadas e do DNA do meu droid HTC. Deixe-me saber como isso vai para você!
fonte