Layoutinflater là gì

  -  

Mình chỉ tất cả thói quen là đoạn Clip để chia sẻ kiến thức và kỹ năng lập trình sẵn như tự nhiên lại mong viết nhằm yên cầu yêu cầu bản thân sẽ demo viết 1 loạt bài để chia sẻ gọi biết của bản thân mình về lập trình sẵn Android. Hy vọng các bạn cỗ vũ cùng trong nội dung bài viết này mình muốn chia sẻ cùng với chúng ta về LayoutInflater.

Bạn đang xem: Layoutinflater là gì

Định nghĩa:

LayoutInflater là một component giúp cho bạn chuyển layout file(Xml) thành View(Java code) vào Android. quý khách thường xuyên thực hiện nó trong thủ tục onCreateView của fragment hoặc cách thức getView Khi custom adapter.

Cách tạo ra đối tượng người dùng LayoutInflater

Chúng ta bao gồm 2 phương pháp để tạo ra đối tượng LayoutInflater:

1.LayoutInflater là một trong những System Service của Android và bí quyết sử dụng của nó y như những System Service khác như khi bạn áp dụng WINDOW_SERVICE, ALARM_SERVICE giỏi LOCATION_SERVICE.

LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);Đây là phương pháp được khuyên cần sử dụng nhưng lại nó khá dài mẫu với tôi vô cùng ít khi thực hiện cách này.2. Sử dụng static method của LayoutInflater:

LayoutInflater layoutInflater = LayoutInflater.from(context);Đây là biện pháp tôi hay sử dụng độc nhất vì chưng nó nlắp gọn ^_^

Phương thức Inflate

Công câu hỏi của LayoutInflater là phát âm xml layout file cùng chuyển đổi những nằm trong tính của nó thành 1 View trong Java code. Sau khi bao gồm đối tượng người dùng LayoutInflater, ta hoàn toàn có thể dùng cách tiến hành inflate nhằm biến đổi 1 xml layout file thành 1 View trong java. Ta tất cả 2 cách tiến hành inflate cùng với con số tsay đắm số khác nhau:

1. View view = layoutInflater.inflate(int resource, ViewGroup parent)2. View view = layoutInflater.inflate(int resource, ViewGroup parent, boolean attachToRoot)Các bạn sẽ thắc mắc các tyêu thích số của inflater có ý nghĩa sâu sắc gì? 2 Phương thức inflate trên chỉ khác nhau tđắm say số attachToRoot vậy attachToRoot là gì? Cùng tìm hiểu thông qua một số ví dụ nhé.trước hết họ khám phá 3 ttê mê số của nó là gì vẫn nhé:Nhỏng khái niệm thì nhiệm vụ của LayoutInflater là biến đổi xml layout tệp tin thành đối tượng View vào java code, vậy thì:

Tmê mẩn số đầu tiên là: int resource, nó đó là xml layout tệp tin nhưng mà chúng ta muốn biến hóa thành View.Tđắm đuối số trang bị nhì là: ViewGroup parent, nó là ViewGroup vị trí mà xml layout file(tđắm đuối số lắp thêm nhất) rất có thể được nhúng vào, LayoutInflater sẽ biến đổi xml layout file thành View với sử dụng những nằm trong tính phù hợp với ViewGroup parrent.Tham số sản phẩm công nghệ bố là: attachToRoot, Khi mà attachToRoot=true thì ngay sau thời điểm quy trình chuyển đổi xml file(resource) thành View kết thúc thì nó vẫn nhúng View kia vào ViewGroup parent (RIGHT NOW) , khi attachToRoot = false thì nó chỉ thay đổi xml file(resource) thành View vào java nhưng mà ko thêm ngay lập tức vào ViewGroup(NOT NOW)

Rồi thuộc lấn sân vào ví dụ mang đến dễ dàng nắm bắt nào..Tôi bao gồm xml layout file mang tên là activity_main.xml cùng với root là LinearLayout hướng vertical:

