Android RelativeLayout lập trình Set trung tâmInInararet


139

tôi có một RelativeLayout như thế này:

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

Tôi muốn có thể thiết lập theo chương trình cho positiveButtonhiệu ứng tương tự như:

android:layout_centerInParent="true"

Làm thế nào tôi có thể làm điều này theo chương trình?

Câu trả lời:


401

Hoàn toàn chưa được kiểm tra, nhưng điều này sẽ làm việc:

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

thêm android:configChanges="orientation|screenSize"vào bên trong hoạt động của bạn trong bảng kê khai của bạn


5
Điều đó đã làm việc, nhưng chỉ sau khi tôi xác nhận layoutParams.addRule (RelativeLayout.ALIGN_PARENT_RIGHT, 0); trước trung tâm trong quy tắc cha mẹ. Cảm ơn bạn.
Alin

9
Tôi muốn thêm rằng điều này cũng có hiệu quả với tôi, nhưng tôi đã phải thay đổi layoutParams.addRule (RelativeLayout.CENTER_IN_PARENT, 0); để layoutParams.addRule (RelativeLayout.CENTER_IN_PARENT, -1); trong hoàn cảnh của tôi Ứng dụng của bạn có thể yêu cầu một giá trị khác trong trường "neo".
Ben Mc

7
giá trị trường neo có thể là bất cứ thứ gì trừ 0 để biểu thị đúng hiện tại. Nguồn có các so sánh như if (rules[CENTER_IN_PARENT] != 0 || rules[CENTER_HORIZONTAL] != 0) {nơi 0đánh giá hiệu quảfalse
Dori

2
Như một câu hỏi tiếp theo, có ai biết liệu đoạn mã trong câu trả lời này có thể được sử dụng trong hình ảnh động không? Ví dụ như làm động một hình ảnh từ phần bù tương đối sang vị trí trung tâm, v.v.
Jonny

27
bạn chỉ có thể sử dụng layoutParams.addRule (RelativeLayout.CENTER_IN_PARENT), không cần tham số thứ hai, vì bạn có thể kiểm tra tài liệu
tarmelop

14

Chỉ cần thêm một hương vị khác từ phản hồi Reuben, tôi sử dụng nó như thế này để thêm hoặc loại bỏ quy tắc này theo một điều kiện:

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

3
Cách tốt nhất để xóa quy tắc sẽ là: layoutParams.removeRule (RelativeLayout. CENTER_IN_PARENT);
Zahid Rasheed

5

Tôi đã làm cho

1. centreInParent

2. trung tâm ngang

3. trung tâm dọc

với đúngsai .

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

Cách gọi phương thức:

centreInParent - đúng

addOrRemoveProperty(mView, RelativeLayout.CENTER_IN_PARENT, true);

centreInParent - sai

addOrRemoveProperty(mView, RelativeLayout.CENTER_IN_PARENT, false);

trung tâm ngang - đúng

addOrRemoveProperty(mView, RelativeLayout.CENTER_HORIZONTAL, true);

trung tâm ngang - sai

addOrRemoveProperty(mView, RelativeLayout.CENTER_HORIZONTAL, false);

trung tâm dọc - đúng

addOrRemoveProperty(mView, RelativeLayout.CENTER_VERTICAL, true);

centre dọc - sai

addOrRemoveProperty(mView, RelativeLayout.CENTER_VERTICAL, false);

Hy vọng điều này sẽ giúp bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.