繁体   English   中英

两个活动之间的android加载圈(微调器)

[英]android loading circle (spinner) between two activity

我有一个主要活动,其中有简单的按钮和与之关联的侦听器。 每个按钮都会打开一个新活动(意图)。 但是,在打开活动时,加载需要一些时间,这会导致 UI 冻结。 我想通过简单地在两者之间添加一个加载圈(微调器)来避免这种情况。 我搜索了很多帖子,但仍然找不到任何东西。

通过加载圈我的意思是这个

图片

那是一个Progress Bar 您可以通过编程方式或使用 XML 中的小部件来创建它。

在 XML 中实现:

<ProgressBar
    android:id="@+id/progress_loader"
    style="?android:attr/progressBarStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:visibility="visible" />

要在 Java 中实现(使用您在评论中询问的Progress Dialog ,但您也可以使用Progress Bar执行此操作):

 ProgressDialog nDialog;
 nDialog = new ProgressDialog(Login.this);
 nDialog.setMessage("Loading..");
 nDialog.setTitle("Get Data");
 nDialog.setIndeterminate(false);
 nDialog.setCancelable(true);
 nDialog.show();

在进行下一个活动之前,您应该dismiss()进度条。

  nDialog.dismiss();

只需在第二个活动中使用以下代码

<ProgressBar
    android:id="@+id/progress_loader"
    style="?android:attr/progressBarStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:visibility="visible" />

完成初始化后使可见性消失

您无法通过添加加载小部件来避免 UI 冻结。 您必须找到阻塞主线程的代码并将其移至工作线程。 查看Android 文档中的“Helper classes for threading”。 如果不显示您现有的代码(因此我们知道什么是阻塞的),我们无法进一步建议您。

其次,如果您想在视图事务之间显示加载小部件,您可以重组应用程序以使用片段 一个活动可以用来在你的片段之间切换,它也可以包含可以在改变片段之前可见的小部件,一旦完成则不可见。

尝试这样做

ProgressDialog progressDoalog;

progressDoalog = new ProgressDialog(DetailsActivity.this);
        progressDoalog.setMax(100);
        progressDoalog.setMessage("Please wait...");
        progressDoalog.setTitle("My Application");
        progressDoalog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDoalog.show();
        final Handler handle = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                progressDoalog.incrementProgressBy(1);
            }
        };
new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            while (progressDoalog.getProgress() <= progressDoalog
                                    .getMax()) {
                                Thread.sleep(30);
                                handle.sendMessage(handle.obtainMessage());
                                if (progressDoalog.getProgress() == progressDoalog
                                        .getMax()) {
                                    progressDoalog.dismiss();
                                }
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }).start();

2022 年解决方案。

ProgressDialog p = new ProgressDialog(getActivity());
p.setMessage("Connecting ...");
p.setCancelable(false);
p.show();
  • 你肯定想要 Cancelable false ,否则用户可以移动它!

  • indeterminate 什么都不做,不要使用

  • 无题

  • 一旦您的服务器回复:

     p.dismiss();

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM