วิธีการรับเค้าโครง Inflater ให้บริบท?


226

ฉันกำลังเขียนการใช้งานแบบกำหนดเองของ ListAdapter

ใน Constructor ของมันฉันใช้ Context, ID ทรัพยากร (เช่น R.id.xxx ซึ่งเป็นตัวแทนของไฟล์เลย์เอาต์) และรายการและแผนที่ (เหล่านี้มีข้อมูล)

ตอนนี้ปัญหาคือฉันจะต้องมี LayoutInflater เพื่อรับวัตถุดูซึ่งอยู่ในไฟล์ XML รูปแบบแยกต่างหาก

ฉันจะถือ LayoutInflater ให้เฉพาะบริบทได้อย่างไร

ตอนนี้เหตุผลที่ฉันคิดว่ามันเป็นไปได้ก็คือมันค่อนข้างคล้ายกับสิ่งที่ถูกส่งผ่านไปยังตัวสร้างของ ArrayAdapter (บริบททรัพยากร textViewResourceId อาร์เรย์ข้อมูล) และฉันคิดว่า ArrayAdapter ยังต้องใช้ LayoutInflater ให้เฉพาะบริบท

แต่จะทำได้อย่างไร?

คำตอบ:


515

คุณสามารถใช้static from()วิธีการจากLayoutInflaterชั้นเรียน :

 LayoutInflater li = LayoutInflater.from(context);

11
ขอบคุณ! ฉันพยายามค้นหา Context.getSomething (). getAnotherThing (). getLayoutInflater ()!
Edwin Lee

นี่เป็นวิธีเดียวที่ใช้ได้สำหรับฉัน ทุก ๆ คนที่ฉันได้ลองทำไปนั้นมีข้อยกเว้น
num1

4
การรับลมเข้าออกในแต่ละครั้งที่จำเป็นต้องใช้มีความหมายว่าคุณคิดว่าเราควรจะช่วยคนที่เป็นโรคลมชักหรือไม่?
AlikElzin-kilaka

BTW ฉันคิดว่าเราควรใช้ LayoutInflater li = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE) ในที่สุด LayoutInflater.from (บริบท) กำลังทำเช่นเดียวกันภายใน
Ankur Chaudhary

3
อันไหนดีกว่า? อันที่270โหวตหรืออันที่25+โหวต
DJphy

53

คุณสามารถใช้รหัสนี้เพื่อรับ LayoutInflater:

LayoutInflater li = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)

40
อะไรคือความแตกต่างระหว่าง LayoutInflater.from (บริบท ctx) และ getSustemService (... ) นี้?
Teo Choong Ping

8
+1 สำหรับคำถามที่ดีในการใช้วิธีการ LayoutInflater.from (บริบท) ยังเรียก context.getSystemService () เพื่อรับผู้ให้บริการ LayoutInflater จาก System Manager ดังนั้นอาจมีความแตกต่างของครอกในสายเรียกซ้อน
NguyenDat

11
LayoutInflater.from (บริบท) ยังส่งข้อผิดพลาดถ้าไม่สามารถเรียกคืน inflater ได้: ที่นี่รหัส: สาธารณะคงที่ LayoutInflater จาก (บริบทบริบท) {LayoutInflater LayoutInflater = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); if (LayoutInflater == null) {โยน AssertionError ใหม่ ("ไม่พบ LayoutInflater"); } กลับ LayoutInflater; }
สวัสดี
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.