วิธีการตั้งค่าคุณลักษณะ layout_align_parent_right โดยทางโปรแกรมของปุ่มในเค้าโครงแบบสัมพันธ์?


285

ฉันมีเค้าโครงแบบสัมพัทธ์ซึ่งฉันกำลังสร้างโดยทางโปรแกรม:

 RelativeLayout layout = new RelativeLayout( this );
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,
            LayoutParams.WRAP_CONTENT);

ตอนนี้ฉันมีสองปุ่มที่ฉันต้องการเพิ่มในเค้าโครงที่สัมพันธ์กันนี้ แต่ปัญหาคือปุ่มทั้งสองถูกแสดงที่ด้านซ้ายของ RelatiiveLayout ซ้อนทับกัน

buttonContainer.addView(btn1);
buttonContainer.addView(btn2);

ตอนนี้ฉันอยากรู้ว่าฉันจะตั้งค่าandroid:layout_alignParentRight="true"หรือ android:layout_toLeftOf="@id/btn"คุณลักษณะของปุ่มแบบเป็นโปรแกรมได้อย่างไรใน xml?

คำตอบ:


638

คุณสามารถเข้าถึงใด ๆจากรหัสที่ใช้LayoutParams View.getLayoutParamsคุณเพียงแค่ต้องระวังสิ่งที่LayoutParamsคุณเข้าถึง นี่คือความสำเร็จตามปกติโดยการตรวจสอบการบรรจุViewGroupถ้ามีLayoutParamsลูกภายในแล้วนั่นคือสิ่งที่คุณควรใช้ RelativeLayout.LayoutParamsในกรณีของคุณมันเป็น คุณจะใช้RelativeLayout.LayoutParams#addRule(int verb)และRelativeLayout.LayoutParams#addRule(int verb, int anchor)

คุณสามารถเข้าถึงได้โดยใช้รหัส:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)button.getLayoutParams();
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
params.addRule(RelativeLayout.LEFT_OF, R.id.id_to_be_left_of);

button.setLayoutParams(params); //causes layout update

1
ถ้าสมอไม่มี ID ล่ะ params.addRule (RelativeLayout.LEFT_OF, R.id.id_to_be_left_of); TextView tvUserName = TextView ใหม่ (การกระทำ);
Saint Robson

18
วิธีเพิ่ม ID?
user2161301

1
เกิดอะไรขึ้นถ้าbuttonอยู่ในRecycleView? เป็นปัญหาหรือไม่ที่การเพิ่มกฎเดียวกันหรือตรงข้ามกับวิดเจ็ตเดียวกัน?
Janos

มันทำงานเพียงครั้งเดียวถ้าฉันเปลี่ยนการจัดตำแหน่งมันไม่ได้รับการปรับปรุง ฉันขอทราบได้ไหมว่าปัญหาคืออะไร ??
Shshank Bhong

ฉันลองใช้มันแล้วแต่มันจะเป็นสีแดงในรหัสของฉันaddRuleใช่ไหม?

12
  1. คุณจำเป็นต้องสร้างและรหัสสำหรับปุ่มที่คุณต้องการอ้างอิง: btn1.setId(1);
  2. คุณสามารถใช้ตัวแปร params เพื่อเพิ่มพารามิเตอร์ในเลย์เอาต์ของคุณฉันคิดว่าวิธีการคือaddRule()ตรวจสอบเอกสาร java android สำหรับ LayoutParamsวัตถุนี้

ฉันขอขอบคุณรหัสใด ๆ ฉันไม่พบวิธีการใด ๆ ในปุ่ม
Fahad Ali

การตั้งค่า id ไม่ได้ผลเนื่องจากคาดหวังว่าจะมี id ทรัพยากรจริงแทนที่จะเป็นตัวเลขเนื่องจาก setId กำลังถูกบันทึกย่อด้วย @IdRes
เควินตัน

เป็นเรื่องใหม่ในอดีตคุณสามารถใช้หมายเลขทรัพยากรจากเลย์เอาต์และใช้เป็นฐานสำหรับรหัสทรัพยากรที่จะไม่ชนกันฉันเดาว่า Google ต้องบล็อก /
codeScriber

6

สำหรับการเพิ่มRelativeLayoutคุณสมบัติที่มีค่าเป็นจริงหรือเท็จใช้0เป็นเท็จและRelativeLayout.TRUEเป็นจริง:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) button.getLayoutParams()
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE)

ไม่สำคัญว่าจะมีการเพิ่มแอตทริบิวต์หรือไม่คุณยังคงใช้addRule(verb, subject)เพื่อเปิด / ปิดใช้งาน อย่างไรก็ตามหลัง API 17 คุณสามารถใช้ซึ่งเป็นเพียงทางลัดสำหรับremoveRule(verb)addRule(verb, 0)


0

รุ่น Kotlin:

ใช้ส่วนขยายเหล่านี้ด้วยฟังก์ชั่นมัดที่ทำให้การโทรในภายหลังง่ายขึ้น

infix fun View.below(view: View) {
    (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.BELOW, view.id)
}

infix fun View.leftOf(view: View) {
    (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.LEFT_OF, view.id)
}

infix fun View.alightParentRightIs(aligned: Boolean) {
    val layoutParams = this.layoutParams as? RelativeLayout.LayoutParams
    if (aligned) {
        (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
    } else {
        (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0)
    }
    this.layoutParams = layoutParams
}

จากนั้นใช้เป็นฟังก์ชั่น infix เรียก:

view1 below view2
view1 leftOf view2
view1 alightParentRightIs true

หรือคุณสามารถใช้มันเป็นฟังก์ชั่นปกติ:

view1.below(view2)
view1.leftOf(view2)
view1.alightParentRightIs(true)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.