Vì TabActivity không được dùng nữa Tôi cần tìm cách để thực hiện việc này với Phân đoạn.
Nếu bạn không muốn sử dụng TabActivity
- quên đặt FragmentActivities
vào nội dung của tab.
Tôi nhắc bạn có thể sử dụng TabWidget
mà không cần TabActivity
. Vì vậy, bạn có thể thử giải pháp này:
- Chỉ tạo một
FragmentActivity
.
- Đặt
TabWidget
vào bố cục FragmentActivity
. Đặt chiều cao của nội dung là TabWidget
= 0.
- Dưới dạng khai báo XML trong XML kê khai
Fragment
s (FrameLayout
ví dụ).
- Trong
FragmentActivity
chỉ cần xử lý tab nào được chọn (TabHost.OnTabChangeListener
) và đặt cần thiết Fragment
vào vùng chứa.
- Đặt nhật ký chương trình (trước đó trong các hoạt động khác nhau) vào các Phân đoạn khác nhau.
Hoặc bạn có thể tạo FragmentActivity
với TabWidget
, và thay vì chuyển đổi Fragment
s bạn có thể trực tiếp đặt Fragment
s vào nội dung của mỗi tab.
Ví dụ: nếu bạn có 3 tab và 3 đoạn, hãy thử những gì tôi làm. Hãy gọi showFragmentX
khi bạn cần thay đổi một đoạn khác.
public class Test extends FragmentActivity {
private Fragment1 fragment1=new Fragment1();
private Fragment2 fragment2=new Fragment2();
private Fragment3 fragment3=new Fragment3();
private void showFragment1(){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragments_container, fragment1);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
}
private void showFragment2(){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragments_container, fragment2);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
}
private void showFragment3(){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragments_container, fragment3);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
}
@Override
protected void onCreate(Bundle arg0) {
// TODO Auto-generated method stub
super.onCreate(arg0);
setContentView(R.layout.fragmentactivity_layout);
}
}
Nếu bạn làm như vậy fragmentX
biến của bạn sẽ không bị xóa mỗi khi bạn đặt chúng trong fragment_container
.Họ sẽ sống trong khi bạn sống FragmentActivity
. Hãy xem fragments lifecycle. Chỉ OnCreateView
và onDestroyView
các phương pháp phân đoạn sẽ gọi lại một lần nữa trong khi bạn replace
một đoạn này sang phân đoạn khác.
Ngoài ra Fragments có phương thức onSaveInstanceState
nơi bạn có thể lưu trạng thái phân đoạn của mình. Ví dụ: người dùng đã nhập tên của mình trong editText của fragment1. Nếu bạn muốn giữ lại dữ liệu này (string name) trong khi người dùng khám phá những mảnh còn lại bạn nên
1.save tên chuỗi trong phương pháp fragment1 của onSaveInstanceState
2. Vào onCreateView
phương pháp bó séc savedInstanceState fragment1, nếu nó không phải null - điền EditText với chuỗi mà bạn nhận được từ gói.
public class Fragment1 extends Fragment {
EditText nameEditText;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View fragment1View=inflater.inflate(R.layout.fragment1_layout, container, false);
nameEditText=(EditText) fragment1View.findViewById(R.id.edittext_name);
//check for saved data. if it is not null - fill your edittext with saved string
if(savedInstanceState!=null){
String nameString=(String) savedInstanceState.get("nameString");
nameEditText.setText(nameString);
}
return fragment1View;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//save data that user have entered
outState.putString("nameString", nameEditText.getText().toString());
}
}
Bạn có thể kiểm tra dữ liệu trước khi lưu. Tôi hy vọng quan điểm của tôi đã rõ ràng.
Ngoài ra, nếu bạn gọi setRetainInstance(true)
trong phương thức onCreateView()
của fragment
- hệ thống sẽ cố gắng lưu trạng thái phân đoạn (với tất cả dữ liệu đầu vào). link to description
Thx cho câu trả lời, nhưng có một vấn đề khác nếu tôi đặt các mảnh thay vì hoạt động vào các tab. Ví dụ: trong tab đầu tiên, tôi muốn thay thế vùng chứa bằng một đoạn khác trong trường hợp người dùng nhấp vào một nút và sau đó Nếu tôi thay đổi tab, hãy chuyển đến tab thứ hai để thay thế các đoạn trước đó. Vì vậy, trong trường hợp tôi đi đến tab đầu tiên một lần nữa nó sẽ tạo ra các mảnh một lần nữa và tôi sẽ không thể nhìn thấy trang trước đó. Bạn có bất kỳ ý tưởng làm thế nào để thoát khỏi nó? – osayilgan
Tôi đã chỉnh sửa câu trả lời của mình. Hãy nhìn vào đó. Và cũng có những ví dụ mảnh trong các mẫu ("ApiDemos"). Kiểm tra chúng ra. –
Vâng tôi đã hiểu, nhưng đây không phải là điều tôi đang hỏi. Tôi đã làm việc với những mảnh vỡ và tôi biết nó hoạt động như thế nào. Điều mà tôi không biết là: Giả sử rằng chúng ta đang ở trong tab đầu tiên và tôi đã gọi một đoạn khác trong trường hợp người dùng nhấp vào nút, bước thứ hai tôi đã thay đổi tab sang tab thứ hai, vì vậy tại đây sẽ thay thế dữ liệu trong đó với phần của các tab thứ hai phải không? Nhưng tôi cũng muốn giữ cho điều đã được thay đổi trong tab đầu tiên. Vì vậy, theo cách này, nếu tôi chỉ thay thế các mảnh trênTabChange, điều này sẽ không giữ nội dung đã thay đổi trước đó trong tab trước đó. Bất kỳ ý tưởng ? – osayilgan