Estou tentando criar uma atividade que apresente alguns dados ao usuário. Os dados são tais que podem ser divididos em 'palavras', cada uma sendo um widget, e a sequência de 'palavras' formaria os dados ('frase'?), O widget ViewGroup contendo as palavras. Como o espaço necessário para todas as 'palavras' em uma 'frase' excederia o espaço horizontal disponível na tela, gostaria de embrulhar essas 'frases' como faria com um pedaço normal de texto.
O seguinte código:
public class WrapTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout l = new LinearLayout(this);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
LinearLayout.LayoutParams mlp = new LinearLayout.LayoutParams(
new ViewGroup.MarginLayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
mlp.setMargins(0, 0, 2, 0);
for (int i = 0; i < 10; i++) {
TextView t = new TextView(this);
t.setText("Hello");
t.setBackgroundColor(Color.RED);
t.setSingleLine(true);
l.addView(t, mlp);
}
setContentView(l, lp);
}
}
produz algo como a imagem da esquerda, mas eu gostaria de um layout apresentando os mesmos widgets da direita.
Existe tal layout ou combinação de layouts e parâmetros, ou eu tenho que implementar meu próprio ViewGroup para isso?
fonte
Fiz meu próprio layout que faz o que quero, mas é bastante limitado no momento. Comentários e sugestões de melhorias são bem-vindos.
A atividade:
Ou em um layout XML:
E o Layout:
Com o resultado:
fonte
Eu implementei algo muito semelhante a isso, mas usando o que eu acho que é uma forma um pouco mais padrão de lidar com espaçamento e preenchimento. Deixe-me saber o que vocês pensam e fiquem à vontade para reutilizar sem atribuição:
Isso também requer uma entrada em /res/values/attrs.xml, que você pode criar se ainda não estiver lá.
O uso em um layout xml é assim:
fonte
O projeto android-flowlayout da ApmeM também suporta quebras de linha.
fonte
Aqui está minha versão simplificada, apenas de código:
fonte
Há um problema com a primeira resposta:
Em um ListView, por exemplo, os itens da lista são passados com heightMeasureSpec de 0 (UNSPECIFIED) e, portanto, aqui, o MeasureSpec de tamanho 0 (AT_MOST) é passado para todos os filhos. Isso significa que todo o PredicateLayout é invisível (altura 0).
Como uma solução rápida, mudei o MeasureSpec da altura do filho assim:
e depois
que parece funcionar para mim, embora não funcione no modo EXATO, o que seria muito mais complicado.
fonte
Minha versão ligeiramente modificada com base no postado aqui anteriormente:
Centraliza todos os itens horizontalmente
fonte
Atualizei este exemplo para corrigir um bug, agora cada linha pode ter uma altura diferente!
fonte
Algumas das diferentes respostas aqui me dariam uma ClassCastException no editor de layout Exclipse. No meu caso, eu queria usar ViewGroup.MarginLayoutParams em vez de fazer o meu próprio. De qualquer maneira, certifique-se de retornar a instância de LayoutParams que sua classe de layout customizada precisa em generateLayoutParams. É assim que o meu se parece, basta substituir MarginLayoutParams por aquele que seu ViewGroup precisa:
Parece que esse método é chamado para atribuir um objeto LayoutParams para cada filho no ViewGroup.
fonte
fonte
Eu adaptei parte da ode acima e implementei um layout de fluxo que centraliza todas as visualizações filho, horizontal e vertical. Ele atende às minhas necessidades.
fonte
experimentar :
fonte
Tente definir ambos os LayoutParams do lp como
WRAP_CONTENT
.Definir MLP ser
WRAP_CONTENT
,WRAP_CONTENT
garante que o seu TextView (s) t são apenas de largura e altura suficiente o suficiente para segurar "Olá" ou qualquer seqüência que você colocar neles. Eu acho que l pode não estar ciente de quão grande a sua t 's são. OsetSingleLine(true)
pode estar contribuindo também.fonte