我想要一个进度圆圈而不是进度对话框。

19

我想在我的应用程序中展示一个进度圆圈,同时加载数据。我有一个活动,在从一个活动移动到另一个活动时,我正在解析一些XML数据,因此在解析完成之前,我想显示一个环形加载效果。


2
这是我做的方式 https://dev59.com/o2Ik5IYBdhLWcg3wBqGW#22939109 - Ali
7个回答

29

您可以使用一个不确定的进度条来实现圆形加载效果。以下是在XML中实现此效果的方法:

<ProgressBar android:indeterminate="true"
            android:layout_width="50dp" android:layout_height="50dp"
            android:id="@+id/marker_progress" style="?android:attr/progressBarStyle"
            android:layout_gravity="center_vertical|center_horizontal"/>
你可以更改高度和宽度以适应你的需要。当你完成加载后,可以将其可见性更改为View.INVISIBLE或View.GONE。

17

您需要在res/anim文件夹中创建动画xml文件,并在加载数据时调用ImageView的startAnimation,停止加载数据时调用stopAnimation。并将加载图像设置为ImageView,例如:

loading

这是圆形动画xml文件的ID代码。

<?xml version="1.0" encoding="UTF-8"?>
<rotate
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="0"
    android:toDegrees="360"
    android:pivotX="50%"
    android:pivotY="50%"
    android:repeatCount="infinite"
    android:duration="1200" 
    android:interpolator="@android:anim/linear_interpolator" />

我正在使用自定义适配器的列表视图,并且我想在该列表视图中显示加载效果。我该如何知道解析已完成并停止此动画? - ta54
我也在使用ListView。当另一个线程解析XML时,我会设置一个特殊的loadingAdapter到ListView中,它只返回一个视图。这个视图是一个填充整个父容器并将图像居中的imageView。当解析线程停止解析时,我会将另一个自定义适配器设置回ListView中,以提供UI元素。 - RomaTTi
你能给我一个使用它的例子吗?谢谢! - Thang BA

4

在两个 View 标签之间插入此内容

<ProgressBar android:id="@+id/loading_spinner"
        style="?android:progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" />

3
为什么不使用进度条UI?
myProgressDialog = ProgressDialog.show(ListingPage.this,"Please Wait", "Loading Date", true);

dan


我不能使用这个进度对话框,因为我的客户不想要它,他想要圆形加载效果。 - ta54
1
ProgressDialog现在已经被弃用。 - JoeTomks

2

使用AsyncTask来加载和解析:

 /**
   * Background task that fetched the content from server and parses the content.
   */
  private class BackgroundLoadingTask extends AsyncTask<InputStream, Void, Boolean> {

    @Override
    protected void onPreExecute() {
      // show the progress bar
      Activity.this.requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
      Activity.this.requestWindowFeature(Window.PROGRESS_VISIBILITY_ON);
    }

    @Override
    protected Boolean doInBackground(InputStream... params) {

      // try to load XML from HTTP server and parse

      return true;
    }


    @Override
    protected void onPostExecute(Boolean parsingError) {
      // hide the progress bar
      Activity.this.requestWindowFeature(Window.PROGRESS_VISIBILITY_OFF);


    }
  }

1
请注意,如果您全屏或隐藏了标题栏,则不是所有这些功能都能正常工作。 - Anthony Graglia
android.util.AndroidRuntimeException: requestFeature() must be called before adding content - dentex

1

稍微解释一下trgraglia的回答,您可以创建一个不确定进度(behavior: cycle)进度条,并将其可见性设置为false。在AsyncTask的preExecute()期间,使其可见,在AsyncTask的onPostExecute()期间,将其变为不可见(前提是您留在同一个活动或需要的情况)。这样可以避免创建动画的需求。


1
就像你使用进度对话框一样,使用异步任务来代替,并在预执行时将其设置为可见,然后在后执行时隐藏它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接