layout_margintop - set margin button programmatically android



No Android, como definir margens no dp programaticamente? (8)

Aqui está a resposta do all-in-one com atualizações recentes:

Etapa 1, para atualizar a margem

A ideia básica é tirar a margem e atualizá-la. A atualização será aplicada automaticamente e você não precisará defini-la novamente. Para obter os parâmetros do layout, basta chamar este método:

LayoutParams layoutParams = (LayoutParams) yourView.findViewById(R.id.THE_ID).getLayoutParams();

O LayoutParams vem do layout da sua visualização. Se a visualização for de um layout linear, você precisará importar LinearLayout.LayoutParams . Se você usar o layout relativo, importe LinearLayout.LayoutParams etc.

Agora, se você definir a margem usando Layout_marginLeft , Right , etc, será necessário atualizar a margem dessa maneira

layoutParams.setMargins(left, top, right, bottom);

Se você definir a margem usando o novo layout_marginStart , será necessário atualizar a margem dessa maneira

layoutParams.setMarginStart(start);
layoutParams.setMarginEnd(end);

Etapa 2, para atualizar a margem no dp

Todas as duas formas de atualizar a margem acima estão atualizando em pixels. Você precisa fazer uma tradução de dp para pixels.

float dpRatio = context.getResources().getDisplayMetrics().density;
int pixelForDp = (int)dpValue * dpRatio;

Agora coloque o valor calculado para as funções de atualização de margem acima e você deve estar tudo pronto

this , this e this tópico, tentei encontrar uma resposta sobre como definir as margens em uma única visualização. No entanto, eu queria saber se não há um caminho mais fácil. Vou explicar por que prefiro 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 setBackgroundResource(int id) ou setBackgroundDrawable(Drawable d) ), quero que as margens sejam 0. Se eu chamar isso:

public void setBackgroundToDefault() {
    backgroundIsDefault = true;
    super.setBackgroundResource(android.R.drawable.btn_default);
    // Set margins somehow
}

Eu quero as margens para redefinir a -3dp (eu já li here como converter de pixels para dp, então uma vez que eu sei como definir margens em px, eu posso gerenciar a conversão eu mesmo). Mas como isso é chamado na classe CustomButton , o pai pode variar de LinearLayout para TableLayout, e eu prefiro que ele não obtenha seu pai e verifique a ocorrência desse pai. Isso também será bastante inperformante, imagino.

Além disso, ao chamar (usando LayoutParams) parentLayout.addView(myCustomButton, newParams) , não sei se isso o adiciona à 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 evita lidar com 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 possui os atributos topMargin , bottomMargin , leftMargin , rightMargin . A instância mc que você vê é apenas um MarginContainer que contém as margens offset (-3dp) e (oml, omr, omt, omb) e as margens originais (ml, mr, mt, mb).


Answer #1

Como hoje, o melhor é provavelmente usar Paris , uma biblioteca fornecida pela AirBnB.

Os estilos podem ser aplicados assim:

Paris.style(myView).apply(R.style.MyStyle);

Ele também suporta visualização personalizada (se você estender uma visão) usando anotações:

@Styleable and @Style


Answer #3

Melhor maneira de sempre:

private void setMargins (View view, int left, int top, int right, int bottom) {
    if (view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
        ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
        p.setMargins(left, top, right, bottom);
        view.requestLayout();
    }
}

Como chamar o método:

setMargins(mImageView, 50, 50, 50, 50);

Espero que isso ajude você.


Answer #4

Quando você está em uma Visualização personalizada, você pode usar getDimensionPixelSize(R.dimen.dimen_value) , no meu caso, adicionei a margem em LayoutParams criada no método init .

Em Kotlin

init {
    LayoutInflater.from(context).inflate(R.layout.my_layout, this, true)
    layoutParams = LayoutParams(MATCH_PARENT, WRAP_CONTENT).apply {
    val margin = resources.getDimensionPixelSize(R.dimen.dimen_value)
    setMargins(0, margin, 0, margin)
}

em Java:

public class CustomView extends LinearLayout {

    //..other constructors

    public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        int margin = getResources().getDimensionPixelSize(R.dimen.spacing_dime);
        params.setMargins(0, margin, 0, margin);
        setLayoutParams(params);
    }
}

Answer #5

Use este método para definir a margem no dp

private void setMargins (View view, int left, int top, int right, int bottom) {
    if (view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
        ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) view.getLayoutParams();

        final float scale = getBaseContext().getResources().getDisplayMetrics().density;
        // convert the DP into pixel
        int l =  (int)(left * scale + 0.5f);
        int r =  (int)(right * scale + 0.5f);
        int t =  (int)(top * scale + 0.5f);
        int b =  (int)(bottom * scale + 0.5f);

        p.setMargins(l, t, r, b);
        view.requestLayout();
    }
}

chame o método:

setMargins(linearLayout,5,0,5,0);

Answer #6

layout_margin é uma restrição que um child view diz ao seu pai. No entanto, o papel dos pais é escolher entre permitir margem ou não. Basicamente, ao definir android: layout_margin = "10dp", o filho está suplicando ao grupo de visualização pai para alocar espaço que seja 10dp maior que seu tamanho real. (padding = "10dp", por outro lado, significa que a visão infantil fará 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 de itens são ignoradas. Antes de chamar setMargin() para um LayoutParam, você deve sempre certificar-se de que a visão atual está vivendo em um ViewGroup que suporta margin (por exemplo, LinearLayouot ou RelativeLayout) e lançar o resultado de getLayoutParams() para o LayoutParams específico desejado. ( ViewGroup.LayoutParams nem tem o método setMargins() !)

A função abaixo deve fazer o truque. No entanto, certifique-se de substituir RelativeLayout pelo tipo de exibição pai.

private void setMargin(int marginInPx) {
    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) getLayoutParams();
    lp.setMargins(marginInPx,marginInPx, marginInPx, marginInPx);
    setLayoutParams(lp);
}

Answer #7
int sizeInDP = 16;

int marginInDp = (int) TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP, sizeInDP, getResources()
                    .getDisplayMetrics());

Então

layoutParams = myView.getLayoutParams()
layoutParams.setMargins(marginInDp, marginInDp, marginInDp, marginInDp);
myView.setLayoutParams(layoutParams);

Ou

LayoutParams layoutParams = new LayoutParams...
layoutParams.setMargins(marginInDp, marginInDp, marginInDp, marginInDp);
myView.setLayoutParams(layoutParams);




margin