【问题标题】:How to show custom ProgressBar in AsyncTask?如何在 AsyncTask 中显示自定义 ProgressBar?
【发布时间】:2021-12-16 19:01:21
【问题描述】:

我有一个自定义 ProgressBar:

drawable/circle.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape
            android:shape="ring"
            android:thicknessRatio="16"
            android:useLevel="false">
            <solid android:color="#DDD" />
        </shape>
    </item>
    <item>
        <rotate
            android:fromDegrees="270"
            android:toDegrees="270">
            <shape
                android:shape="ring"
                android:thicknessRatio="16"
                android:useLevel="true">
                <gradient
                    android:endColor="#00101f"
                    android:startColor="#0078ff"
                    android:type="sweep" />
            </shape>
        </rotate>
    </item>
</layer-list>

values/styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="Widget.App.CustomProgressBar" parent="Widget.AppCompat.ProgressBar">
        <item name="android:indeterminateOnly">false</item>
        <item name="android:progressDrawable">@drawable/circle</item>
    </style>
</resources>

layout/custom_progress_bar.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <ProgressBar
        android:id="@+id/customProgressBar"
        style="@style/Widget.App.CustomProgressBar"
        android:layout_width="200dp"
        android:layout_height="200dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:progress="0"
        android:min="0"
        android:max="100"
        />

    <TextView
        android:id="@+id/textViewProgress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="@style/TextAppearance.AppCompat.Large"
        app:layout_constraintBottom_toBottomOf="@+id/customProgressBar"
        app:layout_constraintEnd_toEndOf="@+id/customProgressBar"
        app:layout_constraintStart_toStartOf="@+id/customProgressBar"
        app:layout_constraintTop_toTopOf="@+id/customProgressBar"
        android:text="0 %"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

我希望它在后台加载一些数据时显示在活动之上。我试过这个:

ProgressBar progressBar;

public class LoadData extends AsyncTask
    {

        @Override
        protected void onPreExecute()
        {
            super.onPreExecute();
            progressBar = new ProgressBar(MyActivity.this, null, 0, R.layout.custom_progress_bar);
            //MyActivity uses ConstraintLayout
            ConstraintLayout cl = findViewById(R.id.constraintLayout);
            ConstraintLayout.LayoutParams lp = new ConstraintLayout.LayoutParams(
                    ConstraintLayout.LayoutParams.WRAP_CONTENT,
                    ConstraintLayout.LayoutParams.WRAP_CONTENT
            );
            progressBar.setLayoutParams(lp);
            progressBar.setVisibility(View.VISIBLE);
            cl.addView(progressBar);
        }

        @Override
        protected Object doInBackground(Object[] objects)
        {
            //load some data here
        }

        @Override
        protected void onPostExecute(Object o)
        {
           progressBar.setVisibility(View.GONE);
        }
    }

但是,它不起作用 - 后台任务正在执行,但没有显示 ProgressBar。如何使用 AsyncTask 在活动顶部显示我的 ProgressBar?

【问题讨论】:

  • progressBar.show(); ?
  • @blackapps 没有用
  • 您将自定义布局用于新的进度条。但是您的布局已经包含一个进度条。在tutlane.com/tutorial/android/android-progressbar-with-examples 中,您的自定义布局用作活动的布局。
  • 您还可以构建一个自定义类扩展 ProgressBar。

标签: java android xml android-asynctask android-progressbar


【解决方案1】:

我找到了一种方法来做我该做的事:

public class LoadData extends AsyncTask
    {
        //Dialog in fullscreen
        Dialog dlg = new Dialog(MyActivity.this, android.R.style.Theme_Light_NoTitleBar_Fullscreen);
        //View with custom_progress_bar layout
        View customProgress = LayoutInflater.from(MyActivity.this).inflate(R.layout.custom_progress_bar, null, false);

        //Elements of custom ProgressBar layout
        ProgressBar progressBar = customProgress.findViewById(R.id.customProgressBar);
        TextView progressText = customProgress.findViewById(R.id.textViewProgress);

        @Override
        protected void onPreExecute()
        {
            super.onPreExecute();
            dlg.setContentView(customProgress);
            dlg.show();
        }

        @Override
        protected Object doInBackground(Object[] objects)
        {
            int i = 0;
            while (i <= 100)
            {
                try {
                    // Sleep for 100 milliseconds to show the progress slowly.
                    Thread.sleep(100);
                    //calls onProgressUpdate
                    publishProgress(i);
                    i += 1;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            //load some data here
        }

        @Override
        protected void onProgressUpdate(Object[] values) {
            super.onProgressUpdate(values);
            //Updates values of layout elements
            progressBar.setProgress(Integer.parseInt(String.valueOf(values[0])));
            progressText.setText(values[0] + " %");
        }

        @Override
        protected void onPostExecute(Object o)
        {
            //Dismisses dialog
            dlg.dismiss();
        }
    }

基本上,我创建了一个视图,将其设置为 custom_progress_bar 布局,并使用提到的视图填充了一个对话框。在执行时,我显示 Dialog 并仅更新其布局元素的值。

【讨论】:

  • 不错。干得好。
猜你喜欢
  • 2016-12-19
  • 1970-01-01
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
相关资源
最近更新 更多