Jak programowo ustawić układ_grawitacji?


334

Moje pytanie jest proste

Jak programowo ustawić moje przyciski layout_gravity?

Znalazłem to w Internecie, ale po prostu rzuca mi wyjątek Nullpointer:

 Button MyButton = new Button(this);

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


    MyLinearLayout.addView(MyButton);

Jakieś rozwiązanie?


Uważam, że musisz dodać widok do jego elementu nadrzędnego, zanim będzie miał LayoutParams, które nie są zerowe.
— Rich Morey,

Odpowiedzi:


545

Jawa

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
}

Aby sprawdzić wartości grawitacji i jak ustawić grawitację, sprawdź grawitację .

Zasadniczo powinieneś wybrać LayoutParamszależnie od rodzica. Może to być RelativeLayout, LinearLayoutetc ...


1
Z niektórych powodów params.gravity = 80 (powinien to być BOTTOM według te Docs) po prostu nie działa. Mam trochę przestrzeni między dnem Widoku i Tekstu. Nie jest tak wyrównany z dołu ...
— Adam Varhegyi

51
Biorąc stałą wartość z dokumentacji jest po prostu błędna, użyj Gravity.TOP
— Maragues

35
to jest „grawitacja” i poprosił o „layout_gravity” ??
— M. Usman Khan,

10
@usman nie, chodzi o layout_gravity(to znaczy LayoutParams.gravity). To gravitybyłobybutton.setGravity()
— Floern

8
Istnieje wiele błędnych informacji na temat grawitacji i układu_grawitacji tutaj na SO. Wielu ppl uważa, że setGravity()jest to układ_grawitacji, ale to źle. Mogę potwierdzić, że ta odpowiedź jest poprawna dla programowego ustawienia układu_grawitacji.
— Bevor

55

Nie chciałbym wskrzeszać starych wątków, ale to jest problem, na który nie ma poprawnej odpowiedzi, a ponadto sam na to wpadłem.

Oto długa kwestia, jeśli interesuje Cię tylko odpowiedź, przewiń do samego kodu:

Android: grawitacja i Android: układ_grawitacja działa inaczej. Oto artykuł, który przeczytałem, który mi pomógł.

GIST artykułu: grawitacja wpływa na widok po przypisaniu wysokości / szerokości. Tak więc środek ciężkości nie wpłynie na wykonany widok FILL_PARENT (pomyśl o tym jak o automatycznym marginesie). layout_gravity center BĘDZIE wpływać na widok FILL_PARENT (pomyśl o tym jak o automatycznej padzie).

Zasadniczo android: layout_gravity NIE MOŻNA uzyskać dostępu programowego, tylko android: grawitacja. W przypadku OP i moim przypadku zaakceptowana odpowiedź nie umieszcza przycisku pionowo w środku.

Aby poprawić odpowiedź Karthi:

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

Link do LinearLayout.LayoutParams.

android: layout_gravity pokazuje „Brak powiązanych metod”, co oznacza, że ​​nie można uzyskać dostępu programowego. Natomiast grawitacja jest polem w tej klasie.


Aby dodać automatyczne marginesy grawitacji (z powodu braku lepszego terminu) w oparciu o orientację rodzica LinearLayout. Podany link do artykułu pomoże.
— Uknight

21
MyButton.setGravity(Gravity.RIGHT);

Dla układu_grawitacja użyj odpowiedzi podanej przez „karthi”. Ta metoda ustawia grawitację, aby umieścić dzieci w widoku.


37
To tylko grawitacja, a nie układ_grawitacja.
— Adam Varhegyi,

OK, powiedz mi, czy układ_grawitacja jest równy setGravity, to jak ustawić grawitację?
— Adam Varhegyi



poszukaj metody setGravity w linku .., jakoś przekierowanie do metody dokładnej nie działa ..
— Yashwanth Kumar

17

Miałem podobny problem z programowym ustawieniem układu_grawitacji na przyciskach w GridLayout.

Sztuczka polegała na ustawieniu grawitacji na układzie przycisków PARAMY PO dodaniu przycisku do elementu nadrzędnego (GridLayout), w przeciwnym razie grawitacja zostanie zignorowana .

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

Jak zmienić układ_grawitacji dla całego GridLayout?
— Iqbal

15

Jeśli chcesz zmienić layou_gravityistniejący widok, wykonaj następujące czynności:

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