LinearLayout xmlns:android="http://schemas.app android.com/apk/res/android" android:orientation="vertical" android:id="
+id/ll_main" android:layout_width="fill_parent" android:layout_height="fill_parent">LinearLayout>Và 1 xml layout file không giống tên là item_button.xml nhỏng sau:

Button xmlns:android="http://schemas.apk.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Custom Button" android:id="
+id/custom_button">Button>cùng hiện nay tôi đang thực hiện theo thứ tự những thủ tục inflate và tôi vẫn chỉ ra tác dụng sau khi chúng ta thực hiện nó

// TH1: Chúng ta chỉ sử dụng 2 ttê mê số mặc dù attachToRoot sẽ được đặt mặc định bởi true và hiệu quả là item_button sẽ tiến hành biến đổi thành View và được add vào llMain ngay khi chuyển đổi xong xuôi.

public class DemoLayoutInflater extends AppCompatActivity
Nullable Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo); LinearLayout llMain = findViewById(R.id.ll_main); View view = LayoutInflater.from(this).inflate(R.layout.item_button, llMain);//TH2: Chúng ta chỉ thực hiện 3 tham với attachToRoot = true, khi ấy item_button sẽ tiến hành gửi thành View cùng được add vào llMain ngay khi thay đổi hoàn tất giống như TH1.

Xem thêm: Mba Là Viết Tắt Của Từ Gì - Phd, Md, Ma, Msc, Mba, Ba, Bsc Là Gì

public class DemoLayoutInflater extends AppCompatActivity
Nullable Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo); LinearLayout llMain = findViewById(R.id.ll_main); View view = LayoutInflater.from(this).inflate(R.layout.item_button, llMain, true);TH1 cùng TH2 tất cả thuộc hiệu quả nhỏng hình dưới đây:

*
//TH3: Trường vừa lòng này bọn họ cũng sử dụng 3 ttê mê số tuy vậy với attachToRoot = false, kho đó nó LayoutInflater chỉ chuyển đổi item_button thành View trong java mà không có tác dụng bất kể trang bị gì không giống.

public class DemoLayoutInflater extends AppCompatActivity
Nullable Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo); LinearLayout llMain = findViewById(R.id.ll_main); View view = LayoutInflater.from(this).inflate(R.layout.item_button, llMain, false);Kết trái của TH3 là button không được add vào LinearLayout nlỗi hình bên dưới.

*
View này sẽ không được add vào llMain(ViewGroup) và chỉ Khi bọn họ Hotline phương thức addView của ViewGroup thì View sẽ được add vào ViewGroup, sau khoản thời gian điện thoại tư vấn phương thức addView thì tác dụng đã tương tự TH1 và TH2:

public class DemoLayoutInflater extends AppCompatActivity
Nullable Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo); LinearLayout llMain = findViewById(R.id.ll_main); View view = LayoutInflater.from(this).inflate(R.layout.item_button, llMain, false); llMain.addView(view); //Different

Lưu ý Khi thực hiện LayoutInflater vào custom adapter

Qua 3 ví dụ bên trên chắc chắn chúng ta cũng đã phát âm tđắm đuối số attachToRoot cần sử dụng để làm gì rồi yêu cầu không? Tóm lại thì attachToRoot quyết định View cơ mà được tạo thành bởi qua trình inflate của LayoutInflater dành được add vào ViewGroup parent hay không.Nhưng họ test so sánh trường vừa lòng dùng LayoutInflater vào phương thức getView Lúc custom adapter coi nhé.Tại trong cách tiến hành getView bọn họ thường được sử dụng như sau:


Overridepublic View getView(int position, View convertView, ViewGroup parent) View view = LayoutInflater.from(mContext).inflate(R.layout.item_message, parent, false); /* *khu vực nàyánh xạ view và cập nhật tài liệu của view */ return view;Ở cách tiến hành bên trên thì LayoutInflater đã gọi tệp tin item_message.xml cùng chuyển đổi nó thành 1 view cùng sẽ không còn attach tức thì vào ViewGroup parent(ex:ListView, GridView...)Nếu chúng ta áp dụng đoạn code trên với bên Activity chúng ta mix adapter thì đa số chuyện đông đảo ổn định..vận dụng chúng ta chạy bình thường với listview đã hiển thị những lời nhắn.

