2013-09-25 34 views
7

Tôi quan tâm đến cách tốt nhất để có một hoạt động đơn lẻ chuyển đổi giữa hai đoạn.Cách tốt nhất để chuyển đổi giữa hai đoạn

Tôi đã đọc 15 bài đăng tràn ngăn xếp và 5 bài đăng trên blog về cách thực hiện điều này, và trong khi tôi nghĩ rằng tôi đã trộn lẫn một giải pháp, tôi không tin đó là giải pháp tốt nhất. Vì vậy, tôi muốn nghe ý kiến ​​của mọi người về đúng cách để xử lý điều này, đặc biệt là liên quan đến vòng đời của hoạt động phụ huynh và các mảnh vỡ.

Dưới đây là tình hình một cách chi tiết:

  1. Một hoạt động cha mẹ có thể hiển thị một trong hai mảnh càng tốt.
  2. Hai đoạn có trạng thái mà tôi muốn tồn tại trong một phiên, nhưng không nhất thiết phải được duy trì giữa các phiên.
  3. Một số hoạt động khác, chẳng hạn như hoạt động gốc và các đoạn có thể bị chôn vùi trong ngăn xếp sau và bị phá hủy do bộ nhớ thấp.
  4. Tôi muốn khả năng sử dụng nút quay lại để di chuyển giữa các đoạn (Vì vậy, khi tôi hiểu nó, tôi không thể sử dụng setRetainInstance).

Ngoài tư vấn kiến ​​trúc chung, tôi đã sau câu hỏi nổi bật:

  1. Nếu hoạt động cha mẹ bị phá hủy do bộ nhớ thấp, làm thế nào để đảm bảo rằng các tiểu bang của cả hai mảnh sẽ được giữ lại , theo bài đăng này: When a Fragment is replaced and put in the back stack (or removed) does it stay in memory?. Tôi chỉ cần một con trỏ đến từng đoạn trong hoạt động chính?
  2. Cách tốt nhất để hoạt động của phụ huynh theo dõi phân đoạn nào hiện đang hiển thị?

Cảm ơn bạn trước!

Trả lời

6

Tôi đã kết thúc thêm cả hai đoạn bằng cách sử dụng trình quản lý phân đoạn hỗ trợ và sau đó sử dụng tách/đính kèm để chuyển đổi giữa chúng.Tôi đã có thể sử dụng commitAllowingStateLoss() vì tôi giữ trạng thái của khung nhìn ở nơi khác, và tự thiết lập một đoạn chính xác trong onResume().

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);  

    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
    fragmentTransaction.add(R.id.my_layout, new AFragment(), TAG_A); 
    fragmentTransaction.add(R.id.my_layout, new BFragment(), TAG_B); 
    fragmentTransaction.commit(); 
} 

public void onResume() { 
    super.onResume(); 
    if (this.shouldShowA) { 
     switchToA(); 
    } else { 
     switchToB(); 
    } 
} 

private void switchToA() { 
    AFragment fragA = (AFragment) getSupportFragmentManager().findFragmentByTag(TAG_A); 
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
    fragmentTransaction.detach(getSupportFragmentManager().findFragmentByTag(TAG_B)); 
    fragmentTransaction.attach(fragA); 
    fragmentTransaction.addToBackStack(null); 

    fragmentTransaction.commitAllowingStateLoss(); 
    getSupportFragmentManager().executePendingTransactions(); 
} 
2

Bạn có thể muốn xem xét sử dụng ViewPager trong Hoạt động gốc của mình để bạn có thể chuyển đổi giữa các Phân đoạn.

Vì vậy, bạn sẽ có thể vuốt qua chúng.

nếu bạn muốn duy trì trạng thái của chúng trong phiên ngay cả khi hoạt động gốc bị hủy, bạn cần phải đặt chúng Parcelable, vì vậy bạn có thể lưu trạng thái ngay cả khi lớp đó không được khởi tạo tại thời điểm đó. Bạn cũng cần phải làm điều này nếu xoay thiết bị của bạn và muốn giữ tình hình/dữ liệu hiện tại trên màn hình.

Bạn nên viết chúng vào Parcelable trong phương thức của chúng và tạo lại chúng từ số onResume. Bằng cách này nó không quan trọng nếu chúng bị phá hủy hoặc phải được tái tạo do những thay đổi trong định hướng thiết bị.

nếu bạn muốn có thể chuyển đổi giữa các đoạn đó với nút Backbutton, bạn có thể nắm bắt buttonClick cho onBackPressed và xử lý theo đó.

Nếu bạn cần tìm ra Fragment hiển thị của bạn tại một thời điểm nhất định bạn yêu cầu ViewPager những gì Fragment hiển thị vào thời điểm đó, vì vậy bạn không cần phải theo dõi, bạn chỉ có thể hỏi ai đó biết, bạn cần phải biết điều đó.

+0

Cảm ơn bạn đã trả lời. Tôi không nghĩ rằng tôi có thể sử dụng một máy nhắn tin xem ở đây, bởi vì các quan điểm không nên được swiped-giữa. Tôi chắc chắn sẽ thực hiện kiện mặc dù. Tôi triển khai onBackPressed ở đâu? – GLee

+0

OnBackPressed là phương thức hoạt động. Vì vậy, bạn sẽ phải ghi đè nó ở đó. –

Các vấn đề liên quan