แนวคิดของการตั้งค่าข้อ จำกัด ทางโปรแกรมอาจเป็นเรื่องน่าเบื่อ วิธีการแก้ปัญหาด้านล่างนี้จะใช้ได้กับเลย์เอาต์ใด ๆ ไม่ว่าจะเป็นข้อ จำกัด เชิงเส้น ฯลฯ วิธีที่ดีที่สุดคือการตั้งค่าตัวยึดตำแหน่งเช่น FrameLayout ที่มีข้อ จำกัด ที่เหมาะสม (หรือวางในรูปแบบอื่น ๆ เช่นเชิงเส้น เพื่อที่จะมี.
สิ่งที่คุณต้องทำคือขยายมุมมองโดยทางโปรแกรมและเป็นลูกไปยัง FrameLayout โดยใช้addChild()วิธีการ จากนั้นในระหว่างรันไทม์มุมมองของคุณจะสูงเกินจริงและวางในตำแหน่งที่เหมาะสม ต่อข้อเสนอแนะ Android ของคุณควรเพิ่มเพียงหนึ่ง childView เพื่อ FrameLayout [ลิงค์]
นี่คือลักษณะของรหัสของคุณหากคุณต้องการสร้าง TextView โดยทางโปรแกรมในตำแหน่งที่ต้องการ:
ขั้นตอนที่ 1:
ในเลย์เอาต์ของคุณซึ่งจะมีมุมมองที่สูงเกินจริงให้วาง FrameLayout ในตำแหน่งที่ถูกต้องแล้วตั้งรหัสให้พูดว่า "คอนเทนเนอร์"
ขั้นตอนที่ 2
สร้างเลย์เอาต์ที่มีองค์ประกอบรูทเป็นมุมมองที่คุณต้องการขยายระหว่างรันไทม์ให้เรียกไฟล์เลย์เอาต์เป็น "textview.xml":
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
</TextView>
BTW ตั้งค่าเลย์เอาต์เค้าโครงของ frameLayout ของคุณเป็น wrap_content เสมอเลย์เอาต์ของเฟรมจะใหญ่พอ ๆ กับพาเรนต์เช่นกิจกรรมเช่นหน้าจอโทรศัพท์
android:layout_width="wrap_content"
android:layout_height="wrap_content"
หากไม่ได้ตั้งค่าเนื่องจากมุมมองลูกของเฟรมโดยค่าเริ่มต้นจะไปที่ด้านบนซ้ายของเลย์เอาต์เฟรมดังนั้นมุมมองของคุณจะบินไปด้านบนซ้ายของหน้าจอ
ขั้นตอนที่ 3
ในวิธีการสร้างของคุณให้ทำสิ่งนี้:
FrameLayout frameLayout = findViewById(R.id.container);
TextView textView = (TextView) View.inflate(this, R.layout.textview, null);
frameLayout.addView(textView);
(โปรดทราบว่าการตั้งค่าพารามิเตอร์สุดท้ายของfindViewByIdถึงnullและเพิ่มมุมมองโดยเรียกaddView()ใช้มุมมองคอนเทนเนอร์ (frameLayout) เหมือนกับการแนบมุมมองที่สูงเกินจริงโดยส่งผ่านtrueพารามิเตอร์ที่ 3 ของfindViewById()ดูเพิ่มเติมได้ที่นี่ )