Layout_gravity programlı olarak nasıl ayarlanır?


334

Sorum basit,

Benim düğmeleri layout_gravity programlı olarak nasıl ayarlanır?

Bunu internette buldum, ama sadece bir Nullpointer istisnası atıyor:

 Button MyButton = new Button(this);

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


    MyLinearLayout.addView(MyButton);

Herhangi bir çözüm?


Ben null olmayan LayoutParams olacak önce üst görünüm görünüm eklemeniz gerektiğine inanıyorum.
Rich Morey

Yanıtlar:


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
}

Gravite değerleri için ve nasıl set yerçekimi onay için Gravity .

Temel olarak, LayoutParamsebeveyne bağlı olarak seçmelisiniz . Olabilir RelativeLayout, LinearLayoutvb ...


1
Bazı nedenlerden ötürü params.gravity = 80 (TOT olmalı, te Docs tarafından) çalışmıyor. Görünümün ve Metnin dibinde biraz yer var. Bu o kadar
alta

51
Sabit değeri dokümantasyondan almak yanlıştır, lütfen Gravity.TOP kullanın
Maragues

35
Bu "yerçekimi" ve o "layout_gravity" istedi?
M. Usman Khan

10
@usman no, bu layout_gravity(bu LayoutParams.gravity) ile ilgili. Bu gravityolurdubutton.setGravity()
Floern

8
Burada yerçekimi ve layout_gravity hakkında çok fazla yanlış bilgi var. Birçok kişi setGravity()plan_gravity olduğunu düşünüyor , ama bu yanlış. Bu cevabın programsal olarak layout_gravity ayarı için doğru olduğunu onaylayabilirim.
Bevor

55

Eski konuları diriltmekten nefret ediyorum ama bu doğru cevaplanmayan bir problem ve dahası bu problemle kendim karşılaştım.

İşte uzun bit, sadece cevapla ilgileniyorsanız lütfen koda kadar aşağı kaydırın:

android: yerçekimi ve android: layout_gravity farklı çalışır. İşte bana yardımcı olan bir makale.

Makalenin özeti: yerçekimi yükseklik / genişlik atandıktan sonra görünümü etkiler. Dolayısıyla, yerçekimi merkezi FILL_PARENT ile yapılan bir görüşü etkilemeyecektir (bunu otomatik kenar boşluğu olarak düşünün). layout_gravity center FILL_PARENT görünümü otomatik olarak etkiler (otomatik altlık olarak düşünün).

Temel olarak, android: layout_gravity programlı olarak erişilemez, sadece android: gravity. OP ve benim durumumda, kabul edilen cevap düğmeyi dikey olarak ortaya koymaz.

Karthi'nin cevabını geliştirmek için:

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

Bağlantı için LinearLayout.LayoutParams.

android: layout_gravity "İlgili yöntem yok" anlamını gösterir, programlı olarak erişilemez. Oysa yerçekimi sınıftaki bir alandır.


Ayrıca, LinearLayout ebeveyninin yönüne bağlı olarak bu yerçekimi otomatik marjlarını (daha iyi bir terim olmaması nedeniyle) eklemek için. Sağlanan makale bağlantısı yardımcı olacaktır.
Uknight

21
MyButton.setGravity(Gravity.RIGHT);

Layout_gravity için "karthi" tarafından verilen cevabı kullanın. Bu yöntem, çocukları görünümün içine yerleştirmek için yerçekimini ayarlar.


37
Sadece gravite değil, gravite_gravity.
Adam Varhegyi

Tamam o zaman layout_gravity'nin setGravity'ye eşit olup olmadığını söyle, o zaman yerçekimini nasıl ayarladım?
Adam Varhegyi


5
Muazzam bir Belge
yayınlamak

bağlantıda setGravity yöntemi arayın .., bir şekilde kesin yönteme yönlendirme çalışmıyor ..
Yashwanth Kumar

17

Programlı olarak bir GridLayout düğmelerinde layout_gravity ayarı ile benzer bir sorun vardı.

Hile, düğme düzeninde yerçekimini ayarlamaktıParama bir ana öğeye (GridLayout) eklendikten SONRA Pramlar , aksi takdirde yerçekimi yoksayılır .

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

Tüm GridLayout için layout_gravity öğesini nasıl değiştirebilirim?
Iqbal

15

layou_gravityVar olan bir görünümü değiştirmek istiyorsanız bunu yapın:

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

