8

Tôi có một DialogDragment mà tôi có thể hiển thị một trong hai cách:DialogFragment hiển thị từ onContextItemSelected không tồn tại onPause/onResume

1) Bằng cách khai thác trên một mục ListView từ OnItemClickListener nó

2) Bằng cách kích hoạt menu ngữ cảnh của ListView và chọn mục menu

Làm # 1 hoạt động tốt trong mọi sự kiện vòng đời, nhưng nếu tôi gọi nó qua # 2 và tôi tạm dừng hoạt động (bằng cách đi Trang chủ) và tiếp tục lại thông qua trình chuyển tác vụ , hộp thoại không còn hiển thị nữa. Mảnh vỡ ở đó, và tôi có thể xoay thiết bị và hiển thị hộp thoại.

Tôi đã thử nghiệm và nếu tôi đặt hiển thị DialogFragment vào Trình xử lý với độ trễ ít nhất 1/2 giây, nó hoạt động.

Đoạn sau thất bại - nó cho thấy hộp thoại, nhưng sau đó tạm dừng/tiếp tục giấu nó:

public boolean onContextItemSelected(android.view.MenuItem item) { 
    boolean consumed = false; 

    switch (item.getItemId()) { 
    case R.id.menu_item: 
     showMyDialogFragment(); 
     consumed = true; 
     break; 
    } 

    return consumed; 
} 

Vì vậy, các hoạt động của đoạn tiếp theo. Tạm dừng/tiếp tục hiển thị lại hộp thoại chính xác:

public boolean onContextItemSelected(android.view.MenuItem item) { 
    boolean consumed = false; 

    switch (item.getItemId()) { 
    case R.id.menu_item: 
     new Handler().postDelayed(new Runnable() { 
      public void run() { 
       showMyDialogFragment(); 
      } 
     }, 300); 

     consumed = true; 
     break; 
    } 

    return consumed; 
} 

Thay thế độ trễ 300ms giây với độ trễ 0ms hoặc 250ms khiến nó bị hỏng lần nữa. Điều này có thể lặp lại 100% thời gian.

Đây là một hack khủng khiếp rõ ràng, làm tồi tệ hơn bởi hằng số đó có thể phụ thuộc vào tốc độ của thiết bị.

Bất kỳ ai biết tại sao điều này đang diễn ra và/hoặc cung cấp giải pháp tốt hơn? Tôi đã dành hàng giờ cho vấn đề này và đây là điều tốt nhất tôi có thể nghĩ ra.

+0

Tôi nghĩ điều này có thể liên quan đến hoạt ảnh ẩn của menu. Ngay cả một Nexus One cũ, chậm, độ trễ 300ms vẫn hoạt động. –

+0

Nếu bạn có cơ hội, hãy đăng một dự án mẫu hoàn chỉnh thể hiện hiện tượng này, vì tôi muốn xem qua nó. Nếu đó thực sự là lỗi nền tảng, chúng tôi sẽ cần dự án đó để giúp khắc phục sự cố. Ngoài ra, liệu đây có phải là sử dụng đoạn API cấp 11 gốc hay cổng sau của gói Hỗ trợ Android không?Nếu sau này, bạn có chắc chắn rằng bạn đang sử dụng phiên bản mới nhất của JAR hỗ trợ Android không? – CommonsWare

+0

Đây là dự án mẫu trình bày vấn đề: https://github.com/androidmoney/Menu-DialogFragment-Test Điều này xảy ra cả trên bản gốc và gói hỗ trợ. Để hiển thị sự cố, hãy hiển thị hộp thoại hoặc nút hoặc mục menu. Sau đó tạm dừng (đi tới Trang chủ) và tiếp tục (nhập lại ứng dụng bằng trình chuyển đổi ứng dụng). –

Trả lời

2

Tôi khuyên bạn nên hủy hộp thoại trên tất cả các tạm dừng và tạo lại trong onResume tùy thuộc vào trạng thái bất kể cách hộp thoại được gọi. Để làm khác nguy cơ rò rỉ bộ nhớ nếu ứng dụng bị hệ điều hành giết trong khi bị tạm dừng.

Để trả lời rõ ràng câu hỏi của bạn, đừng dựa vào hệ điều hành để duy trì trạng thái ứng dụng của bạn.

+0

Hệ điều hành duy trì trạng thái hộp thoại tốt, mong đợi khía cạnh hiển thị. Nếu tôi xoay màn hình sau đó, hộp thoại sẽ hiển thị lại. Tôi vừa thử nghiệm cùng một điều trong ứng dụng Mọi người trong JB 4.2 và điều tương tự cũng xảy ra. Hộp thoại biến mất trên onPause/onRestore. Đây rõ ràng là một lỗi Android. –

+0

Thực tế nó rất tốt có thể là một lỗi Android. Suy nghĩ của tôi là bạn không nên dựa vào hệ điều hành duy trì trạng thái cho bạn như chỉ là "lỗi" có thể xuất hiện trong phiên bản khác nhau của hệ điều hành. Nếu bạn muốn mong đợi một kết quả nhất định, hãy làm những việc nhỏ như theo dõi trạng thái của chính bạn. Nhiều điều bất ngờ có thể tăng lên. Nó chỉ là lập trình tốt. –

+0

Ok, cảm ơn. Đó có thể là một lời khuyên tốt, mặc dù loại thất bại một trong những lợi thế của việc sử dụng Fragments. –

4

Tôi có thể tái tạo điều này trên Android 4.2 (giả lập ARM và Galaxy Nexus). Tôi không thể tái tạo các phát hiện của bạn trên trình giả lập x86 4.1, Nexus S (4.1) và Motorola RAZR i (4.0). Tôi cũng có thể tái tạo vấn đề bằng cách sửa đổi một trong các mẫu sách của riêng tôi. Tôi đã gửi một vấn đề lên đó, sử dụng mẫu của bạn: http://code.google.com/p/android/issues/detail?id=41901 Vui lòng thêm bất kỳ thông tin nào khác mà bạn cho rằng sẽ giúp họ chẩn đoán sự cố.

Đối với cách giải quyết khác, nếu 300ms hoạt động, thì chúng tôi có một trong những "vấn đề thời gian" đáng yêu và tôi không có ý tưởng mờ nhạt về cách bạn làm việc xung quanh nó, không sử dụng trình đơn để hiển thị nó. Ví dụ, với ứng dụng mẫu của bạn, chỉ cần chuyển sang SHOW_AS_ACTION_ALWAYS (và do đó có nó là một mục trên thanh hành động thay vì trong menu mục bổ sung) là đủ để có DialogFragment hoạt động đúng. Hy vọng rằng, bạn sẽ có một cách để điều chỉnh giao diện người dùng của bạn để bù đắp cho lỗi này, hoặc có lẽ ai đó sẽ nấu một cách khác và đăng nó ở đây hoặc về vấn đề này.

+0

Cảm ơn. Đối với tôi, nó sẽ không thể thiết kế lại ứng dụng của tôi vì tôi rất phụ thuộc vào các hộp thoại từ menu ngữ cảnh và thanh tác vụ tràn. –

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