Đính kèm Đặt thành đúng:
Nếu AttachToRoot được đặt thành true, thì tệp bố cục được chỉ định trong tham số đầu tiên được thổi phồng và được gắn vào Viewgroup được chỉ định trong tham số thứ hai.
Hãy tưởng tượng chúng ta đã chỉ định một nút trong tệp bố cục XML với chiều rộng bố cục và chiều cao bố cục của nó được đặt thành match_parent.
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/custom_button">
</Button>
Bây giờ chúng tôi muốn lập trình thêm Nút này vào Tuyến tính trong một Đoạn hoặc Hoạt động. Nếu linearLayout của chúng tôi đã là một biến thành viên, mLinearLayout, chúng tôi chỉ cần thêm nút bằng cách sau:
inflater.inflate(R.layout.custom_button, mLinearLayout, true);
Chúng tôi đã chỉ định rằng chúng tôi muốn thổi phồng Nút từ tệp tài nguyên bố cục của nó; sau đó chúng tôi nói với LayoutInflater rằng chúng tôi muốn đính kèm nó vào mLinearLayout. Các tham số bố trí của chúng tôi được vinh danh vì chúng tôi biết Nút được thêm vào Tuyến tính. Kiểu tham số bố trí của Nút phải là linearLayout.LayoutParams.
AttachToRoot Đặt thành false (không bắt buộc phải sử dụng false)
Nếu AttachToRoot được đặt thành false, thì tệp bố cục được chỉ định trong tham số đầu tiên bị thổi phồng và không được đính kèm với Viewgroup được chỉ định trong tham số thứ hai nhưng chế độ xem bị thổi phồng đó có được LayoutParams của cha mẹ , cho phép khung nhìn đó khớp chính xác với cha mẹ.
Chúng ta hãy xem khi nào bạn muốn đặt Đính kèm thành sai. Trong trường hợp này, Chế độ xem được chỉ định trong tham số đầu tiên của Inflate () không được đính kèm với Viewgroup trong tham số thứ hai tại thời điểm này.
Nhớ lại ví dụ về Nút của chúng tôi từ trước đó, nơi chúng tôi muốn đính kèm Nút tùy chỉnh từ tệp bố cục vào mLinearLayout. Chúng tôi vẫn có thể đính kèm Nút của mình vào mLinearLayout bằng cách chuyển thành false cho tệp đính kèm, chúng tôi chỉ cần tự thêm nó vào nút.
Button button = (Button) inflater.inflate(R.layout.custom_button, mLinearLayout, false);
mLinearLayout.addView(button);
Hai dòng mã này tương đương với những gì chúng ta đã viết trước đó trong một dòng mã khi chúng ta chuyển thành true cho AttachToRoot. Bằng cách chuyển sai, chúng tôi nói rằng chúng tôi chưa muốn đính kèm Chế độ xem của mình vào Viewgroup gốc. Chúng tôi đang nói rằng nó sẽ xảy ra tại một số thời điểm khác. Trong ví dụ này, thời điểm khác chỉ đơn giản là phương thức addView () được sử dụng ngay bên dưới lạm phát.
Ví dụ Đính kèm sai giả yêu cầu thêm một chút công việc khi chúng tôi thêm Chế độ xem theo cách thủ công vào Viewgroup.
AttachToRoot Đặt thành false (Bắt buộc sai)
Khi thổi phồng và trả về Chế độ xem của Fragment trong onCreateView (), hãy chắc chắn chuyển thành false cho Đính kèmRoot. Nếu bạn vượt qua đúng, bạn sẽ nhận được IllegalStateException vì đứa trẻ được chỉ định đã có cha mẹ. Bạn nên chỉ định nơi chế độ xem Mảnh vỡ của bạn sẽ được đặt lại trong Hoạt động của bạn. Công việc của FragmentManag là thêm, xóa và thay thế Fragment.
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentById(R.id.root_viewGroup);
if (fragment == null) {
fragment = new MainFragment();
fragmentManager.beginTransaction()
.add(R.id.root_viewGroup, fragment)
.commit();
}
Bộ chứa root_viewgroup sẽ giữ Fragment của bạn trong Activity là tham số Viewgroup được cung cấp cho bạn trong onCreateView () trong Fragment của bạn. Đây cũng là Viewgroup mà bạn chuyển vào LayoutInflater.inflate (). Tuy nhiên, FragmentManager sẽ xử lý việc đính kèm Chế độ xem của Fragment của bạn vào Viewgroup này. Bạn không muốn đính kèm hai lần. Đặt AttachToRoot thành false.
public View onCreateView(LayoutInflater inflater, ViewGroup parentViewGroup, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_layout, parentViewGroup, false);
…
return view;
}
Tại sao chúng tôi lại cho Viewgroup cha mẹ của Fragment ở vị trí đầu tiên nếu chúng tôi không muốn đính kèm nó trong onCreateView ()? Tại sao phương thức Inflate () yêu cầu một Viewgroup gốc?
Hóa ra, ngay cả khi chúng tôi không ngay lập tức thêm Chế độ xem mới được tăng cường vào Viewgroup mẹ của nó, chúng tôi vẫn nên sử dụng LayoutParams của cha mẹ để Chế độ xem mới xác định kích thước và vị trí của nó bất cứ khi nào cuối cùng được gắn vào.
Liên kết: https://youtu.be/1Y0LlmTCOkM?t=409