2011-10-18 21 views
141

Điều gì cần phải được nhập hoặc làm cách nào tôi có thể gọi bố cục phát biểu ở những nơi khác ngoài hoạt động?Gọi đến getLayoutInflater() ở những nơi không 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 có thể gọi getLayoutInflater chỉ trong hoạt động, đó có phải là hạn chế không? Nếu tôi muốn tạo hộp thoại tùy chỉnh và tôi muốn tăng lượt xem cho nó hoặc nếu tôi muốn có thông báo Bánh mì nướng với chế độ xem tùy chỉnh được hiển thị từ dịch vụ, tôi chỉ có ngữ cảnh từ dịch vụ mà tôi không có bất kỳ hoạt động nào nhưng tôi muốn hiển thị thông báo tùy chỉnh.

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

Tôi làm cách nào để thực hiện việc này?

Trả lời

327

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

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

Sau đó, để lấy các vật dụng khác nhau, bạn thổi phồng một cách bố trí:

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

CHỈNH SỬA kể từ tháng 7 năm 2014

answer của Davide về cách để có được LayoutInflater thực sự là chính xác hơn so với tôi (mà vẫn còn hợp lệ mặc dù).

+0

Tuyệt vời, Nhưng bây giờ findViewById không làm việc, bạn có ý tưởng gì về điều đó không? inflater.inflate (R.layout.some_layout, (ViewGroup) findViewById (R.id.parent)); – Lukap

+0

Tôi đã chỉnh sửa câu trả lời cho phù hợp với câu hỏi của bạn. – kaspermoerch

+0

nop, phương thức inflater.inflate() doen't có phương thức quá tải chỉ với một tham số int, nhưng tôi đoán phương thức tiếp theo có thể là null. – Lukap

9

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

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

Hoặc ...

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ì chức năng từ cũng kiểm tra với khẳng định rằng bạn thực sự có được một inflater trở lại và ném một lỗi khác - đó sẽ được dễ dàng hơn nhiều để đối phó với sau đó một con trỏ null excpetion một nơi nào đó trong mã. http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/view/LayoutInflater.java#LayoutInflater.from%28android.content. Bối cảnh% 29 – Raanan

+32

Vì vậy, ngắn gọn, nhiều inflater –

+0

WOW ... U đã cho tôi ra khỏi này .... Thz – Zugor

8

hoặc

View.inflate(context, layout, parent)

+0

Đó là tốt; tuy nhiên, với phương pháp này, tôi không thể cung cấp boolean "attachToRoot" – DenisGL

+0

Nó dựa trên yêu cầu, nếu bạn không cần attachToRoot thì đây là một phương thức trợ giúp thuận tiện hoặc chuyển getRootView() làm cha mẹ cho phương thức. –

Các vấn đề liên quan