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?

Adam Varhegyi
źródło
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 ...

Karthi
źródło
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.

Noc
źródło
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.

Yashwanth Kumar
źródło
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
developer.android.com/reference/android/widget/… , spójrz na to ..
Yashwanth Kumar
5
Zamieszczanie
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)
owjsub
źródło
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
vovahost
źródło
12
layoutParams2.gravity = Gravity.RIGHT|Gravity.BOTTOM;

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

Omar Alnajjar
źródło
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;
CodeFlakes
źródło
@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()
Hitesh Sahu
źródło
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

alin0509
źródło
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

użytkownik2779311
źródło
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. ”

Snow Albert
źródło
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.

Cheng
źródło
i - kursywa))))
Artem
2

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

Michael Wang
źródło
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.

Tara
źródło
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;
    }
Abhishek Garg
źródło
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);
użytkownik3886197
źródło
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);
Faxriddin Abdullayev
źródło
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);
Manthan Patel
źródło
-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
źródło