2011-09-04 48 views
32

Tôi đã tìm kiếm ở khắp mọi nơi và tôi không thể tìm thấy giải pháp cho vấn đề này. Về cơ bản tôi có một màn hình đăng nhập và tôi đang cố gắng để có được một spinner tiến bộ để hiển thị trong khi nó đăng nhập vào máy chủ (thông qua một sợi), và sau đó loại bỏ nó sau khi đăng nhập thành công. Nó phải làm việc trong khi thay đổi định hướng.Thanh tiến trình Android DialogFragment

Tôi đang sử dụng DialogFragment với gói tương thích Android để tạo thanh tiến trình (không thể tìm thấy bất kỳ tài liệu nào trên đó, only for basic\alert dialog) vì showDialog() không còn được dùng nữa. Ngay bây giờ tôi chỉ hiển thị một hộp thông báo tùy chỉnh như một spinner đăng nhập.

Trong Tóm tắt:

  • Làm thế nào tôi có thể thiết lập một spinner Progress với DialogFragment.
  • Làm cách nào tôi có thể loại bỏ nó trong một chuỗi khác sau khi thay đổi hướng.

Trả lời

21

Tôi biết đây là câu hỏi cũ nhưng tôi muốn chia sẻ giải pháp tốt hơn nhiều cho việc này

Theo Phát triển Android Protip:

"Ngừng sử dụng ProgressDialog, các chỉ số Inline là người bạn của bạn"

Là Roman Nurik states:

enter image description here

Điều này nhanh chóng. Ngừng sử dụng ProgressDialog và các phương thức tải khác . Chúng cực kỳ gián đoạn và gây phiền nhiễu, đặc biệt là khi:

  • Bạn sẽ thấy mỗi khi bạn chuyển tab.

  • Bạn không thể Quay lại chúng.

  • Họ nói "Vui lòng đợi". Không, cảm ơn, tôi chỉ muốn gỡ cài đặt.

    chỉ số

Hoặc chương trình tải nội tuyến với nội dung của bạn (ví dụ http://developer.android.com/training/animation/crossfade.html) hoặc tốt hơn chưa, nạp một lượng nhỏ dữ liệu trong nền để bạn giảm thiểu nhu cầu thậm chí hiển thị một tải chỉ số.

Tìm hiểu thêm về tiến trình & hoạt động trong design guidelines.

+1

Để cảnh báo, khi bạn sao chép các từ khác, bạn phải chặn đúng mọi thứ bạn sao chép từ chúng và bạn phải cung cấp liên kết với nguồn gốc. –

+0

Đúng, nhưng còn những trường hợp bạn không thể tiếp tục với ứng dụng cho đến khi nói điều gì đó đã được in thành công? Bởi vì bạn chỉ có thể cập nhật và lưu dữ liệu nếu bản in thành công và nếu không, bạn cần cung cấp cho người dùng cơ hội thử lại/thay đổi dữ liệu, v.v. Tôi chưa tìm cách xử lý tất cả điều này mà không hiển thị chờ đợi spinner. – AgentKnopf

+0

@Zainodis ẩn/vô hình thanh tiến trình nội tuyến và sử dụng Crouton để hiển thị thông báo lỗi, bạn có thể thay đổi tên nút In thành In lại. tất cả phụ thuộc vào nơi bạn gọi ShowProgress (true) ShowProgress (false) để hiển thị nội dung. –

59

Đối với cho thấy một spinner tiến bộ, chỉ cần ghi đè DialogFragment.onCreateDialog() trong đoạn thoại của bạn như thế này (không cần trọng onCreateView()):

@Override 
public Dialog onCreateDialog(final Bundle savedInstanceState) { 
    final ProgressDialog dialog = new ProgressDialog(getActivity()); 
    // 
    dialog.setTitle(R.string.login_title); 
    dialog.setMessage(getString(R.string.login_message)); 
    dialog.setIndeterminate(true); 
    dialog.setCancelable(false); 
    // etc... 
    return dialog; 
} 

Đối gạt bỏ mảnh rằng thoại từ một nơi khác, bạn sẽ cần để nắm giữ số FragmentManager (từ bên trong FragmentActivity hoặc Fragment) tiếp theo của bạn và gọi popBackStack() trên đó (nếu bạn không thực hiện bất kỳ giao dịch phân đoạn nào khác trong thời gian chờ đợi).

Nếu có nhiều bước/phân đoạn giao dịch giữa đoạn hộp thoại tiến trình và hoạt động tiếp theo, bạn có thể cần một trong các phương pháp popBackStack(...) khác có ID hoặc thẻ để bật mọi thứ lên đoạn hộp thoại tiến trình của bạn .

+1

Bạn có setTitle hai lần, nghĩ là bạn muốn nói, dialog.setMessage (R.string.login_message) – worked

+0

@worked Cảm ơn, tôi đã sửa nó - không có 'setMessage (int)' trên 'ProgressDialog', mặc dù vậy, Tôi đã phải sử dụng 'setMessage (String)'. –

+17

Tôi muốn thêm rằng 'DialogFragment' có phương thức' dismiss' có thể được sử dụng để ủng hộ popping stack. Chỉ 'findFragmentByTag', đưa vào' DialogFragment' và 'dismiss()' – Greyson

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