Gọi để getLayoutInflater () ở những nơi không hoạt động


189

Những gì cần phải được nhập hoặc làm thế nào tôi có thể gọi là giao diện bố trí ở những nơi khác ngoài hoạt động?

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();
}

Tôi chỉ có thể gọi getLayoutInflatertrong hoạt động, đó có phải là một hạn chế? Điều gì xảy ra nếu tôi muốn tạo hộp thoại tùy chỉnh và tôi muốn tăng cường xem cho nó hoặc nếu tôi muốn có tin nhắn Toast với chế độ xem tùy chỉnh được hiển thị từ một dịch vụ, tôi chỉ có ngữ cảnh từ dịch vụ mà tôi không có hoạt động nào nhưng tôi muốn hiển thị thông điệp tùy chỉnh.

Tôi cần lạm phát ở những nơi trong mã không thuộc lớp hoạt động.

Tôi có thể làm cái này như thế nào ?

Câu trả lời:


396

Bạn có thể sử dụng hoạt động bên ngoài này - tất cả những gì bạn cần là cung cấp Context:

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

Sau đó, để lấy các vật dụng khác nhau của bạn, bạn làm tăng bố cục:

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

EDIT kể từ tháng 7 năm 2014

Câu trả lời của Davide về cách lấy cái LayoutInflaternày thực sự đúng hơn của tôi (mặc dù vẫn còn hiệu lực).


Tuyệt vời, nhưng bây giờ findViewById không hoạt động, bạn có ý tưởng nào về điều đó không? Inflater.inflate (R.layout.some_layout, (Viewgroup) findViewById (R.id.parent));
Lukap

nop, phương thức Inflater.inflate () không có phương thức bị quá tải chỉ với một int param, nhưng tôi đoán rằng phương thức tiếp theo có thể là null.
Lukap

@kaspermoerch tại sao bạn nói câu trả lời của David lại đúng hơn?
Rohan Bhatia

1
@RohanBhatia Davides trả lời không yêu cầu đúc mà tôi làm. Nếu lệnh gọi getSystemServicecho một số lý do (không thể) không trả về một đối tượng loại LayoutInflaterthì mã của tôi sẽ gây ra ngoại lệ thời gian chạy.
kaspermoerch

Đã làm cho tôi. Cảm ơn
CodeFluid

260

Hoặc là ...

LayoutInflater inflater = LayoutInflater.from(context);

5
Rất muộn, nhưng thực sự là một câu trả lời tốt hơn vì hàm from cũng kiểm tra với xác nhận rằng bạn thực sự lấy lại được một biến trở và ném một lỗi khác - điều này sẽ dễ dàng hơn để xử lý sau đó một đoạn trích con trỏ null ở đâu đó trong mã. grepcode.com/file/reposective.grepcode.com/java/ext/iêu
Raanan

38
Rất ngắn gọn, nhiều thổi phồng
Danyal Aytekin

@Davide Câu nói này có nghĩa là giải pháp của kaspermoerch tốt hơn của bạn? "Nó không bao giờ được sử dụng trực tiếp. Thay vào đó, hãy sử dụng getLayoutInflater () hoặc getSystemService (Class) để truy xuất một cá thể LayoutInflater tiêu chuẩn đã được nối với bối cảnh hiện tại và được định cấu hình chính xác cho thiết bị bạn đang chạy." developer.android.com/reference/android/view/LayoutInflater
Tamás Bolvári

@ TamásBolvári Chỉ dễ dàng và rõ ràng hơn, trên thực tế việc thực hiện nội bộ giống như Kaspermoerch viết.
Davide

11

hoặc là

View.inflate(context, layout, parent)


Tốt rồi ; tuy nhiên, với phương pháp này, tôi không thể cung cấp boolean "AttachToRoot"
DenisGL 20/03/2016

Nó dựa trên yêu cầu, nếu bạn không cần Đính kèm thì đây là một phương thức trợ giúp thuận tiện hoặc truyền getRootView () làm cha mẹ cho phương thức.
Prakash Nadar

9

Sử dụng đối tượng ngữ cảnh, bạn có thể nhận được LayoutInflater từ đoạn mã sau

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

1
LayoutInflater.from(context).inflate(R.layout.row_payment_gateway_item, null);

1
Bạn được khuyến khích cung cấp một số văn bản giải thích cùng với mã của bạn.
HansHirse

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

Sử dụng cái này thay thế!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.