Bagaimana cara mengatur layout_gravity secara terprogram?


334

Pertanyaan saya sederhana,

Bagaimana cara mengatur tombol lay_gravity saya secara terprogram?

Saya menemukan ini di internet, tetapi itu hanya membuat saya pengecualian Nullpointer:

 Button MyButton = new Button(this);

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


    MyLinearLayout.addView(MyButton);

Ada solusi?


Saya percaya Anda perlu menambahkan tampilan ke induknya sebelum ia akan memiliki LayoutParams yang bukan nol.
Rich Morey

Jawaban:


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
}

Untuk nilai-nilai gravitasi dan cara mengatur gravitasi, periksa Gravity .

Pada dasarnya, Anda harus memilih LayoutParamstergantung pada orang tua. Bisa jadi RelativeLayout, LinearLayoutdll ...


1
Untuk beberapa alasan params.gravity = 80 (Seharusnya BOTTOM, oleh te Docs) tidak berfungsi. Saya mendapat beberapa ruang antara bagian bawah View dan Text. Tidak begitu selaras ...
Adam Varhegyi

51
Mengambil nilai konstan dari dokumentasi itu salah, silakan gunakan Gravity.TOP
Maragues

36
ini "gravitasi" dan dia meminta "layout_gravity" ??
M. Usman Khan

11
@ Usman tidak, ini tentang layout_gravity(yaitu LayoutParams.gravity). Yang gravityakan menjadibutton.setGravity()
Floern

9
Ada banyak informasi yang salah tentang gravitasi dan layout_gravity di sini di SO. Banyak ppl berpikir itu setGravity()adalah layout_gravity, tetapi ini salah. Saya dapat menyetujui bahwa jawaban ini benar untuk pengaturan layout_gravity secara terprogram.
Bevor

55

Saya benci untuk menghidupkan kembali utas lama tapi ini adalah masalah yang tidak dijawab dengan benar dan terlebih lagi saya telah mengalami masalah ini sendiri.

Inilah sedikit panjangnya, jika Anda hanya tertarik pada jawabannya, silakan gulir sepenuhnya ke kode:

android: gravity dan android: layout_gravity bekerja secara berbeda. Inilah artikel yang saya baca yang membantu saya.

GIST artikel: gravitasi mempengaruhi tampilan setelah tinggi / lebar ditetapkan. Jadi pusat gravitasi tidak akan memengaruhi tampilan yang dilakukan FILL_PARENT (anggap saja sebagai margin otomatis). layout_gravity center AKAN memengaruhi tampilan yang FILL_PARENT (anggap saja sebagai pad otomatis).

Pada dasarnya, android: layout_gravity TIDAK BISA mengakses program, hanya android: gravitasi. Dalam kasus OP dan kasus saya, jawaban yang diterima tidak menempatkan tombol di tengah secara vertikal.

Untuk meningkatkan jawaban Karthi:

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

Tautan ke LinearLayout.LayoutParams.

android: layout_gravity menunjukkan "Tidak ada metode terkait" yang berarti tidak dapat diakses secara programatik. Sedangkan gravitasi adalah bidang di kelas.


Juga untuk menambah margin otomatis gravitasi tersebut (karena tidak ada istilah yang lebih baik) berdasarkan orientasi orangtua LinearLayout. Tautan artikel yang disediakan akan membantu.
Uknight

21
MyButton.setGravity(Gravity.RIGHT);

Untuk layout_gravity gunakan jawaban yang dinyatakan oleh "karthi". Metode ini mengatur gravitasi untuk menempatkan anak-anak di dalam tampilan.


37
Itu hanya gravitasi, bukan layout_gravity.
Adam Varhegyi

Oke kalau begitu beri tahu saya jika layout_gravity sama dengan setGravity, lalu bagaimana saya mengatur gravitasi?
Adam Varhegyi


5
Memposting Dokumen yang luar biasa besar bukan solusi maaf,
Adam Varhegyi

cari metode setGravity di tautan .., entah bagaimana pengalihan ke metode yang tepat tidak berfungsi ..
Yashwanth Kumar

17

Saya memiliki masalah yang sama dengan pengaturan secara layout_gravity pada tombol di GridLayout.

Caranya adalah dengan mengatur gravitasi pada tata letak tombol. SETELAH tombol ditambahkan ke induk (GridLayout), jika tidak gravitasi akan diabaikan .

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

