当前位置: 首页 > 知识库问答 >
问题:

如何在AsyncTask中显示自定义ProgressBar?

龙才俊
2023-03-14

我有一个自定义ProgressBar:

<?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>
<?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>
<?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?

共有1个答案

丁雅懿
2023-03-14

我找到了一个做我所做的事情的方法:

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布局,并用提到的视图膨胀一个对话框。在执行时,我显示对话框,并只更新其布局元素的值。

 类似资料:
  • 我是新来的wordpress, im创建一个自定义职位与字段的custom_meta_box(位置,着装) 所以在我的自定义帖子列表中,我想查看我在custom_meta_box上创造的价值。 这是我目前的代码:

  • 是否有一种方法可以在WooCommerce订单页面的每个产品下显示我的自定义SKU? 当我编辑产品时,自定义sku显示良好,但它不会显示在产品的订单页面中。我需要在订单上显示此信息,以便Zapier可以将其与产品的Visma帐户软件ArticleID匹配。 此尝试基于如何向WooCommerce产品添加(第二个)自定义sku字段的解决方案?

  • 您好,我正在使用。 }下面是各自的xml: 在适配器获取视图:公共视图getView(int位置,视图转换视图,ViewGroup父){ ImageLoader。从这里开始的Java 在从服务器加载映像之前,如何在中显示临时映像。

  • 我正在我的Wordpress公文包网站上工作,并为我的公文包部分创建了一个自定义帖子类型。当用户单击my portfolio链接时,会将他们带到archive-portfolio.php,其中显示我所有项目的图库;当用户单击项目时,会将他们带到single-portfolio.php,其中显示关联的项目。 一切都正常工作,样式正确,但现在我想让archive-portfolio.php上的gall

  • 问题内容: 我正在尝试显示一个ProgressBar。 我是Android初学者。 当我按下按钮时,任务应该在后台运行,但是它不会显示ProgressBar。 怎么了 我不明白。 请帮我! 主要活动: 我的任务: 问题答案: 您没有调用的方法。

  • 我正在使用Bootstrap的DateTimePicker,我正在加载带有多行的视图,每个人都有一个datetimepicker,我正在从数据库中预加载带有时间戳的值,例如datetime: 这工作得很好,但是我想以格式显示DD/MM/YYYY HH: mm: ss我把它放在格式选项上,如下所示: 但这不起作用,这给我加载了一个空字段。然后,我尝试使用data属性,将其添加到HTML标记中: 但是