Come impostare layout_gravity a livello di codice?


334

La mia domanda è semplice

Come impostare i miei pulsanti layout_gravity a livello di codice?

L'ho trovato su Internet, ma mi lancia semplicemente un'eccezione Nullpointer:

 Button MyButton = new Button(this);

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


    MyLinearLayout.addView(MyButton);

Qualche soluzione?


Credo che sia necessario aggiungere la vista al suo genitore prima che abbia LayoutParams che non siano nulli.
Rich Morey,

Risposte:


545

Giava

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
}

Per i valori di gravità e come impostare la gravità, controllare Gravità .

Fondamentalmente, dovresti scegliere il LayoutParamsdipendente dal genitore. Può essere RelativeLayout, LinearLayoutecc ...


1
Per alcuni motivi params.gravity = 80 (Dovrebbe essere INFERIORE, secondo te Docs) non funziona. Ho un po 'di spazio tra la parte inferiore della vista e il testo. Non è così allineato in basso ...
Adam Varhegyi,

51
Prendere il valore costante dalla documentazione è semplicemente sbagliato, si prega di utilizzare Gravity.TOP
Maragues,

36
questa è "gravità" e ha chiesto "layout_gravity" ??
M. Usman Khan

11
@usman no, si tratta di layout_gravity(cioè LayoutParams.gravity). Il gravitysarebbebutton.setGravity()
Floern

9
Ci sono molte informazioni errate su gravità e layout_gravity qui su SO. Molti ppl pensano che setGravity()sia il layout_gravity, ma questo è sbagliato. Posso approvare che questa risposta è corretta per l'impostazione di layout_gravity a livello di codice.
Bevor

55

Odierei resuscitare vecchi thread, ma questo è un problema a cui non si risponde correttamente e inoltre ho riscontrato questo problema da solo.

Ecco la parte lunga, se sei interessato solo alla risposta, scorri fino al codice:

android: gravity e android: layout_gravity funziona in modo diverso. Ecco un articolo che ho letto che mi ha aiutato.

GIST dell'articolo: la gravità influenza la vista dopo l'assegnazione di altezza / larghezza. Quindi il baricentro non influirà su una vista FILL_PARENT (pensala come margine automatico). layout_gravity center influirà sulla vista FILL_PARENT (pensala come pad automatico).

Fondamentalmente, android: layout_gravity NON PUO 'essere accesso a livello di codice, solo android: gravità. Nel caso del PO e nel mio caso, la risposta accettata non posiziona il pulsante verticalmente al centro.

Per migliorare la risposta di Karthi:

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

Link a LinearLayout.LayoutParams.

android: layout_gravity mostra il significato di "Nessun metodo correlato" che non è possibile accedere a livello di codice. Considerando che la gravità è un campo nella classe.


Anche per aggiungere i margini automatici di gravità (per mancanza di un termine migliore) in base all'orientamento del genitore LinearLayout. Il link all'articolo fornito sarà di aiuto.
Uknight,

21
MyButton.setGravity(Gravity.RIGHT);

Per layout_gravity usa la risposta dichiarata da "karthi". Questo metodo imposta la gravità per posizionare i bambini all'interno della vista.


37
È solo gravità, non layout_gravity.
Adam Varhegyi,

Va bene allora dimmi se layout_gravity è uguale a setGravity, quindi come posso impostare la gravità?
Adam Varhegyi,


5
Distacco un enorme documento non è la soluzione dispiace,
Adam Varhegyi

cerca il metodo setGravity nel link .., in qualche modo il reindirizzamento al metodo esatto non funziona ..
Yashwanth Kumar

17

Ho avuto un problema simile con l'impostazione a livello di programmazione layout_gravity sui pulsanti in un GridLayout.

Il trucco era impostare la gravità sul layout del pulsante Parametri DOPO che il pulsante era stato aggiunto a un genitore (GridLayout), altrimenti la gravità sarebbe stata ignorata .

grid.addView(button)
((GridLayout.LayoutParams)button.getLayoutParams()).setGravity(int)

Come posso cambiare layout_gravity per l'intero GridLayout?
Iqbal,

