โทรหา getLayoutInflater () ในสถานที่ที่ไม่ได้อยู่ในกิจกรรม


190

สิ่งที่จะต้องนำเข้าหรือฉันจะเรียกผังภูมิ inflater ในสถานที่อื่นนอกเหนือจากกิจกรรม?

public static void method(Context context){
    //this doesn't work the getLayoutInflater method could not be found
    LayoutInflater inflater = getLayoutInflater();
    // this also doesn't work 
    LayoutInflater inflater = context.getLayoutInflater();
}

ฉันสามารถโทรได้getLayoutInflaterเฉพาะในกิจกรรมนั่นเป็นข้อ จำกัด หรือไม่ จะเกิดอะไรขึ้นถ้าฉันต้องการสร้างกล่องโต้ตอบแบบกำหนดเองและฉันต้องการขยายมุมมองให้มากขึ้นหรือถ้าฉันต้องการให้ข้อความ Toast พร้อมมุมมองที่กำหนดเองที่แสดงจากบริการฉันมีบริบทจากบริการที่ฉันไม่มีกิจกรรมใด ๆ แต่ฉันต้องการแสดงข้อความที่กำหนดเอง

ฉันต้องการคนเติมลมในสถานที่ในรหัสที่ไม่ได้อยู่ในชั้นเรียนกิจกรรม

ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


396

คุณสามารถใช้กิจกรรมนอกสถานที่ - สิ่งที่คุณต้องมีคือContext:

LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );

จากนั้นเพื่อดึงวิดเจ็ตอื่นของคุณคุณขยายเค้าโครง:

View view = inflater.inflate( R.layout.myNewInflatedLayout, null );
Button myButton = (Button) view.findViewById( R.id.myButton );

แก้ไข ณ เดือนกรกฎาคม 2014

คำตอบของ Davide เกี่ยวกับวิธีการทำให้LayoutInflaterถูกต้องจริงยิ่งกว่าของฉัน (ซึ่งยังคงใช้ได้แม้ว่า)


เยี่ยมมาก แต่ตอนนี้ findViewById ใช้งานไม่ได้คุณมีความคิดเห็นเกี่ยวกับสิ่งนั้นหรือไม่ inflater.inflate (R.layout.some_layout, (ViewGroup) findViewById (R.id.parent));
Lukap

nop, เมธอด inflater.inflate () ไม่มี overloaded method ที่มีเพียงพารามิเตอร์หนึ่งอัน แต่ฉันเดาว่าอันถัดไปอาจเป็นโมฆะ
Lukap

@kaspermoerch ทำไมคุณถึงพูดว่าคำตอบของเดวิดถูกต้องกว่านี้?
Rohan Bhatia

1
@RohanBhatia Davides คำตอบไม่จำเป็นต้องทำการคัดเลือกนักแสดงคนไหน หากการเรียกgetSystemServiceใช้ด้วยเหตุผลบางอย่าง (ไม่น่าจะเกิด) จะไม่ส่งคืนออบเจ็กต์ประเภทLayoutInflaterดังนั้นรหัสของฉันจะทำให้เกิดข้อยกเว้นขณะทำงาน
kaspermoerch

ทำงานให้ฉัน ขอบคุณ
CodeFluid

261

หรือ ...

LayoutInflater inflater = LayoutInflater.from(context);

5
ช้ามาก แต่จริงๆแล้วคำตอบที่ดีกว่าคือจากฟังก์ชั่นยังตรวจสอบด้วยว่าคุณได้รับแรงกระตุ้นกลับมาแล้วและเกิดข้อผิดพลาดเป็นอย่างอื่น - ซึ่งจะง่ายกว่ามากในการจัดการกับตัวชี้โมฆะ grepcode.com/file/repository.grepcode.com/java/ext/…
Raanan

38
สรุปแล้วนักว่ายน้ำมาก
Danyal Aytekin

@Davide ข้อความนี้หมายความว่าโซลูชั่นของ kaspermoerch นั้นดีกว่าของคุณหรือไม่? "ไม่เคยใช้โดยตรงใช้ getLayoutInflater () หรือ getSystemService (Class) แทนเพื่อดึงอินสแตนซ์ LayoutInflater มาตรฐานที่เชื่อมต่อกับบริบทปัจจุบันและกำหนดค่าอุปกรณ์ที่คุณใช้อย่างถูกต้อง" developer.android.com/reference/android/view/LayoutInflater
TamásBolvári

@ TamásBolváriเป็นเรื่องง่ายและชัดเจนยิ่งขึ้นในความเป็นจริงการใช้งานภายในเหมือนกับการเขียนของ Kaspermoerch
Davide

11

หรือ

View.inflate(context, layout, parent)


ไม่เป็นไร ; อย่างไรก็ตามด้วยวิธีนี้ฉันไม่สามารถให้บูลีน "attachToRoot" ได้
DenisGL

มันขึ้นอยู่กับข้อกำหนดถ้าคุณไม่ต้องการ attachToRoot นี่เป็นวิธีการช่วยเหลือที่สะดวกหรือผ่าน getRootView () เป็นพาเรนต์ของเมธอด
Prakash Nadar

9

ใช้วัตถุบริบทคุณสามารถรับ LayoutInflater จากรหัสต่อไปนี้

LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);


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