LayoutParamsGörünümünüzün içinde bulunduğu Mizanpaj türüne dayalı olarak hakkı kullanmayı unutmayın . Örn:

LinearLayout.LayoutParams

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

birden fazla yerçekimi eklemek için bunu kullanın


9

Bu soru eski ama aynı problemi yaşadım ve böyle çözdüm

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

@Muzikant .. tamam .. ben ilk fark etmedim .. ama şimdi bana açık .. Teşekkürler
Noman

Bu sadece ilk önce ne tür bir düzen olduğunu belirterek işe yarıyor mu? RelativeLayout.LayoutParams gibi ... sadece LayoutParams yerine
ryvianstyron

RelativeLayout.LayoutParams, görünümün yerçekimini ayarlamak için diğer bayrakları kullanır (rightOf, centerInParent, centerVertical). Bu geçici çözüm LinearLayouts çocuklar içindir
noni

6

KOTLIN, FrameLayout'ta boyutu değiştirmeden birden fazla yerçekimi ayarlar:

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

Benim zamanımı kurtardı ... THX
BertKing

4

Böyle bir şey kullanıyorum: (Xamarin ve C # kodu)

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

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

SetGravity textView öğemi mizanpajın ortasına yerleştirir. Yani SetGravity düzen özelliği düzen içeriğine başvurur


4

Bir Görünüm için Yerçekimi ayarlamanız gerekirse aşağıdakileri kullanın

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

Düğme için layout_gravity değerini ayarlamak için layoutparams için gravity alanını

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

bu umudunu dene bu teşekkürler temizler


3

Cevapların geri kalanı doğru, daha fazla açıklama eklemek istiyorum. Layout_gravity, görünümün üst görünümde nasıl konumlandırılacağı ile ilgilidir.

ParentView.addView () ** yöntemi çağrıldıktan sonra yerçekimi ** ayarlanmalıdır. Kodu görebiliriz:

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

Ve boş gösterici sorunu getLayoutParams () 'dan önce addView çağırmıyor olmasıdır.

Ek açıklama zaten "Bu Görünüm bir üst ViewGroup'a veya {@ link # setLayoutParams (android.view.ViewGroup.LayoutParams)} eklenmediğinde bu yöntem null döndürebilir. Bir üst öğeye başarıyla eklendiğinde. ViewGroup, bu yöntem null döndürmemelidir. "


Bu da beni biraz ... addView () çağrıldıktan sonra yerçekimi ayarlamak zorunda olduğu belli değil. Her şeyi yeni görünümde ayarlayıp daha sonra eklemeyi
düşünürdünüz

3

Ebeveynin ortasına bir görünüm koymak isterseniz, aşağıdaki kodla yapabilirsiniz.

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

bu kod bölümü, LinearLayout öğesinin ilk görünüm öğelerini üst öğenin merkezine koymasını sağlar. Bu nedenle, sistemi merkezde görünüm düzenlemek için başlangıç ​​genişliğini ve yüksekliğini dikkate almıyoruz. Kod bölümünü iyi yapıyorum.


i - italic))))
Artem

2

RelativeLayout için bu kodu deneyin, benim için çalışıyor: yourLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);


2

Mükemmel Çalışma !!! Yukarıdaki cevapların hiçbiri benim için işe yaramıyor. Xml dosyasında yerçekimi ve düzen_gravity ayarı farklıdır. Aşağıdaki kodu inceleyin

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

Ayrıca , yerçekimi ve yerleşim_çekimi hakkında net bir açıklama bulabileceğiniz Bu öğeyi işaretleyin.


1

Yukarıdaki cevabın çoğu doğrudur, bu yüzden yardımcı bir yöntem yazılmıştır , böylece doğrudan projenizde kullanabilirsiniz.

layout_gravityprogramlı olarak ayarla

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

Sonunda oluşturduğum özel bir circleview üzerinde arzu ettiğim sonucu elde etmek için LinearLayout.LayoutParams'dan RelativeLayout.LayoutParams'a geçtim.

Ama yerçekimi yerine addRule kullanıyorsunuz

RelativeLayout.LayoutParams mCircleParams = yeni RelativeLayout.LayoutParams (daire yüksekliği, daire yüksekliği);

    mCircleParams.addRule(RelativeLayout.CENTER_IN_PARENT);

0

Bu kodu deneyin

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

veya

    btn.setGravity(Gravity.TOP);

3
OP layout_gravityistemez 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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.