2017-09-04 28 views
5

Tôi có 2 hoạt động, A và B. Mỗi hoạt động là một vùng chứa cho các đoạn được thay thế bằng FragmentTransaction.Android Khôi phục thứ tự các đoạn trong ngăn xếp

Tôi gặp sự cố trên một số thiết bị khi người dùng mở Hoạt động B khi đang ở Hoạt động A, hoạt động đầu tiên có thể bị hủy, có nghĩa là khi người dùng nhấp vào nút quay lại, hoạt động đầu tiên được tạo lại trong khi trong một thiết bị bình thường, nó sẽ chỉ tiếp tục.

Vấn đề chính của tôi là người dùng mất ngăn xếp phân đoạn của mình trong hoạt động đầu tiên. Khi người dùng mở hoạt động thứ 2, anh ta đã có 3 mảnh "sâu" trong hoạt động đầu tiên. Làm cách nào tôi có thể khôi phục ngăn xếp và đưa người dùng trở lại điểm mà trước khi hoạt động đầu tiên bị hủy?

+0

bạn có thể tìm kiếm setRetainInstance (true) để có được một số giải pháp về lập lại trật tự của đoạn –

+0

Bạn có thể chắc chắn, rằng 'Bundle' đang được truyền cho' onCreate() 'phương pháp như một tham số là không phải 'null' khi người dùng di chuyển trở lại từ' ActivityB'? Ngoài ra, vui lòng đăng 'onCreate()' thực hiện 'ActivityA()' của bạn. – azizbekian

+0

@azizbekian vâng tôi có thể. Bây giờ tôi sử dụng phương pháp này để thay thế mảnh vỡ thành mảnh chính của ứng dụng, nhưng thường không phải là phân đoạn của nó trước khi mở hoạt động thứ 2. –

Trả lời

1

Điều này sẽ tự động được xử lý bởi hệ điều hành Android. Bạn có thể bật tùy chọn nhà phát triển "không giữ hoạt động" để luôn bắt chước hành vi này (phá hủy hoạt động của bạn) khi hoạt động của bạn chuyển sang nền. Sau đó bạn có thể bắt đầu gỡ lỗi. Một số điều cần kiểm tra:

  • Trong onCreate của hoạt động này, bạn có gọi onCreate siêu với các savedInstanceState?

  • Nếu bạn đặt điểm ngắt khi bắt đầu onCreate, khi bạn "trở về trạng thái" "hoạt động, có trạng thái mẫu đã lưu không?

  • Bạn tạo phân đoạn ở đâu? Bạn đang tạo lại chúng theo cách thủ công (bạn không nên)?

  • Các đoạn mã của bạn có được mã hóa cứng trong bố cục hoặc được thay thế trong bố cục (thay thế chế độ xem vùng chứa) không?

* EDIT *

Từ trả lời của bạn tôi lấy được rằng đây là vấn đề, bạn nói: "Trong phần cuối của onCreate Tôi đang thay thế các đoạn với một giao dịch đoạn và do đó nạp đoạn đầu tiên của ứng dụng "=> bạn không nên làm điều đó khi savedInstanceState không phải là rỗng. Nếu không, bạn đang phá hủy những gì đã có từ trạng thái đã lưu.

Kiểm tra ở đây: https://developer.android.com/training/basics/fragments/fragment-ui.html

Thông báo sự trở lại khi savedInstanceState không phải là null.

public class MainActivity extends FragmentActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.news_articles); 

     // Check that the activity is using the layout version with 
     // the fragment_container FrameLayout 
     if (findViewById(R.id.fragment_container) != null) { 

      // However, if we're being restored from a previous state, 
      // then we don't need to do anything and should return or else 
      // we could end up with overlapping fragments. 
      if (savedInstanceState != null) { 
       return; 
      } 

      // Create a new Fragment to be placed in the activity layout 
      HeadlinesFragment firstFragment = new HeadlinesFragment(); 

      // In case this activity was started with special instructions from an 
      // Intent, pass the Intent's extras to the fragment as arguments 
      firstFragment.setArguments(getIntent().getExtras()); 

      // Add the fragment to the 'fragment_container' FrameLayout 
      getSupportFragmentManager().beginTransaction() 
        .add(R.id.fragment_container, firstFragment).commit(); 
     } 
    } 
} 
+0

Những gì bạn mô tả âm thanh như trường hợp hoạt động đầu tiên được tiếp tục mà không bị phá hủy trước đó. onCreate không gọi là siêu. Nếu hoạt động bị hủy và tôi quay trở lại, cá thể đã lưu không phải là rỗng. Vào cuối của onCreate tôi đang thay thế các mảnh với một giao dịch mảnh và do đó tải đoạn đầu tiên của ứng dụng. Tôi đang thay thế chúng trong một cái nhìn container. –

+0

"Vào cuối của onCreate tôi đang thay thế các mảnh với một giao dịch mảnh và do đó tải mảnh đầu tiên của ứng dụng" => bạn không nên làm điều đó khi savedInstanceState không phải là null. Nếu không, bạn đang phá hủy những gì đã có từ trạng thái đã lưu. Kiểm tra ở đây: https://developer.android.com/training/basics/fragments/fragment-ui.html – Frank

+0

OK Tôi đã tạo các đoạn đầu tiên chỉ khi lưu trữ đã được null và có vẻ như nó hoạt động –

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