Trong khi @yydl đưa ra một lý do thuyết phục về lý do tại sao newInstance
phương pháp này tốt hơn:
Nếu Android quyết định tạo lại Mảnh vỡ của bạn sau này, thì nó sẽ gọi hàm tạo không có đối số của mảnh đó. Vì vậy, quá tải các nhà xây dựng không phải là một giải pháp.
vẫn hoàn toàn có thể sử dụng một hàm tạo . Để xem lý do tại sao, trước tiên chúng ta cần xem tại sao cách giải quyết trên được Android sử dụng.
Trước khi một đoạn có thể được sử dụng, một ví dụ là cần thiết. Các cuộc gọi Android YourFragment()
(hàm tạo không có đối số ) để xây dựng một thể hiện của đoạn. Ở đây, mọi hàm tạo quá tải mà bạn viết sẽ bị bỏ qua, vì Android không thể biết nên sử dụng cái nào.
Trong vòng đời của một Hoạt động, đoạn được tạo như trên và bị phá hủy nhiều lần bởi Android. Điều này có nghĩa là nếu bạn đặt dữ liệu vào chính đối tượng mảnh, nó sẽ bị mất một khi mảnh bị phá hủy.
Để giải quyết, android yêu cầu bạn lưu trữ dữ liệu bằng cách sử dụng Bundle
(gọi setArguments()
), sau đó có thể được truy cập từ đó YourFragment
. Các đối số bundle
được bảo vệ bởi Android và do đó được đảm bảo là bền bỉ .
Một cách để đặt gói này là sử dụng newInstance
phương thức tĩnh :
public static YourFragment newInstance (int data) {
YourFragment yf = new YourFragment()
/* See this code gets executed immediately on your object construction */
Bundle args = new Bundle();
args.putInt("data", data);
yf.setArguments(args);
return yf;
}
Tuy nhiên, một nhà xây dựng:
public YourFragment(int data) {
Bundle args = new Bundle();
args.putInt("data", data);
setArguments(args);
}
có thể làm chính xác điều tương tự như newInstance
phương pháp.
Đương nhiên, điều này sẽ thất bại và là một trong những lý do Android muốn bạn sử dụng newInstance
phương pháp này:
public YourFragment(int data) {
this.data = data; // Don't do this
}
Như giải thích thêm, đây là Lớp phân mảnh của Android:
/**
* Supply the construction arguments for this fragment. This can only
* be called before the fragment has been attached to its activity; that
* is, you should call it immediately after constructing the fragment. The
* arguments supplied here will be retained across fragment destroy and
* creation.
*/
public void setArguments(Bundle args) {
if (mIndex >= 0) {
throw new IllegalStateException("Fragment already active");
}
mArguments = args;
}
Lưu ý rằng Android hỏi rằng các đối số được thiết lập chỉ ở xây dựng, và đảm bảo rằng chúng sẽ được giữ lại.
EDIT : Như được chỉ ra trong các nhận xét của @JHH, nếu bạn đang cung cấp một hàm tạo tùy chỉnh yêu cầu một số đối số, thì Java sẽ không cung cấp đoạn của bạn với hàm tạo mặc định không có đối số . Vì vậy, điều này sẽ yêu cầu bạn xác định một hàm tạo không có arg , đây là mã mà bạn có thể tránh với newInstance
phương thức xuất xưởng.
EDIT : Android không cho phép sử dụng hàm tạo quá tải cho các đoạn nữa. Bạn phải sử dụng newInstance
phương pháp.