No presente , este e este segmento Tentei encontrar uma resposta sobre como definir as margens em um único ponto de vista. No entanto, eu queria saber se não há uma maneira mais fácil. Vou explicar por que preferiria não usar essa abordagem:
Eu tenho um botão personalizado que estende o botão. Se o plano de fundo estiver definido como algo diferente do plano de fundo padrão (chamando um setBackgroundResource(int id)
ou setBackgroundDrawable(Drawable d)
), desejo que as margens sejam 0. Se eu chamar isso:
public void setBackgroundToDefault() {
backgroundIsDefault = true;
super.setBackgroundResource(android.R.drawable.btn_default);
// Set margins somehow
}
Quero que as margens sejam redefinidas para -3dp (já li aqui como converter de pixels em dp, assim que souber definir margens em px, também posso gerenciar a conversão). Mas como isso é chamado na CustomButton
classe, o pai pode variar de LinearLayout para TableLayout, e eu prefiro que ele não consiga o pai e verifique a instância desse pai. Isso também será bastante inoperante, imagino.
Além disso, ao chamar (usando LayoutParams) parentLayout.addView(myCustomButton, newParams)
, não sei se isso é adicionado à posição correta (ainda não tentei), digamos o botão do meio de uma linha de cinco.
Pergunta: Existe alguma maneira mais fácil de definir a margem de um único botão programaticamente além de usar LayoutParams?
EDIT: Eu sei da maneira LayoutParams, mas gostaria de uma solução que evite manipular cada tipo de contêiner diferente:
ViewGroup.LayoutParams p = this.getLayoutParams();
if (p instanceof LinearLayout.LayoutParams) {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
else if (p instanceof RelativeLayout.LayoutParams) {
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
else if (p instanceof TableRow.LayoutParams) {
TableRow.LayoutParams lp = (TableRow.LayoutParams)p;
if (_default) lp.setMargins(mc.oml, mc.omt, mc.omr, mc.omb);
else lp.setMargins(mc.ml, mc.mt, mc.mr, mc.mb);
this.setLayoutParams(lp);
}
}
Porque this.getLayoutParams();
retorna um ViewGroup.LayoutParams
, que não têm os atributos topMargin
, bottomMargin
, leftMargin
, rightMargin
. A instância mc que você vê é apenas uma MarginContainer
que contém margens de deslocamento (-3dp) e (oml, omr, omt, omb) e as margens originais (ml, mr, mt, mb).
LayoutParams - NÃO FUNCIONA! ! !
Precisa usar o tipo de: MarginLayoutParams
Exemplo de código para MarginLayoutParams:
http://www.codota.com/android/classes/android.view.ViewGroup.MarginLayoutParams
fonte
Button
visualização:ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) button.getLayoutParams()
retornosnull
Melhor maneira de sempre:
Como chamar o método:
Espero que isso ajude você.
fonte
Então
Ou
fonte
Aqui está a resposta do multifuncional com atualizações recentes:
Etapa 1, para atualizar a margem
A idéia básica é obter margem e atualizá-la. A atualização será aplicada automaticamente e você não precisará restaurá-la. Para obter os parâmetros de layout, basta chamar este método:
O
LayoutParams
vem do layout da sua visualização. Se a visualização for de um layout linear, você precisará importarLinearLayout.LayoutParams
. Se você usar o layout relativo, importarLinearLayout.LayoutParams
, etc.Agora, se você definir a margem usando
Layout_marginLeft
,Right
, etc, você precisa margem de atualização desta formaSe você definir margem usando o novo
layout_marginStart
, precisará atualizar a margem dessa maneiraEtapa 2, para atualizar a margem no dp
Todas as duas maneiras de atualizar a margem acima estão atualizando em pixels. Você precisa fazer uma tradução de dp em pixels.
Agora coloque o valor calculado nas funções de atualização de margem acima e você deve estar pronto
fonte
layout_margin é uma restrição que um filho de exibição informa ao pai. No entanto, é papel dos pais escolher se deseja permitir margem ou não. Basicamente, definindo android: layout_margin = "10dp", o filho está pedindo ao grupo de visualizações pai que aloque espaço 10dp maior que o tamanho real. (padding = "10dp", por outro lado, significa que a visualização filho tornará seu próprio conteúdo 10dp menor .)
Conseqüentemente, nem todos os ViewGroups respeitam a margem . O exemplo mais notório seria listview, onde as margens dos itens são ignoradas. Antes de ligar
setMargin()
para um LayoutParam, você deve sempre garantir que a visualização atual esteja em um ViewGroup que suporte margem (por exemplo, LinearLayouot ou RelativeLayout) e converter o resultadogetLayoutParams()
nos LayoutParams específicos que você deseja. (ViewGroup.LayoutParams
nem sequer temsetMargins()
método!)A função abaixo deve fazer o truque. No entanto, certifique-se de substituir RelativeLayout pelo tipo de exibição pai.
fonte
Este método permite definir a margem no DP
ATUALIZAR
Você pode alterar o parâmetro que se adapte às suas necessidades.
fonte
No Kotlin, será assim:
fonte
Quando você está em uma Visualização personalizada, pode usar
getDimensionPixelSize(R.dimen.dimen_value)
, no meu caso, adicionei a margem no LayoutParams criado eminit
métodoNa cidade Kotlin
em Java:
fonte
Use este método para definir margem no dp
chame o método:
fonte
Para uma configuração rápida de uma linha, use
mas tenha cuidado com qualquer uso incorreto do LayoutParams, pois isso não terá nenhuma
if
instância de declaração chechfonte
Criou uma função de extensão Kotlin para aqueles que acham útil.
Certifique-se de passar em pixels, não em dp. Feliz codificação :)
fonte
No meu exemplo, estou adicionando um ImageView a um LinearLayout programaticamente. Eu configurei as margens superior e inferior para o ImagerView. Em seguida, adicione o ImageView ao LinearLayout.
fonte
Você pode usar esse método e colocar dimen estático como 20, ele converte de acordo com o seu dispositivo
fonte
Hoje, o melhor é provavelmente usar Paris , uma biblioteca fornecida pelo AirBnB.
Os estilos podem ser aplicados assim:
Ele também suporta exibição personalizada (se você estender uma exibição) usando anotações:
fonte
Você tem que ligar
igual a:
your_view.setPadding(0,16,0,0)
O que você está tentando usar é apenas o getter.
O Android studio mostra o que
padding...()
realmente significa em java:exemplo de preenchimento A imagem mostra apenas chamadas
getPadding...()
Se você deseja adicionar uma margem ao seu TextView, precisará do LayoutParams:
fonte
Eu tive que converter o meu
FrameLayout
para um linearLayout como ele é herdado e definir margens para que a atividade apareça apenas em parte da tela, juntamente com um plano de fundo diferente dos parâmetros de layout originais nosetContentView
.Nenhum dos outros trabalhou para usar a mesma atividade e alterar as margens com base na abertura da atividade em um menu diferente! O setLayoutParams nunca funcionou para mim - o dispositivo travava toda vez. Mesmo sendo números codificados - este é apenas um exemplo do código apenas para fins de demonstração.
fonte
Você pode usar
ViewGroup.MarginLayoutParams
para definir a largura, altura e margensOnde o método
setMargins();
obtém valores para esquerda, superior, direita e inferior, respectivamente. No sentido horário !, a partir da esquerda.fonte