Nhưng chúng ta nhận biết là listview ước ao hiển thị các item message, vậy vì sao lúc tạo nên view tự item_message.xml chúng ta ko gán luôn luôn nó vào listview bằng cách mang đến tmê say số attachToRoot=true sinh sống trong cách tiến hành getView luôn luôn rò rỉ...Thử code bên dưới nhé


Override public View getView(int position, View convertView, ViewGroup parent) View view = LayoutInflater.from(mContext).inflate(R.layout.item_message, parent, true); /* *nơi nàyánh xạ view và cập nhật tài liệu của view */ return view; Nếu bạn thực hiện code này thì áp dụng của các bạn sẽ bị giới hạn đột ngột cùng với nguim nhân:

01-17 01:57:21.961 14112-14112/com.dvt.abc E/AndroidRuntime: FATAL EXCEPTION: main Process: com.dvt.abc, PID: 14112 app android.view.InflateException: Binary XML tệp tin line #20: addView(View, LayoutParams) is not supported in AdapterView Caused by: java.lang.UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView at apk.widget.AdapterView.addView(AdapterView.java:880) at apk.view.LayoutInflater.inflate(LayoutInflater.java:534) at app android.view.LayoutInflater.inflate(LayoutInflater.java:427) at com.dvt.abc.MessageAdapter.getView(MessageAdapter.java:38)Tại sao lại như vậy...khi chúng ta sử dụng đoạn code:

public class DemoLayoutInflater extends AppCompatActivity
Nullable Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo); LinearLayout llMain = findViewById(R.id.ll_main); View view = LayoutInflater.from(this).inflate(R.layout.item_button, llMain, true);Ở đây LayoutInflater đang đọc tệp tin item_button.xml thành View (Java code) và add nó làm con của ViewGroup llMain. Kết trái sẽ giống như với xml layout tệp tin này:

LinearLayout xmlns:android="http://schemas.game android.com/apk/res/android" android:orientation="vertical" android:id="
+id/ll_main" android:layout_width="fill_parent" android:layout_height="fill_parent"> Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Custom Button" android:id="
+id/custom_button"> Button> LinearLayout>Hành cồn add view so với những ViewGroup nhỏng LinearLayout giỏi RelativeLayout thì trọn vẹn thông thường, vị các viewgroup hoàn toàn có thể chứa được nhiều View nhỏ hoặc ViewGroup khác ngơi nghỉ vào nó. dẫu vậy một tấm nhỏ của AdapterView nhỏng ListView, GridView thì những nhà cửa con của nó quan trọng thủ công bằng tay bởi bài toán add trong xml hoặc vào code nlỗi bên dưới đây:

//xml layout fileListView android:id="
+id/lv_data" android:layout_width="match_parent" android:layout_height="wrap_content" > TextView android:layout_width="match_parent" android:layout_height="wrap_content" /> ListView>//Activity
Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView lvData = findViewById(R.id.lv_data); TextView tvContent = new TextView(this); lvData.addView(tvContent); //Don"t vì this//Adapter
Overridepublic View getView(int position, View convertView, ViewGroup parent) //Don"t phối attachToRoot=true View view = LayoutInflater.from(mContext).inflate(R.layout.item_message, parent, true); /* *vị trí nàyánh xạ view với cập nhật dữ liệu của view */ return view;Nên nếu bạn chạm chán lỗi: addView(View, LayoutParams) is not supported in AdapterView thì hãy chất vấn lại xem các bạn có hotline add view bằng tay vào AdapterView không nhé..

Xem thêm: Trailer Cô Dâu Đại Chiến 2, Động Phim Cô Dâu Đại Chiến 2, Cô Dâu Đại Chiến 2 (2014)

Đó là cục bộ hầu hết gì mình thích nói cùng với chúng ta về LayoutInflater. Hẹn gặp mặt chúng ta nghỉ ngơi những bài xích tiếp nhé.