Wie setze ich layout_gravity programmgesteuert?

333

Meine Frage ist einfach,

Wie stelle ich meine Schaltflächen layout_gravity programmgesteuert ein?

Ich habe das im Internet gefunden, aber es löst einfach eine Nullpointer-Ausnahme aus:

 Button MyButton = new Button(this);

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


    MyLinearLayout.addView(MyButton);

Irgendeine Lösungsmöglichkeit?

Adam Varhegyi
quelle
Ich glaube, Sie müssen die Ansicht zu ihrem übergeordneten Element hinzufügen, bevor sie LayoutParams enthält, die nicht null sind.
Rich Morey

Antworten:

544

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
}

Informationen zu den Schwerkraftwerten und zum Einstellen der Schwerkraft finden Sie unter Schwerkraft .

Grundsätzlich sollten Sie die LayoutParamsje nach Eltern wählen . Es kann sein RelativeLayout,LinearLayout etc ...

Karthi
quelle
1
Aus einigen Gründen funktioniert params.gravity = 80 (es sollte BOTTOM sein, von te Docs) einfach nicht. Ich habe etwas Platz zwischen dem unteren Rand der Ansicht und dem Text. Es ist nicht so unten ausgerichtet ...
Adam Varhegyi
51
Es ist einfach falsch, den konstanten Wert aus der Dokumentation zu nehmen. Bitte verwenden Sie Gravity.TOP
Maragues
35
das ist "Schwerkraft" und er fragte nach "layout_gravity"?
M. Usman Khan
10
@usman nein, hier geht es um layout_gravity(das heißt LayoutParams.gravity). Das gravitywärebutton.setGravity()
Floern
8
Es gibt viele falsche Informationen über Schwerkraft und layout_gravity hier auf SO. Viele Leute denken, dass dies setGravity()die layout_gravity ist, aber das ist falsch. Ich kann bestätigen, dass diese Antwort korrekt ist, um layout_gravity programmgesteuert festzulegen.
Bevor
54

Ich würde es hassen, alte Threads wiederzubeleben, aber dies ist ein Problem, das nicht richtig beantwortet wird, und außerdem bin ich selbst auf dieses Problem gestoßen.

Wenn Sie nur an der Antwort interessiert sind, scrollen Sie bitte bis zum Code:

android :vity und android: layout_gravity funktionieren unterschiedlich. Hier ist ein Artikel, den ich gelesen habe und der mir geholfen hat.

GIST des Artikels: Die Schwerkraft beeinflusst die Ansicht, nachdem Höhe / Breite zugewiesen wurde. Der Schwerpunkt wirkt sich also nicht auf eine Ansicht aus, die mit FILL_PARENT ausgeführt wird (stellen Sie sich dies als automatischen Rand vor). layout_gravity center wirkt sich auf die Ansicht FILL_PARENT aus (stellen Sie sich das als Auto-Pad vor).

Grundsätzlich kann auf android: layout_gravity NICHT programmgesteuert zugegriffen werden, sondern nur auf android :vity. Im Fall des OP und in meinem Fall platziert die akzeptierte Antwort die Schaltfläche nicht vertikal in der Mitte.

Um Karthis Antwort zu verbessern:

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

Link zu LinearLayout.LayoutParams.

android: layout_gravity zeigt "Keine verwandten Methoden" an, was bedeutet, dass nicht programmgesteuert zugegriffen werden kann. Während die Schwerkraft ein Feld in der Klasse ist.

Ritter
quelle
Außerdem können Sie diese automatischen Schwerkraftränder (mangels eines besseren Ausdrucks) basierend auf der Ausrichtung des LinearLayout-Elternteils hinzufügen. Der bereitgestellte Artikellink hilft.
Uknight
21
MyButton.setGravity(Gravity.RIGHT);

Verwenden Sie für layout_gravity die Antwort "karthi". Diese Methode legt die Schwerkraft fest, um die Kinder in der Ansicht zu platzieren.

Yashwanth Kumar
quelle
37
Es ist nur die Schwerkraft, nicht layout_gravity.
Adam Varhegyi
Okay, dann sag mir, wenn layout_gravity gleich setGravity ist, wie stelle ich dann die Schwerkraft ein?
Adam Varhegyi
developer.android.com/reference/android/widget/… , sieh dir das an ..
Yashwanth Kumar
5
Das Posten eines riesigen Dokuments ist keine Lösung, sorry,
Adam Varhegyi
Suchen Sie nach der setGravity-Methode im Link. Irgendwie funktioniert die Umleitung zur genauen Methode nicht.
Yashwanth Kumar
17

Ich hatte ein ähnliches Problem beim programmgesteuerten Festlegen von layout_gravity für Schaltflächen in einem GridLayout.

Der Trick bestand darin , Schwerkraft auf der Taste layoutParams AFTER die Taste , um einen Elternteil (Gridlayout) hinzugefügt wurde, da sonst die Schwerkraft außer Acht gelassen werden würde .

grid.addView(button)
((GridLayout.LayoutParams)button.getLayoutParams()).setGravity(int)
owjsub
quelle
Wie ändere ich die layout_gravity für das gesamte GridLayout?
Iqbal
15

