ฉันสามารถตั้งค่า“ android: layout_below” ที่ Runtime โดยทางโปรแกรมได้หรือไม่?


คำตอบ:


464

ใช่:

RelativeLayout.LayoutParams params= new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); 
params.addRule(RelativeLayout.BELOW, R.id.below_id);
viewToLayout.setLayoutParams(params);

ขั้นแรกให้โค้ดสร้าง params เลย์เอาต์ใหม่โดยระบุความสูงและความกว้าง addRuleวิธีการเพิ่มเทียบเท่าของ XML android:layout_belowที่ถูกต้อง จากนั้นคุณเพียงแค่เรียกView#setLayoutParamsดูที่คุณต้องการมี params เหล่านั้น


11
ทำไมคำตอบนี้จึงไม่เป็นที่ยอมรับ มันเป็นคำอธิบายที่ดีมาก
Adithya

145

หรือคุณสามารถใช้พารามิเตอร์โครงร่างมุมมองปัจจุบันและแก้ไข:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) viewToLayout.getLayoutParams();
params.addRule(RelativeLayout.BELOW, R.id.below_id);

14
@elelee มันค่อนข้างชัดเจนอีกวิธีหนึ่งในการตอบคำถามซึ่งเป็นเหตุผลว่าทำไมมันมี 11 upvotes
Alex K

8
สิ่งนี้ควรมี upvotes มากกว่าคำตอบอื่น ๆ : เพื่อรักษาพฤติกรรมที่สอดคล้องกันของมุมมองเราควรทำงานกับที่มีอยู่LayoutParamsมากกว่าที่จะสร้างใหม่ ในความเป็นจริงนี้ควรได้รับการยอมรับว่าเป็นคำตอบที่ถูกต้อง
Alex Karshin

10

ในขณะที่คำตอบ @jackofallcode ถูกต้องสามารถเขียนได้ในหนึ่งบรรทัด

((RelativeLayout.LayoutParams) viewToLayout.getLayoutParams()).addRule(RelativeLayout.BELOW, R.id.below_id);

1
สิ่งนี้ไม่อนุญาตให้คุณเปลี่ยนเค้าโครงจริง ๆ เนื่องจากคุณต้องการข้อมูลอ้างอิงLayoutParamsเพื่อตั้งค่าด้วยsetLayoutParams
Stef

@ สเตฟฉันใช้โซลูชันนี้ในโครงการเดียว ในขณะที่โซลูชัน jackofallcode เป็นเพียงสิ่งเดียวที่นี่ฉันทำให้มันง่ายขึ้น แต่ตอนนี้ฉันคิดว่าการทำให้สั้นลงหนึ่งบรรทัดนั้นไม่ดีเพราะถ้ามีข้อยกเว้นเกิดขึ้นมันจะยากกว่าที่จะเข้าใจว่าตัวดำเนินการใดที่ทำให้เกิดขึ้น
CoolMind

1
@CoolMind ฉันไม่ชอบการย่อโค้ดให้เหลือ 1 บรรทัดมันทำให้อ่านยากขึ้น บวกกับการทำในแบบของฉันช่วยให้คุณสามารถทำการเปลี่ยนแปลงเพิ่มเติม :)
jackofallcode

@jackofallcode เห็นด้วยกับคุณ! ขณะนี้ฉันยังเขียนเป็นหลายบรรทัดเพราะเมื่อเกิดข้อผิดพลาดจะเข้าใจได้ง่ายขึ้นในสิ่งที่เกิดข้อผิดพลาดบรรทัด
CoolMind

1

รุ่นKotlinพร้อมฟังก์ชันinfix

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

จากนั้นคุณสามารถเขียน:

view1 below view2

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

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