15

Se si desidera modificare la layou_gravityvisualizzazione esistente, procedere come segue:

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

Ricorda di utilizzare il diritto in LayoutParamsbase al tipo di layout in cui si trova la tua vista. Es:

LinearLayout.LayoutParams

12
layoutParams2.gravity = Gravity.RIGHT|Gravity.BOTTOM;

usalo per aggiungere più di una gravità


9

Questa domanda è vecchia ma ho appena avuto lo stesso problema e l'ho risolto in questo modo

LayoutParams lay = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)
lay.gravity = Gravity.CENTER;

@Muzikant .. ok .. non me ne sono accorto prima .. ma ora è chiaro per me..Grazie
Noman

Funziona solo specificando che tipo di layout è il primo? Mi piace RelativeLayout.LayoutParams ... anziché solo LayoutParams
ryvianstyron

RelativeLayout.LayoutParams utilizza altri flag per impostare la gravità della vista (rightOf, centerInParent, centerVertical). Questa soluzione alternativa è per i bambini di LinearLayouts
noni,

6

KOTLIN imposta più di una gravità su FrameLayout senza cambiare dimensione:

     // 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()

Mi fa risparmiare tempo ... THX
BertKing

4

Uso qualcosa del genere: (codice Xamarin e C #)

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

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

SetGravity mette il mio textView al centro del layout. Quindi la proprietà del layout di SetGravity si riferisce al contenuto del layout


4

Nel caso in cui sia necessario impostare Gravità per una vista, utilizzare quanto segue

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

Per impostare layout_gravity per il pulsante, utilizzare il campo di gravità per layoutparams come

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

prova questa speranza, questo chiarisce grazie


3

Il resto delle risposte è giusto, voglio aggiungere ulteriori spiegazioni. Layout_gravity riguarda come posizionare la vista nella vista padre.

È necessario impostare la gravità ** dopo che è stato chiamato il metodo parentView.addView () **. Possiamo vedere il codice:

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 il problema del puntatore null è perché non chiama addView prima di getLayoutParams ().

L'annotazione era già stata detta "Questo metodo potrebbe restituire null se questa vista non è collegata a un ViewGroup principale o {@ link # setLayoutParams (android.view.ViewGroup.LayoutParams)} non è stato invocato correttamente. Quando una vista è collegata a un genitore ViewGroup, questo metodo non deve restituire null. "


Questo anche io ... Non è ovvio che devi impostare la gravità dopo che viene chiamato addView ().
Penseresti

3

Se vuoi mettere una vista al centro del genitore, puoi farlo con il seguente codice.

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);
  }
}

questa sezione di codice fa in modo che LinearLayout metta i primi elementi della vista al centro del genitore. Pertanto, non consideriamo la larghezza iniziale e l'alta per disporre la vista al centro. Faccio bene la sezione del codice.


i - italic))))
Artem

2

su RelativeLayout, prova questo codice, funziona per me: yourLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);


2

Perfettamente funzionante !!! Nessuna delle risposte precedenti funziona per me. Nel file Xml, l'impostazione della gravità e l'impostazione layout_gravity sono diverse. Dai un'occhiata al codice qui sotto

// 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);

Controlla anche Questo, dove puoi trovare chiare spiegazioni su gravità e layout_gravity.


1

La maggior parte delle risposte sopra riportate sono esatte, quindi scrivi un metodo di supporto, così puoi usarlo direttamente nel tuo progetto.

impostato a livello di layout_gravityprogrammazione

// 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;
    }

0

Sono passato da LinearLayout.LayoutParams a RelativeLayout.LayoutParams per ottenere finalmente il risultato che desideravo su una vista circolare personalizzata che ho creato.

Ma invece di gravità usi addRule

RelativeLayout.LayoutParams mCircleParams = new RelativeLayout.LayoutParams (circleheight, circleheight);

    mCircleParams.addRule(RelativeLayout.CENTER_IN_PARENT);

0

Prova questo codice

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

o

    btn.setGravity(Gravity.TOP);

3
OP chiede di layout_gravityno 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);

-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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.