Tôi có câu hỏi về "lập trình thích hợp" trong Android.Nguyên tắc cơ bản về Android Fragments: tại sao? Đây có phải là khái niệm sai?
Tôi hiện đang phát triển một ứng dụng bằng cách sử dụng các phân đoạn. Nó bao gồm các phân đoạn động được thêm vào Hoạt động, các đoạn bị thổi phồng từ XML, các đoạn lồng nhau từ XML hoặc được thêm động. Hãy nói, một chút của tất cả mọi thứ.
Khái niệm mà câu hỏi này tập trung vào là quá trình giao tiếp liên quan đến các phân đoạn. Vì vậy, tôi đã đọc các tài liệu và đây không phải là lần đầu tiên tôi cố gắng sử dụng các mảnh vỡ.
Cảm giác chung (và tài liệu) cho biết nếu một Fragment muốn nói hoặc giao tiếp với hoạt động của nó, chúng ta nên sử dụng một giao diện.
Ví dụ:
TestFragment
public class TestFragment extends Fragment {
private TestFragmentInterface listener;
public interface TestFragmentInterface {
void actionMethod();
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
if (getActivity() instanceof TestFragmentInterface) {
listener = (TestFragmentInterface) getActivity();
}
// sending the event
if (listener != null) listener.actionMethod();
}
}
TestActivity
public class Test implements TestFragmentInterface {
@Override
public void actionMethod() {
..
}
}
Tất cả những gì tốt đẹp ở đây.
Điều này cải thiện khả năng sử dụng lại, vì TestFragment của tôi theo cách này có thể tương tác với bất kỳ loại Hoạt động nào, do Hoạt động triển khai giao diện mà tôi khai báo.
Cách khác xung quanh, Hoạt động có thể tương tác với đoạn bằng cách giữ tham chiếu và gọi phương thức công khai của nó. Đây cũng là cách được đề xuất để liên lạc từng đoạn, sử dụng Hoạt động như một cây cầu.
Điều này thật tuyệt, nhưng đôi khi cảm giác như sử dụng giao diện cho điều này chỉ là một chút "quá nhiều".
Câu hỏi Một
Trong kịch bản các mảnh vỡ tôi đính kèm có một vai trò khá tập trung, có nghĩa là chúng được thực hiện cho rằng hoạt động cụ thể và sẽ không được sử dụng bằng cách khác, nó là khái niệm sai lầm khi bỏ qua việc thực hiện giao diện và chỉ cần làm điều gì đó như
((TestActivity) getActivity().myCustomMethod();
?
Điều này cũng xảy ra trong trường hợp (không phải trường hợp của tôi, nhưng chỉ coi nó là "tồi tệ nhất") hoạt động của tôi phải xử lý nhiều loại mảnh KHÁC, nghĩa là nó nên thực hiện một phương pháp cho mọi mảnh cần xử lý. Điều này mang lại mã cho một mớ hỗn độn lớn của "dòng có khả năng không cần thiết".
Di chuyển thêm: vẫn còn sử dụng các đoạn "tập trung", nhằm mục đích chỉ hoạt động theo cách nhất định, điều gì xảy ra với việc sử dụng các đoạn lồng nhau?
thêm họ như
public class TestFragment extends Fragment {
private void myTestMethod() {
NestedFragment nested = new NestedFragment();
getChildFragmentManager()
.beginTransaction()
.add(R.id.container, nested)
.commit();
}
}
này liên kết với NestedFragment để TestFragment. Tôi nói lại lần nữa, NestedFragment, giống như TestFragment, chỉ được sử dụng theo cách này, nó không có ý nghĩa để làm việc khác.
Quay lại câu hỏi, tôi nên xử lý như thế nào trong tình huống này?
Câu hỏi B
1) Tôi cần cung cấp một giao diện trong NestedFragment, và làm sao cho TestFragments thực hiện NestedFragmentInterface? Trong trường hợp này tôi sẽ đóng vai trò như sau
NestedFragment
public class NestedFragment extends Fragment {
private NestedFragmentInterface listener;
public interface NestedFragmentInterface {
void actionMethodNested();
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
if (getParentFragment() instanceof NestedFragmentInterface) {
listener = (NestedFragmentInterface) getParentFragment();
}
// sending the event
if (listener != null) listener.actionMethodNested();
}
}
2) nên (hoặc có thể) Tôi bỏ qua giao diện, và chỉ cần gọi
getParentFragment().publicParentMethod();
?
3) Tôi nên tạo các giao diện trong NestedFragment, nhưng để cho các hoạt động thực hiện nó, vì vậy mà hoạt động sẽ gọi TestFragment?
Câu hỏi C
Về ý tưởng của việc sử dụng Hoạt động như một cầu nối giữa các mảnh vỡ, tôi tin rằng nó được làm như vậy cho vòng đời xử lý thích hợp của tất cả các đối tượng này. Nó vẫn còn khả thi để làm một mảnh trực tiếp-to-fragment (sử dụng giao diện hoặc trực tiếp gọi phương thức công cộng) trong khi cố gắng để xử lý bằng tay ngoại lệ hệ thống có thể ném tôi?
Xem điều này có giúp ích: https://corner.squareup.com/2014/10/advocating-against-android-fragments.html –
Tôi đã đọc liên kết bạn đăng và trong khi đó thực sự là một bài viết thú vị rất nhiều thông tin, tôi sợ nó không trả lời câu hỏi của tôi. Cảm ơn bạn anyway – FrancescoC