Bagaimana cara mengubah layout_gravity untuk seluruh GridLayout?
Iqbal

15

Jika Anda ingin mengubah tampilan layou_gravityyang ada lakukan ini:

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

Ingatlah untuk menggunakan hak LayoutParamsberdasarkan tipe Layout tampilan Anda. Contoh:

LinearLayout.LayoutParams

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

gunakan ini untuk menambahkan lebih dari satu gravitasi


9

Pertanyaan ini sudah lama tetapi saya hanya memiliki masalah yang sama dan menyelesaikannya seperti ini

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

@Muzikant .. ok .. saya tidak memperhatikan dulu .. tapi sekarang jelas bagi saya .. Terima kasih
Noman

Apakah ini hanya berfungsi dengan menentukan jenis tata letak apa yang lebih dulu? Suka RelativeLayout.LayoutParams ... bukan hanya LayoutParams
ryvianstyron

RelativeLayout.LayoutParams menggunakan flag lain untuk mengatur gravitasi tampilan (rightOf, centerInParent, centerVertical). Solusi ini untuk anak
noni

6

Pengaturan KOTLIN lebih dari satu gravitasi di FrameLayout tanpa mengubah ukuran:

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

Ini menghemat waktu saya ... THX
BertKing

4

Saya menggunakan sesuatu seperti itu: (kode Xamarin dan C #)

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

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

SetGravity menempatkan textView saya di tengah tata letak. Jadi properti tata letak SetGravity merujuk ke konten tata letak


4

Jika Anda perlu mengatur Gravity for a View gunakan yang berikut ini

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

Untuk mengatur layout_gravity untuk Tombol gunakan bidang gravitasi untuk tata letakparam sebagai

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

coba ini harapan ini jelas terima kasih


3

Jawabannya benar, saya ingin menambahkan lebih banyak penjelasan. Layout_gravity adalah tentang bagaimana memposisikan tampilan dalam tampilan induk.

Anda harus mengatur gravitasi ** setelah metode parentView.addView () ** dipanggil. Kita dapat melihat kodenya:

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

Dan masalah dari null pointer adalah karena ia tidak memanggil addView sebelum getLayoutParams ().

Anotasi itu sudah mengatakan "Metode ini dapat mengembalikan nol jika Tampilan ini tidak dilampirkan ke induk ViewGroup atau {@ link # setLayoutParams (android.view.ViewGroup.LayoutParams)} tidak dipanggil dengan sukses. Ketika sebuah Tampilan dilampirkan pada orangtua ViewGroup, metode ini tidak boleh mengembalikan null. "


Ini menggigit saya juga ... tidak jelas Anda harus mengatur gravitasi setelah addView () dipanggil. Anda akan berpikir Anda akan mengatur semuanya pada tampilan baru dan kemudian menambahkannya jadi ini tidak intuitif :-P
kenyee

3

Jika Anda ingin meletakkan tampilan di tengah orang tua, Anda dapat melakukannya dengan kode berikut ..

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

bagian kode ini membuat LinearLayout menempatkan elemen tampilan pertama di pusat induk. Jadi, kami sistem tidak mempertimbangkan lebar awal dan tinggi untuk mengatur tampilan di tengah. Saya melakukan bagian kode dengan baik.


i - italic))))
Artem

2

ke RelativeLayout, coba kode ini, itu berfungsi untuk saya: yourLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);


2

Bekerja dengan sempurna !!! Tidak ada jawaban di atas yang berfungsi untuk saya. Dalam pengaturan file Xml gravitasi dan pengaturan layout_gravity berbeda. Lihatlah kode di bawah ini

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

Periksa juga ini, di mana Anda dapat menemukan penjelasan yang jelas tentang gravitasi dan layout_gravity.


1

Sebagian besar jawaban di atas benar, jadi tuliskan metode pembantu, sehingga Anda dapat menggunakannya langsung di proyek Anda.

atur secara layout_gravityterprogram

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

Saya beralih dari LinearLayout.LayoutParams ke RelativeLayout.LayoutParams untuk akhirnya mendapatkan hasil yang saya inginkan pada circleview kustom yang saya buat.

Tetapi alih-alih gravitasi Anda menggunakan addRule

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

    mCircleParams.addRule(RelativeLayout.CENTER_IN_PARENT);

0

Coba kode ini

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

atau

    btn.setGravity(Gravity.TOP);

3
OP meminta layout_gravitytidak 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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.