2013-02-19 39 views
6

Tôi đang cố gắng quyết định và hiển thị đoạn trong phương thức onResume của hoạt động, nhưng trong trường hợp phân đoạn được thêm trước đó được chọn lại, hoạt động sẽ trống.Thay thế một đoạn với chính nó không hiển thị bất cứ điều gì

Mẫu mã (với một đoạn):

@Override 
protected void onResume(){ 
    FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); 

    trans.replace(R.id.myLayout, fragA); 

    trans.commit(); 
    getSupportFragmentManager().executePendingTransactions(); 
} 

Với mã trên, khi hoạt động này được tạo ra lần đầu tiên, nó cho thấy Fraga một cách chính xác, nhưng trong trường hợp tôi nhấn phím Home và sau đó chuyển trở lại hoạt động của tôi (để kích hoạt lại onResume), tất cả sẽ trống (có vẻ như fragA bị xóa).

Việc thay thế một đoạn đã thêm trước đó có tự xóa không? hoặc làm thế nào để không mất một mảnh nếu nó được thay thế bởi chính nó?

Trả lời

4

Bạn không thể thay thế một đoạn bằng chính nó. Nửa đầu của thay thế là loại bỏ đoạn trước đó tại id đó. Khi một đoạn bị xóa, nó không thể được người quản lý phân mảnh thêm vào hoặc sử dụng nữa (vì vậy phần thêm của phần thay thế sẽ không hoạt động đúng).

Tùy thuộc vào trường hợp sử dụng của bạn, bạn có hai lựa chọn:

  1. Tạo một mảnh mới thay vì tái sử dụng các ví dụ hiện
  2. Sử dụng một số phương pháp khác để xem nếu nó cần thiết để thay thế đoạn bạn

Cuối cùng, có thể bạn không cần phải gọi executePendingTransactions.

+0

Tôi khởi tạo ** fragA ** in * onCreate *, có nghĩa là tôi liên tục tham chiếu đến đoạn của mình. Vậy tại sao nó không cho phép thêm nó sau khi loại bỏ đoạn đó? – waqaslam

+0

Vì chính xác những gì tôi đã nói. Một khi bạn loại bỏ một thể hiện của một mảnh, bạn không thể thêm nó nữa. Của nó bị phá hủy, hoàn thành, không còn sử dụng được nữa. –

+0

Một điều khác cần kiểm tra là R.id.myLayout là id của vùng chứa mà bạn muốn đưa mảnh vỡ của mình vào. Nếu có, hãy thử chuyển cuộc gọi thay thế của bạn để thay thế (R.id.myLayout, new FragmentAClass()) –

4

Bạn có thể thử:

if(!(getSupportFragmentManager().findFragmentById(R.id.myLayout) instanceof FragmentA)) { 
    FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); 

    trans.replace(R.id.myLayout, fragA); 

    trans.commit(); 
} 

Và tôi cho rằng Fraga là FragmentA đối tượng lớp.

+0

'R.id.myLayout' trỏ đến bố cục trong đó ** fraga ** được tiêm. Tôi không nghĩ 'findFragmentById (R.id.myLayout)' sẽ trả lại cho tôi tham chiếu đến đoạn của tôi. – waqaslam

+0

Nếu đoạn của bạn nằm trong vùng chứa này thì nó sẽ trả về một tham chiếu đến đoạn được tiêm này. Sau đó, bạn có thể kiểm tra xem nó là ví dụ của lớp của mảnh của bạn. –

+0

công trình này, và nó là giải pháp khá thú vị nếu bạn đang tạo ra các mảnh vỡ bên trong các mảnh vỡ. –

3

Cuối cùng, tôi phải đặt séc trước khi thay thế các mảnh vỡ. Trong trường hợp, một đoạn (đã được thêm vào) được yêu cầu để thay thế một lần nữa, tôi đã phải kiểm tra nếu nó đã được thêm vào sau đó bỏ qua việc thay thế, khác tiến hành. Ví dụ:

@Override 
protected void onResume() { 
    if (!fragA.isAdded()) { 
     FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); 
     trans.replace(R.id.myLayout, fragA); 
     trans.commit(); 
     //getSupportFragmentManager().executePendingTransactions(); //unnecessary 
    } 
} 
Các vấn đề liên quan