วิธีที่ดีที่สุดในการแสดงตัวบ่งชี้การโหลด / ความคืบหน้า?


146

วิธีที่ดีที่สุดในการแสดงสปินเนอร์ขณะที่แอพกำลังรอการตอบกลับจากเซิร์ฟเวอร์คืออะไร

สามารถทำได้โดยการเขียนโปรแกรมหรือไม่ ดังนั้นฉันไม่ต้องเพิ่ม load spinner ในไฟล์ xml ใช่ไหม

คำตอบ:


293

ProgressDialogถูกคัดค้านจาก Android Oreo ใช้ProgressBarแทน

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();

หรือ

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

อ่านเพิ่มเติมได้ที่นี่

โดยวิธีการที่สปินเนอร์มีความหมายที่แตกต่างใน Android (มันก็เหมือนกับการเลือกแบบเลื่อนลงใน HTML)


1
จากเว็บไซต์นักพัฒนา Android: STYLE_SPINNER สร้าง ProgressDialog ด้วยแถบความคืบหน้าแบบวงกลมและหมุน
Tequilaman

34
งานนี้ แต่เมื่อผมทดสอบนี้ผมสามารถปิดข้อความโดยการสัมผัสหน้าจอด้านนอกของมันหรือกดปุ่มย้อนกลับปุ่ม progress.setCancelable(false);ฉันคงนี้โดยการเพิ่มการเรียกไปยัง
Sam

1
ขอบคุณสำหรับความคิดเห็นด้านล่าง ฉันกำลังจะบ้าเพราะฉันพยายาม 'ปั่น' เพื่อทำงานเป็นเวลาหนึ่งชั่วโมง
สามารถPoyrazoğlu

ยอดเยี่ยมตอนนี้ฉันสามารถใช้กล่องโต้ตอบความคืบหน้า
Faisal

10
ProgressDialogถูกเลิกใช้ใน Android O developer.android.com/reference/android/app/ProgressDialog.html
Ivan Semkin

17

ProgressDialog เลิกใช้แล้วตั้งแต่ระดับ API 26 https://developer.android.com/reference/android/app/ProgressDialog.html

ฉันรวม ProgressBar ไว้ในเลย์เอาต์ของฉัน

   <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" />

และเปลี่ยนการเปิดเผยเป็น. GONE | .VISIBLE ขึ้นอยู่กับกรณีการใช้งาน

    progressBar_cyclic.visibility = View.VISIBLE

ไม่แน่ใจ แต่แถบความคืบหน้าจะทำงานในพื้นหลังเสมอ (เพิ่งซ่อนจาก UI) หลังจากทำให้มองไม่เห็น
Shambhu

16

ใช้ ProgressDialog

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

ป้อนคำอธิบายรูปภาพที่นี่

อย่างไรก็ตามนี่ถือเป็นรูปแบบการต่อต้านวันนี้ (2013): http://www.youtube.com/watch?v=pEGWcMTxs3I


12
@artworkad aspect สิ่งใดที่ถือว่าไม่ดี - คำตอบที่ยอมรับได้เป็นตัวอย่างของรูปแบบการต่อต้านเดียวกันหรือไม่ และแนะนำให้ทำอะไรแทน การลิงก์ไปยังวิดีโอนอกสถานที่เกี่ยวกับปัญหา UX หลายประการไม่ได้ช่วยปรับปรุงคำตอบนี้
LarsH

2
ProgressDialogถูกเลิกใช้ใน Android O developer.android.com/reference/android/app/ProgressDialog.html
Ivan Semkin

9

จริง ๆ แล้วถ้าคุณกำลังรอการตอบสนองจากเซิร์ฟเวอร์ก็ควรทำแบบเป็นโปรแกรม คุณสามารถสร้างกล่องโต้ตอบความคืบหน้าและยกเลิกได้ แต่จากนั้นอีกครั้งซึ่งไม่ใช่ "วิธี Android"

ปัจจุบันวิธีที่แนะนำคือการใช้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;
    }
}

จากนั้นในกิจกรรมของคุณคุณตั้งผู้จัดการ Fragment และแสดงกล่องโต้ตอบเมื่อการรอเซิร์ฟเวอร์เริ่มต้น:

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

เมื่อเซิร์ฟเวอร์ของคุณตอบสนองแล้วคุณจะยกเลิก:

myInstance.dismiss()

โปรดจำไว้ว่า progressdialog เป็นสปินเนอร์หรือแถบความคืบหน้าขึ้นอยู่กับคุณสมบัติอ่านเพิ่มเติมในคู่มือ api


ProgressDialog.show (บริบทบริบทชื่อ CharSequence ข้อความ CharSequence); ผ่านพารามิเตอร์ชื่อเรื่องเป็นสตริงว่างลบชื่อ: ProgressDialog.show (บริบท, "", "กำลังโหลด .. ");
ราเชนท

1
ตัวอย่างที่ดีแม้ว่ามันจะเป็นไปได้ที่ฉันจะใช้ปุ่มย้อนกลับ ฉันคิดว่าเป็นเพราะตัวแปร dlgAlert ของคุณ (และนั่นมาจาก btw? :)) อย่างไรก็ตาม - เนื่องจากคุณกำลังขยายส่วนขยายการโต้ตอบคุณสามารถเรียก setCancelable (false) และมันจะทำงาน
Lasse

การทำธุรกรรมชิ้นส่วนในเวลาที่ไม่แน่นอนเมื่อเซิร์ฟเวอร์ส่งคืนการตอบสนองดูเหมือนจะไม่ได้พิสูจน์โง่ ตัวอย่างเช่นเมื่อการตอบสนองกลับมากิจกรรมที่โฮสต์ชิ้นส่วนอาจอยู่ในสถานะที่ไม่ถูกต้อง ทางออกใด ๆ
Jonas

ตรวจสอบให้แน่ใจว่าคุณกำลังนำเข้า android.support.v4.app.DialogFragment ไม่ใช่ android.app.DialogFragment หรือคุณไม่สามารถใช้ getSupportFragmentManager ได้ (ดูstackoverflow.com/questions/27514338/
......

ProgressDialog เลิกใช้แล้วใน Android O developer.android.com/reference/android/app/ProgressDialog.html
Ivan Semkin

6

นี่คือวิธีที่ฉันทำสิ่งนี้เพื่อให้ไดอะล็อกความคืบหน้าเดียวสามารถเปิดได้ในแต่ละครั้ง จากคำตอบของ 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();
    }
}

ฉันยังต้องใช้

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

1
ProgressDialogถูกเลิกใช้ใน Android O developer.android.com/reference/android/app/ProgressDialog.html
Ivan Semkin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.