Pamiętaj, aby użyć prawa LayoutParamsna podstawie typu układu, w którym znajduje się Twój widok. Np .:

LinearLayout.LayoutParams

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

użyj tego, aby dodać mor więcej niż jedną grawitację


9

To pytanie jest stare, ale właśnie miałem ten sam problem i rozwiązałem go w ten sposób

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

@Muzikant .. ok .. najpierw tego nie zauważyłem .. ale teraz jest dla mnie jasne .. Dzięki
— Noman

Czy to działa tylko poprzez określenie, jaki układ jest pierwszy? Like RelativeLayout.LayoutParams ... zamiast po prostu LayoutParams
— ryvianstyron

RelativeLayout.LayoutParams używają innych flag do ustawiania grawitacji widoku (rightOf, centerInParent, centerVertical). To obejście dotyczy dzieci LinearLayouts
— noni

6

KOTLIN ustawia więcej niż jedną grawitację na FrameLayout bez zmiany rozmiaru:

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

Oszczędzam mój czas ... THX
— BertKing

4

Używam czegoś takiego: (Xamarin i kod C #)

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

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

SetGravity umieszcza mój textView na środku układu. Tak więc właściwość układu SetGravity odnosi się do zawartości układu


4

W razie potrzeby ustawienia Grawitacji dla widoku skorzystaj z następujących opcji

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

Aby ustawić układ_grawitacji dla przycisku, użyj pola grawitacji dla parametrów układu jako

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

wypróbuj tę nadzieję, że to wyjaśni dzięki


3

Pozostałe odpowiedzi są prawidłowe, chcę dodać więcej wyjaśnień. Układ_grawitacji dotyczy sposobu pozycjonowania widoku w widoku nadrzędnym.

Musisz ustawić grawitację ** po wywołaniu metody parentView.addView () **. Możemy zobaczyć kod:

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

Problem wskaźnika zerowego polega na tym, że nie wywołuje metody addView przed getLayoutParams ().

Adnotacja została już powiedziana: „Ta metoda może zwrócić wartość null, jeśli ten widok nie jest dołączony do nadrzędnej grupy ViewGroup lub {@ link # setLayoutParams (android.view.ViewGroup.LayoutParams)} nie został pomyślnie wywołany. Gdy widok jest dołączony do elementu nadrzędnego ViewGroup, ta metoda nie może zwracać wartości null. ”


To mnie też ugryzło ... nie jest oczywiste, że musisz ustawić grawitację po wywołaniu metody addView (). Można by pomyśleć, że skonfigurujesz wszystko w nowym widoku, a następnie dodasz go, aby było to nieintuicyjne :-P
— kenyee

3

Jeśli chcesz umieścić widok na środku rodzica, możesz zrobić z następującym kodem.

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

te sekcje kodu powodują, że LinearLayout umieszcza pierwsze elementy widoku na środku elementu nadrzędnego. Dlatego system nie bierze pod uwagę początkowej szerokości i wysokości, aby ustawić widok w środku. Dobrze wykonuję sekcję kodu.


i - kursywa))))
— Artem

2

do RelativeLayout, wypróbuj ten kod, działa dla mnie: yourLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);


2

Doskonale działa !!! Żadna z powyższych odpowiedzi nie działa dla mnie. W pliku Xml ustawienie grawitacji i ustawienie layout_gravity jest inne. Sprawdź poniższy kod

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

Sprawdź także To, gdzie można znaleźć jasne wyjaśnienie dotyczące grawitacji i układu_grawitacji.


1

Większość powyższych odpowiedzi jest prawidłowa, więc napisałem metody pomocnicze, dzięki czemu możesz użyć ich bezpośrednio w swoim projekcie.

ustawiane layout_gravityprogramowo

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

Przełączyłem się z LinearLayout.LayoutParams na RelativeLayout.LayoutParams, aby w końcu uzyskać pożądany rezultat w utworzonym przeze mnie niestandardowym widoku okręgu.

Ale zamiast grawitacji używasz addRule

RelativeLayout.LayoutParams mCircleParams = nowy RelativeLayout.LayoutParams (wysokość okręgu, wysokość okręgu);

    mCircleParams.addRule(RelativeLayout.CENTER_IN_PARENT);

0

Wypróbuj ten kod

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

lub

    btn.setGravity(Gravity.TOP);

3
OP prosi o layout_gravitynie 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);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.