Como definir layout_gravity programaticamente?

334

Minha pergunta é simples,

Como definir meus botões layout_gravity programaticamente?

Encontrei isso na internet, mas isso simplesmente me lança uma exceção do Nullpointer:

 Button MyButton = new Button(this);

    LinearLayout.LayoutParams  lllp=(LinearLayout.LayoutParams)MyButton.getLayoutParams();
    lllp.gravity=Gravity.RIGHT;
    MyButton.setLayoutParams(lllp); 


    MyLinearLayout.addView(MyButton);

Qualquer solução?

Adam Varhegyi
fonte
Acredito que você precise adicionar a exibição ao seu pai antes que ele tenha LayoutParams que não sejam nulos.
19617 Rich Morey

Respostas:

545

Java

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
params.weight = 1.0f;
params.gravity = Gravity.TOP;

button.setLayoutParams(params);

Kotlin

val params = LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.WRAP_CONTENT,
    LinearLayout.LayoutParams.WRAP_CONTENT
).apply {
    weight = 1.0f
    gravity = Gravity.TOP
}

Para valores de gravidade e como definir a gravidade, verifique Gravidade .

Basicamente, você deve escolher o que LayoutParamsdepende do pai. Pode ser RelativeLayout, LinearLayoutetc ...

Karthi
fonte
1
Por alguns motivos, params.gravity = 80 (deve ser INFERIOR, pelo Docs) simplesmente não está funcionando. Eu tenho um espaço entre a parte inferior da tela e o texto. Não é tão Bottom-alinhado ...
Adam Varhegyi
51
Tomando o valor constante da documentação é simplesmente errado, por favor use Gravity.TOP
Maragues
36
isso é "gravidade" e ele pediu "layout_gravity" ??
M. Usman Khan
11
@usman não, trata-se de layout_gravity(isto é LayoutParams.gravity). O gravityque seria #button.setGravity()
Floern
9
Há muitas informações erradas sobre gravidade e layout_gravity aqui no SO. Muitas pessoas pensam que esse setGravity()é o layout_gravity, mas isso está errado. Posso aprovar que esta resposta está correta para definir layout_gravity programaticamente.
Bevor
55

Eu odiaria ressuscitar threads antigos, mas esse é um problema que não foi respondido corretamente e, além disso, eu mesmo me deparei com esse problema.

Aqui está o passo longo, se você estiver interessado apenas na resposta, role até o código:

android: gravidade e android: layout_gravity funciona de maneira diferente. Aqui está um artigo que li que me ajudou.

GIST do artigo: a gravidade afeta a vista depois que a altura / largura é atribuída. Portanto, o centro de gravidade não afetará uma exibição concluída FILL_PARENT (pense nela como margem automática). O layout_gravity center afetará a exibição que é FILL_PARENT (pense nela como auto pad).

Basicamente, android: layout_gravity NÃO PODE ter acesso programaticamente, apenas android: gravidade. No caso do OP e no meu caso, a resposta aceita não coloca o botão verticalmente no centro.

Para melhorar a resposta de Karthi:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER;
button.setLayoutParams(params);

Link para LinearLayout.LayoutParams.

android: layout_gravity mostra o significado "Nenhum método relacionado" não pode ser acessado programaticamente. Considerando que a gravidade é um campo na classe.

Uknight
fonte
Também para adicionar as margens automáticas de gravidade (por falta de um termo melhor) com base na orientação do pai LinearLayout. O link do artigo fornecido ajudará.
Uknight
21
MyButton.setGravity(Gravity.RIGHT);

Para layout_gravity, use a resposta indicada por "karthi". Este método define a gravidade para colocar as crianças dentro da vista.

Yashwanth Kumar
fonte
37
É apenas gravidade, não layout_gravity.
precisa saber é o seguinte
Ok, então me diga se layout_gravity é igual a setGravity, então como eu defino a gravidade?
Adam Varhegyi 8/11
developer.android.com/reference/android/widget/... , olhar para este ..
Yashwanth Kumar
5
Publicação de um enorme documento não é solução muito,
Adam Varhegyi
olhar para o método AjustarGravidade na ligação .., de alguma forma o redirecionamento para o método exato não está funcionando ..
Yashwanth Kumar
17

