Android RelativeLayout secara terprogram mengatur “centerInParent”

139

Saya memiliki RelativeLayout seperti ini:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dip">

    <Button
        android:id="@+id/negativeButton"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:textSize="20dip"
        android:textColor="#ffffff"
        android:layout_alignParentLeft="true"
        android:background="@drawable/black_menu_button"
        android:layout_marginLeft="5dip"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"/> 

    <Button
        android:id="@+id/positiveButton"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:textSize="20dip"
        android:textColor="#ffffff"
        android:layout_alignParentRight="true"
        android:background="@drawable/blue_menu_button"
        android:layout_marginRight="5dip"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"/>
</RelativeLayout>

Saya ingin dapat mengatur secara program untuk positiveButtonefek yang sama seperti:

android:layout_centerInParent="true"

Bagaimana saya bisa membuat ini secara terprogram?

Alin
sumber

Jawaban:

401

Benar-benar belum diuji, tetapi ini akan berhasil:

View positiveButton = findViewById(R.id.positiveButton);
RelativeLayout.LayoutParams layoutParams = 
    (RelativeLayout.LayoutParams)positiveButton.getLayoutParams();
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
positiveButton.setLayoutParams(layoutParams);

tambahkan ke android:configChanges="orientation|screenSize"dalam aktivitas Anda di manifes Anda

Ruben Scratton
sumber
5
Itu berhasil, tetapi hanya setelah saya mengaktifkan layoutParams.addRule (RelativeLayout.ALIGN_PARENT_RIGHT, 0); sebelum pusat dalam aturan induk. Terima kasih.
Alin
9
Saya ingin menambahkan bahwa ini juga berfungsi untuk saya, tetapi saya harus mengubah layoutParams.addRule (RelativeLayout.CENTER_IN_PARENT, 0); ke layoutParams.addRule (RelativeLayout.CENTER_IN_PARENT, -1); dalam situasi saya. Aplikasi Anda mungkin memerlukan nilai berbeda di bidang "jangkar".
Ben Mc
7
nilai bidang jangkar dapat berupa apa pun selain 0 untuk menandakan benar saat ini. Sumber memiliki perbandingan seperti di if (rules[CENTER_IN_PARENT] != 0 || rules[CENTER_HORIZONTAL] != 0) {mana 0secara efektif mengevaluasifalse
Dori
2
Sebagai pertanyaan tindak lanjut, adakah yang tahu jika kode dalam jawaban ini dapat digunakan dalam animasi? Seperti misalnya bernyawa gambar dari seorang kerabat kiri diimbangi ke posisi berpusat dll
Jonny
27
Anda cukup menggunakan layoutParams.addRule (RelativeLayout.CENTER_IN_PARENT), tidak perlu untuk parameter kedua, karena Anda dapat memeriksa dokumentasi
tarmelop
14

Hanya untuk menambahkan rasa lain dari respons Ruben, saya menggunakannya seperti ini untuk menambah atau menghapus aturan ini sesuai dengan ketentuan:

    RelativeLayout.LayoutParams layoutParams =
            (RelativeLayout.LayoutParams) holder.txtGuestName.getLayoutParams();

    if (SOMETHING_THAT_WOULD_LIKE_YOU_TO_CHECK) {
        // if true center text:
        layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
        holder.txtGuestName.setLayoutParams(layoutParams);
    } else {
        // if false remove center:
        layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, 0);
        holder.txtGuestName.setLayoutParams(layoutParams);
    }
Juan Saravia
sumber
3
Cara terbaik untuk menghapus aturan adalah: layoutParams.removeRule (RelativeLayout. CENTER_IN_PARENT);
Zahid Rasheed
5

Saya telah melakukan untuk

1. centerInParent

2. centerHorizontal

3. centerVertical

dengan benar dan salah .

private void addOrRemoveProperty(View view, int property, boolean flag){
    RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
    if(flag){
        layoutParams.addRule(property);
    }else {
        layoutParams.removeRule(property);
    }
    view.setLayoutParams(layoutParams);
}

Cara memanggil metode:

centerInParent - true

addOrRemoveProperty(mView, RelativeLayout.CENTER_IN_PARENT, true);

centerInParent - false

addOrRemoveProperty(mView, RelativeLayout.CENTER_IN_PARENT, false);

centerHorizontal - true

addOrRemoveProperty(mView, RelativeLayout.CENTER_HORIZONTAL, true);

centerHorizontal - false

addOrRemoveProperty(mView, RelativeLayout.CENTER_HORIZONTAL, false);

centerVertical - true

addOrRemoveProperty(mView, RelativeLayout.CENTER_VERTICAL, true);

centerVertical - false

addOrRemoveProperty(mView, RelativeLayout.CENTER_VERTICAL, false);

Semoga ini bisa membantu Anda.

Hiren Patel
sumber