Tôi muốn thêm vào cho người mới bắt đầu rằng sự khác biệt giữa 2 câu trả lời được đánh giá cao nhất ở đây được đưa ra bằng cách sử dụng khác nhau của một đoạn.
Nếu bạn sử dụng đoạn trong lớp java nơi bạn có dữ liệu bạn muốn truyền, bạn có thể áp dụng câu trả lời đầu tiên để truyền dữ liệu:
Bundle bundle = new Bundle();
bundle.putString("edttext", "From Activity");
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);
Tuy nhiên, nếu bạn sử dụng ví dụ mã mặc định do Android Studio cung cấp cho các đoạn được gắn thẻ, mã này sẽ không hoạt động.
Nó sẽ không hoạt động ngay cả khi bạn thay thế PlaceholderFragment mặc định bằng FragmentClass của bạn và ngay cả khi bạn sửa FragmentPagerAd CHƯƠNG sang tình huống mới, thêm một công tắc cho getItem () và một công tắc khác cho getPageTitle () (như được hiển thị ở đây )
Cảnh báo: clip được đề cập ở trên có lỗi mã, tôi sẽ giải thích sau đây, nhưng rất hữu ích để xem cách bạn đi từ mã mặc định sang mã có thể chỉnh sửa cho các đoạn được gắn thẻ)! Phần còn lại của câu trả lời của tôi có ý nghĩa hơn nhiều nếu bạn xem xét các lớp java và tệp xml từ clip đó (đại diện cho lần đầu tiên sử dụng các đoạn được gắn thẻ theo kịch bản mới bắt đầu).
Lý do chính khiến câu trả lời được đánh giá cao nhất từ trang này sẽ không hoạt động là trong mã mặc định đó cho các đoạn được gắn thẻ, các đoạn được sử dụng trong một lớp java khác: FragmentPagerAd CHƯƠNG!
Vì vậy, để gửi dữ liệu, bạn nên tạo một gói trong MotherActivity và chuyển nó trong FragmentPagerAd CHƯƠNG, sử dụng câu trả lời số 2.
Chỉ có điều đó là sai một lần nữa. ( Có lẽ bạn có thể làm điều đó như thế, nhưng đó chỉ là một sự phức tạp không thực sự cần thiết ).
Cách chính xác / dễ dàng hơn để làm điều đó, tôi nghĩ, là truyền dữ liệu trực tiếp đến đoạn được đề cập, sử dụng câu trả lời số 2. Có, sẽ có sự kết hợp chặt chẽ giữa Hoạt động và Mảnh vỡ, NHƯNG, đối với các mảnh được gắn thẻ, đó là loại dự kiến. Tôi thậm chí sẽ khuyên bạn nên tạo các đoạn được gắn thẻ bên trong lớp java MotherActivity (dưới dạng các lớp con, vì chúng sẽ không bao giờ được sử dụng bên ngoài MotherActivity) - thật dễ dàng, chỉ cần thêm vào bên trong lớp java MotherActivity như nhiều Đoạn như bạn cần như thế này:
public static class Tab1 extends Fragment {
public Tab1() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false);
return rootView;
}
}.
Vì vậy, để truyền dữ liệu từ MotherActivity sang một Fragment như vậy, bạn sẽ cần tạo các Chuỗi / Gói riêng tư bên trên onCreate của hoạt động Mẹ của bạn - mà bạn có thể điền dữ liệu bạn muốn truyền vào các đoạn đó và chuyển chúng qua phương thức được tạo sau onCreate (ở đây được gọi là getMyData ()).
public class MotherActivity extends Activity {
private String out;
private Bundle results;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mother_activity);
// for example get a value from the previous activity
Intent intent = getIntent();
out = intent.getExtras().getString("Key");
}
public Bundle getMyData() {
Bundle hm = new Bundle();
hm.putString("val1",out);
return hm;
}
}
Và sau đó trong lớp phân đoạn, bạn sử dụng getMyData:
public static class Tab1 extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
public Tab1() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false);
TextView output = (TextView)rootView.findViewById(R.id.your_id_for_a_text_view_within_the_layout);
MotherActivity activity = (MotherActivity)getActivity();
Bundle results = activity.getMyData();
String value1 = results.getString("val1");
output.setText(value1);
return rootView;
}
}
Nếu bạn có các truy vấn cơ sở dữ liệu, tôi khuyên bạn nên thực hiện chúng trong MotherActivity (và chuyển kết quả của chúng dưới dạng Chuỗi / Số nguyên được gắn vào các khóa bên trong một gói như được hiển thị ở trên), vì bên trong các đoạn được gắn thẻ, cú pháp của bạn sẽ trở nên phức tạp hơn (điều này trở nên phức tạp hơn () chẳng hạn, và getIntent trở thành getActivity (). getIntent), nhưng bạn cũng có tùy chọn để làm như bạn muốn.
Lời khuyên của tôi cho người mới bắt đầu là tập trung vào các bước nhỏ. Trước tiên, hãy lấy ý định của bạn để mở một hoạt động được gắn thẻ rất đơn giản, mà không truyền bất kỳ dữ liệu nào. Nó có hoạt động không? Nó có mở các tab bạn mong đợi không? Nếu không, tại sao?
Bắt đầu từ đó, và bằng cách áp dụng các giải pháp như những giải pháp được trình bày trong clip này , hãy xem những gì còn thiếu. Đối với clip cụ thể đó, tệp mainactivity.xml không bao giờ được hiển thị. Điều đó chắc chắn sẽ làm bạn bối rối. Nhưng nếu bạn chú ý, bạn sẽ thấy ví dụ như bối cảnh (công cụ: bối cảnh) bị sai trong các tệp mảnh xml. Mỗi phân đoạn XML cần trỏ đến lớp phân đoạn chính xác (hoặc lớp con sử dụng dấu phân cách $).
Bạn cũng sẽ thấy rằng trong lớp java hoạt động chính, bạn cần thêm tabLayout.setupWithViewPager (mViewPager) - ngay sau dòng TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); không có dòng này, chế độ xem của bạn thực sự không được liên kết với các tệp XML của các đoạn, nhưng nó chỉ hiển thị tệp xml của hoạt động chính.
Ngoài dòng trong lớp java hoạt động chính, trong tệp XML hoạt động chính, bạn cần thay đổi các tab để phù hợp với tình huống của bạn (ví dụ: thêm hoặc xóa TabItems). Nếu bạn không có các tab trong XML hoạt động chính, thì có thể bạn đã không chọn loại hoạt động chính xác khi bạn tạo nó ở vị trí đầu tiên (hoạt động mới - hoạt động được gắn thẻ).
Xin lưu ý rằng trong 3 đoạn cuối tôi nói về video! Vì vậy, khi tôi nói XML hoạt động chính, đó là XML hoạt động chính trong video, trong tình huống của bạn là tệp XML MotherActivity.