Eu tive um problema semelhante ao definir programaticamente layout_gravity nos botões em um GridLayout.

O truque era definir a gravidade no layout do botãoParams APÓS o botão ser adicionado a um pai (GridLayout), caso contrário , a gravidade seria ignorada .

grid.addView(button)
((GridLayout.LayoutParams)button.getLayoutParams()).setGravity(int)
owjsub
fonte
Como altero o layout_gravity para todo o GridLayout?
Iqbal
15

Se você deseja alterar a layou_gravityvisualização existente, faça o seguinte:

((FrameLayout.LayoutParams) view.getLayoutParams()).gravity = Gravity.BOTTOM;

Lembre-se de usar o direito com LayoutParamsbase no tipo de layout em que está sua exibição. Ex:

LinearLayout.LayoutParams
vovahost
fonte
12
layoutParams2.gravity = Gravity.RIGHT|Gravity.BOTTOM;

use isso para adicionar mais de uma gravidade

Omar Alnajjar
fonte
9

Esta pergunta é antiga, mas eu apenas tive o mesmo problema e resolvi-o assim

LayoutParams lay = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)
lay.gravity = Gravity.CENTER;
CodeFlakes
fonte
@ Muuzikant .. ok .. eu não notei primeiro .. mas agora está claro para mim .. Obrigado
Noman
Isso funciona apenas especificando que tipo de layout é o primeiro? Como RelativeLayout.LayoutParams ... em vez de apenas LayoutParams
ryvianstyron
RelativeLayout.LayoutParams usam outros sinalizadores para definir a gravidade da exibição (rightOf, centerInParent, centerVertical). Esta solução alternativa é para crianças LinearLayouts
noni
6

KOTLIN configurando mais de uma gravidade no FrameLayout sem alterar o tamanho:

     // assign more than one gravity,Using the operator "or"
    var gravity = Gravity.RIGHT or Gravity.CENTER_VERTICAL
     // update gravity
    (pagerContainer.layoutParams as FrameLayout.LayoutParams).gravity = gravity
     // refresh layout
     pagerContainer.requestLayout()
Hitesh Sahu
fonte
Está economizando meu tempo ... THX
BertKing 01/03/19
4

Eu uso algo assim: (código Xamarin e C #)

  LinearLayout linLayout= new LinearLayout(this); 
    linLayout.SetGravity(GravityFlags.Center);

    TextView txtView= new TextView(this);  
     linLayout.AddView(txtView); 

o SetGravity coloca meu textView no centro do layout. Portanto, a propriedade de layout SetGravity se refere ao conteúdo do layout

alin0509
fonte
4

Caso você precise definir Gravidade para uma Visualização, use o seguinte

Button b=new Button(Context);
b.setGravity(Gravity.CENTER);

Para definir layout_gravity para o Button, use o campo gravidade para os layoutparams como

LayoutParams lp=new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
lp.gravity=Gravity.CENTER;

tente esta esperança isso limpa graças

user2779311
fonte
3

O restante das respostas está correto, quero acrescentar mais explicações. O layout_gravity é sobre como posicionar a vista na vista pai.

Você deve definir a gravidade ** após o método parentView.addView () ** ser chamado. Podemos ver o código:

public void setLayoutParams(ViewGroup.LayoutParams params) {
    if (params == null) {
        throw new NullPointerException("Layout parameters cannot be null");
    }
    mLayoutParams = params;
    resolveLayoutParams();
    if (mParent instanceof ViewGroup) {
        ((ViewGroup) mParent).onSetLayoutParams(this, params);
    }
    requestLayout();
}

E o problema do ponteiro nulo é porque ele não está chamando addView antes de getLayoutParams ().

A anotação já foi declarada "Este método pode retornar nulo se este View não estiver anexado a um ViewGroup pai ou {@ link # setLayoutParams (android.view.ViewGroup.LayoutParams)} não foi chamado com êxito. Quando um View é anexado a um pai ViewGroup, esse método não deve retornar nulo. "

Snow Albert
fonte
Isso também me incomodou ... não é óbvio que você precisa definir a gravidade após o addView () ser chamado. Você pensaria que configuraria tudo na nova exibição e a adicionaria para que isso não seja intuitivo:
P
3

Se você deseja colocar uma visão no centro dos pais, pode fazer o seguinte código.

public class myLayout extends LinearLayout {

    public myLayout(Context context) {
      super(context);

      RelativeLayout vi = (RelativeLayout) ((LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
            R.layout.activity_main, null);
      LinearLayout.LayoutParams cc = new LinearLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
      cc.gravity = Gravity.CENTER;
      this.setGravity(Gravity.CENTER);
      this.addView(vi);
  }
}

essa seção de código faz com que o LinearLayout coloque os primeiros elementos de exibição no centro do pai. Portanto, o sistema não considera a largura inicial e a altura altas para organizar a vista no centro. Eu faço a seção de código também.

Cheng
fonte
i - italic))))
Artem
2

