Cách tốt nhất để hiển thị một chỉ báo tải / tiến độ?


146

Cách tốt nhất để hiển thị một spinner tải trong khi ứng dụng đang chờ phản hồi từ máy chủ là gì?

Điều này có thể được thực hiện theo chương trình? Vì vậy, tôi không phải thêm spinner tải trong tệp xml?

Câu trả lời:


293

ProgressDialog không được dùng từ Android Oreo. Sử dụng ProgressBar thay thế

ProgressDialog progress = new ProgressDialog(this);
progress.setTitle("Loading");
progress.setMessage("Wait while loading...");
progress.setCancelable(false); // disable dismiss by tapping outside of the dialog
progress.show();
// To dismiss the dialog
progress.dismiss();

HOẶC LÀ

ProgressDialog.show(this, "Loading", "Wait while loading...");

Đọc thêm tại đây.

Nhân tiện, Spinner có một ý nghĩa khác trong Android. (Giống như thả xuống chọn trong HTML)


1
Từ trang web dành cho nhà phát triển Android: STYLEClickINNER Tạo một ProgressDialog với một thanh tiến trình xoay tròn.
Tequilaman

34
Điều này hoạt động, nhưng khi tôi kiểm tra điều này, tôi có thể loại bỏ hộp thoại bằng cách chạm vào màn hình bên ngoài nó hoặc nhấn nút Quay lại . Tôi đã sửa lỗi này bằng cách thêm một cuộc gọi đến progress.setCancelable(false);.
Sam

1
Cảm ơn các bình luận dưới cùng. Tôi phát điên vì tôi đang cố gắng để 'spinner' hoạt động trong một giờ.
Có thể Poyrazoğlu

tuyệt vời, bây giờ tôi có thể sử dụng hộp thoại tiến trình
Faisal

10
ProgressDialogđã bị phản đối trong nhà phát triển
O.android.com/reference/android/app/ProTHERDialog.html

17

ProgressDialog đã không còn được sử dụng kể từ API cấp 26 https://developer.android.com/reference/android/app/ProTHERDialog.html

Tôi bao gồm một ProgressBar trong bố cục của tôi

   <ProgressBar
        android:layout_weight="1"
        android:id="@+id/progressBar_cyclic"
        android:visibility="gone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minHeight="40dp"
        android:minWidth="40dp" />

và thay đổi khả năng hiển thị của nó thành .GONE | .VISIBLE tùy thuộc vào trường hợp sử dụng.

    progressBar_cyclic.visibility = View.VISIBLE

Không chắc chắn, nhưng ProgressBar có chạy luôn ở chế độ nền (chỉ bị ẩn khỏi UI) sau khi ẩn nó không?
Shambhu

16

Sử dụng ProgressDialog

ProgressDialog.show(Context context, CharSequence title, CharSequence message);

nhập mô tả hình ảnh ở đây

Tuy nhiên, đây được coi là một mẫu chống ngày hôm nay (2013): http://www.youtube.com/watch?v=pEGWcMTxs3I


12
@artworkad シ Vậy khía cạnh nào của điều này được coi là xấu - câu trả lời được chấp nhận có phải là một ví dụ về cùng một kiểu chống? Và những gì được khuyến khích để làm thay thế? Liên kết đến một video ngoại vi về nhiều vấn đề UX không thực sự cải thiện câu trả lời này.
LarsH

2
ProgressDialogđã bị phản đối trong nhà phát triển
O.android.com/reference/android/app/ProTHERDialog.html

9

Trên thực tế nếu bạn đang chờ phản hồi từ máy chủ thì nên thực hiện theo chương trình. Bạn có thể tạo một hộp thoại tiến trình và loại bỏ nó, nhưng một lần nữa, đó không phải là "cách android".

Hiện tại phương pháp được đề xuất là sử dụng DialogFragment :

public class MySpinnerDialog extends DialogFragment {

    public MySpinnerDialog() {
        // use empty constructors. If something is needed use onCreate's
    }

    @Override
    public Dialog onCreateDialog(final Bundle savedInstanceState) {

        _dialog = new ProgressDialog(getActivity());
        this.setStyle(STYLE_NO_TITLE, getTheme()); // You can use styles or inflate a view
        _dialog.setMessage("Spinning.."); // set your messages if not inflated from XML

        _dialog.setCancelable(false);  

        return _dialog;
    }
}

Sau đó, trong hoạt động của mình, bạn đặt trình quản lý Fragment và hiển thị hộp thoại sau khi chờ máy chủ bắt đầu:

FragmentManager fm = getSupportFragmentManager();
MySpinnerDialog myInstance = new MySpinnerDialog();
}
myInstance.show(fm, "some_tag");

Khi máy chủ của bạn đã phản hồi hoàn tất, bạn sẽ loại bỏ nó:

myInstance.dismiss()

Hãy nhớ rằng Progressdialog là một spinner hoặc thanh tiến trình tùy thuộc vào các thuộc tính, đọc thêm về hướng dẫn api


ProgressDialog.show (Bối cảnh bối cảnh, tiêu đề CharSequence, thông báo CharSequence); Truyền tham số tiêu đề dưới dạng chuỗi rỗng sẽ xóa tiêu đề: ProgressDialog.show (bối cảnh, "", "Đang tải ..");
Rajendra

1
Ví dụ tốt, mặc dù tôi vẫn có thể sử dụng nút quay lại. Tôi nghĩ rằng đó là do biến dlgAlert của bạn (và nó đến từ btw? :)). Dù sao - vì bạn đang mở rộng hộp thoại, bạn chỉ cần gọi set Hủy được (sai) và nó sẽ hoạt động.
Lasse

Thực hiện các giao dịch phân mảnh tại một thời điểm không xác định khi máy chủ trả về phản hồi dường như không phải là bằng chứng ngu ngốc. Ví dụ: khi phản hồi trở lại, hoạt động lưu trữ đoạn có thể ở trạng thái sai. Bất kì giải pháp nào?
Jonas

Đảm bảo bạn đang nhập android.support.v4.app.DialogFragment chứ không phải android.app.DialogFragment hoặc bạn không thể sử dụng getSupportFragmentManager (xem stackoverflow.com/questions/27514338/iêu )
StCleezy

ProgressDialogđã bị phản đối trong nhà phát triển
O.android.com/reference/android/app/ProTHERDialog.html

6

Đây là cách tôi đã làm điều này để mỗi lần chỉ có thể mở một hộp thoại tiến trình. Dựa trên câu trả lời từ Suraj Bajaj

private ProgressDialog progress;



public void showLoadingDialog() {

    if (progress == null) {
        progress = new ProgressDialog(this);
        progress.setTitle(getString(R.string.loading_title));
        progress.setMessage(getString(R.string.loading_message));
    }
    progress.show();
}

public void dismissLoadingDialog() {

    if (progress != null && progress.isShowing()) {
        progress.dismiss();
    }
}

Tôi cũng đã phải sử dụng

protected void onResume() {
    dismissLoadingDialog();
    super.onResume();
}

1
ProgressDialogđã bị phản đối trong nhà phát triển
O.android.com/reference/android/app/ProTHERDialog.html
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.