Wenn Sie die layou_gravityeiner vorhandenen Ansicht ändern möchten, gehen Sie folgendermaßen vor:

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

Denken Sie daran, das Recht LayoutParamsbasierend auf dem Layouttyp zu verwenden, in dem sich Ihre Ansicht befindet. Beispiel:

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

Verwenden Sie dies, um mehr als eine Schwerkraft hinzuzufügen

Omar Alnajjar
quelle
9

Diese Frage ist alt, aber ich hatte gerade das gleiche Problem und löste es so

LayoutParams lay = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)
lay.gravity = Gravity.CENTER;
CodeFlakes
quelle
@ Muzikant .. ok .. ich habe es nicht zuerst bemerkt .. aber jetzt ist es mir klar .. Danke
Noman
Funktioniert dies nur, indem angegeben wird, um welches Layout es sich zuerst handelt? Wie RelativeLayout.LayoutParams ... statt nur LayoutParams
Ryvianstyron
RelativeLayout.LayoutParams verwenden andere Flags, um die Schwerkraft der Ansicht festzulegen (rightOf, centerInParent, centerVertical). Diese Problemumgehung ist für LinearLayouts-Kinder
noni
6

KOTLIN stellt mehr als eine Schwerkraft auf FrameLayout ein, ohne die Größe zu ändern:

     // 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
quelle
Das spart mir Zeit ... THX
BertKing
Dank bro! Es ist meine Zeit sparen 2 ...
YH_WU
4

Ich benutze so etwas: (Xamarin und C # Code)

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

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

Die SetGravity platziert meine Textansicht in der Mitte des Layouts. So SetGravity Layout - Eigenschaft beziehen sich auf das Layout Inhalt

alin0509
quelle
4

Wenn Sie die Schwerkraft für eine Ansicht festlegen müssen, gehen Sie wie folgt vor

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

Verwenden Sie zum Festlegen von layout_gravity für die Schaltfläche das Schwerkraftfeld für die Layoutparameter als

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

Versuchen Sie diese Hoffnung, dies klärt Dank

user2779311
quelle
3

Der Rest der Antworten ist richtig, ich möchte weitere Erklärungen hinzufügen. In layout_gravity geht es darum, wie die Ansicht in der übergeordneten Ansicht positioniert wird.

Sie müssen die Schwerkraft ** festlegen, nachdem die Methode parentView.addView () ** aufgerufen wurde. Wir können den Code sehen:

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

Das Problem des Nullzeigers besteht darin, dass addView nicht vor getLayoutParams () aufgerufen wird.

In der Anmerkung wurde bereits gesagt: "Diese Methode gibt möglicherweise null zurück, wenn diese Ansicht nicht an eine übergeordnete ViewGroup angehängt ist oder {@ link # setLayoutParams (android.view.ViewGroup.LayoutParams)} nicht erfolgreich aufgerufen wurde. Wenn eine Ansicht an eine übergeordnete Ansicht angehängt ist ViewGroup, diese Methode darf nicht null zurückgeben. "

Schnee Albert
quelle
Das hat mich auch gebissen ... es ist nicht offensichtlich, dass Sie die Schwerkraft einstellen müssen, nachdem addView () aufgerufen wurde. Sie würden denken, Sie würden alles in der neuen Ansicht einrichten und dann hinzufügen, so dass dies nicht intuitiv ist :-P
Kenyee
3

Wenn Sie eine Ansicht in die Mitte des übergeordneten Elements einfügen möchten, können Sie den folgenden Code verwenden.

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

In diesem Codeabschnitt platziert LinearLayout die ersten Ansichtselemente in der Mitte des übergeordneten Elements. Daher berücksichtigen wir die anfängliche Breite und Höhe nicht, um die Ansicht in der Mitte anzuordnen. Ich mache den Codeabschnitt gut.

Cheng
quelle
i - kursiv))))
Artem
2

Versuchen Sie diesen Code für RelativeLayout, er funktioniert für mich: yourLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);

Michael Wang
quelle
2

Perfekt funktionierend !!! Keine der obigen Antworten funktioniert für mich. In der XML-Datei unterscheiden sich die Einstellungen für die Schwerkraft und die Einstellung für layout_gravity. Überprüfen Sie den folgenden Code

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

Aktivieren Sie auch Dies, wo Sie klare Erklärungen zu Schwerkraft und layout_gravity finden.

Tara
quelle
1

Die meisten der oben genannten Antworten sind richtig. Schreiben Sie daher eine Hilfsmethode, damit Sie sie direkt in Ihrem Projekt verwenden können.

layout_gravityprogrammgesteuert einstellen

// 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
quelle
0

Ich habe von LinearLayout.LayoutParams zu RelativeLayout.LayoutParams gewechselt, um endlich das gewünschte Ergebnis für eine von mir erstellte benutzerdefinierte Kreisansicht zu erhalten.

Anstelle der Schwerkraft verwenden Sie jedoch addRule

RelativeLayout.LayoutParams mCircleParams = new RelativeLayout.LayoutParams (Kreishöhe, Kreishöhe);

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

Versuchen Sie diesen Code

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

oder

    btn.setGravity(Gravity.TOP);
Faxriddin Abdullayev
quelle
3
OP fragt layout_gravitynicht 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
quelle
-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
quelle