para RelativeLayout, tente este código, ele funciona para mim: yourLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);

Michael Wang
fonte
2

Perfeitamente trabalhando !!! Nenhuma das respostas acima funciona para mim. No arquivo XML, a configuração gravidade e a configuração layout_gravity são diferentes. Confira o código abaixo

// here messageLL is the linear layout in the xml file
// Before adding any view just remove all views
   messageLL.removeAllViews();
// FrameLayout is the parent for LinearLayout
FrameLayout.LayoutParams params = new 
   FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
   params.gravity = Gravity.CENTER|Gravity.CENTER_VERTICAL;
   messageLL.setLayoutParams(params);
   messageText.setVisibility(View.GONE);
   messageNoText.setVisibility(View.VISIBLE);
   messageLL.addView(messageNoText);

Verifique também Isto, onde você pode encontrar explicações claras sobre gravidade e layout_gravity.

Tara
fonte
1

A maioria das respostas acima está correta, então escreva um método auxiliar, para que você possa usá-lo diretamente em seu projeto.

definir layout_gravityprogramaticamente

// gravity types : Gravity.BOTTOM, Gravity.START etc.
// view : can be any view example : button, textview, linearlayout, image etc.

// for single view
   public static void setLayoutGravity(int gravity, View view){
     ((LinearLayout.LayoutParams) view.getLayoutParams()).gravity = gravity;
    }


// for mulitple views
  public static void setLayoutGravity(int gravity, View ...view){
        for(View item : view)
            ((LinearLayout.LayoutParams) item.getLayoutParams()).gravity = gravity;
    }
Abhishek Garg
fonte
0

Mudei de LinearLayout.LayoutParams para RelativeLayout.LayoutParams para finalmente obter o resultado que eu estava desejando em uma revisão de círculo personalizada que criei.

Mas, em vez de gravidade, você usa addRule

RelativeLayout.LayoutParams mCircleParams = new RelativeLayout.LayoutParams (altura do círculo, altura do círculo);

    mCircleParams.addRule(RelativeLayout.CENTER_IN_PARENT);
user3886197
fonte
0

Experimente este código

    Button btn = new Button(YourActivity.this);
    btn.setGravity(Gravity.CENTER | Gravity.TOP);
    btn.setText("some text");

ou

    btn.setGravity(Gravity.TOP);
Faxriddin Abdullayev
fonte
3
O OP pede que layout_gravitynão gravitiy.
Ali Zeynali
0
 int width=getResources().getDisplayMetrics().widthPixels; 
 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams
                    (width, width);

            params.gravity = Gravity.CENTER;

           iv_main_text = new HTextView(getContext());
            iv_main_text.setLayoutParams(params);
            iv_main_text.setBackgroundColor(Color.BLUE);
            iv_main_text.setTextSize(60);
            iv_main_text.setGravity(Gravity.CENTER);
            iv_main_text.setTextColor(Color.BLACK);
Manthan Patel
fonte
-1
FloatingActionButton sendFab = new FloatingActionButton(this);
    FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    layoutParams.setMargins(32, 32, 32, 32);
    layoutParams.gravity = Gravity.END|Gravity.BOTTOM;
    sendFab.setLayoutParams(layoutParams);
    sendFab.setImageResource(android.R.drawable.ic_menu_send);
VIVEK CHOUDHARY
fonte