显示加载/进度指示器的最佳方法?


Answers:


293

从Android Oreo不推荐使用ProgressDialog。使用进度条代替

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...");

在这里阅读更多。

顺便说一句,Spinner在Android中具有不同的含义。(就像HTML中的选择下拉列表一样)


1
在Android Developer网站上:STYLE_SPINNER创建一个带有圆形旋转进度条的ProgressDialog。
龙舌兰酒

34
这可以正常工作,但是当我对此进行测试时,可以通过触摸对话框外部的屏幕或按“ 后退”按钮来关闭该对话框。我通过添加一个呼叫来解决此问题progress.setCancelable(false);
山姆

1
感谢您的底部评论。我发疯了,因为我试图让“纺纱工”工作一个小时。
CanPoyrazoğlu16年

棒极了,现在我可以使用进度对话框
Faisal


17

自API级别26开始不推荐使用ProgressDialog 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

不确定,但是progressBar使其不可见后,它是否总是在后台运行(仅对UI隐藏)?
Shambhu

16

ProgressDialog

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

在此处输入图片说明

但是,今天(2013年)认为这是一种反模式:http//www.youtube.com/watch?v = pEGWcMTxs3I


12
@artworkadシ那么,此问题的哪个方面被认为是不好的-接受的答案是否是相同反模式的示例?而建议怎么做呢?链接到有关多个UX问题的非现场视频并不能真正改善此答案。
LarsH


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;
    }
}

然后在活动中设置片段管理器,并在等待服务器启动后显示对话框:

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

服务器响应完成后,将其关闭:

myInstance.dismiss()

请记住,progressdialog是微调器还是进度条,具体取决于属性,请参阅api指南中的更多内容


ProgressDialog.show(上下文上下文,CharSequence标题,CharSequence消息);将title参数作为空字符串传递将删除标题:ProgressDialog.show(context,“”,“ Loading ..”);
拉金德拉(Rajendra)

1
很好的例子,尽管我仍然可以使用后退按钮。我认为这是由于您的变量dlgAlert(以及btw来自何处?:)。无论如何,由于您正在扩展dialogfragment,因此只需调用setCancelable(false)即可。
拉瑟2014年

在服务器返回响应时不确定的时间内提交片段事务似乎并非万无一失。例如,当响应返回时,承载该片段的活动可能处于错误状态。有什么办法吗?
乔纳斯(Jonas)2016年

请确保您要导入android.support.v4.app.DialogFragment而不是android.app.DialogFragment,或不能使用getSupportFragmentManager(见stackoverflow.com/questions/27514338/...
StCleezy


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.