ProgressBar在工作完成后变为可见

问题描述 投票:0回答:1

我在Android Studio中制作了一个简单的数独求解器应用程序,试图解决任何给定的N x M数独。对于尺寸为4 x 4的电路板,这可能需要花费几秒钟的时间,因此我希望在计算完成时运行不确定的ProgressBar。

当用户按下按钮时,SolveSudoku()运行。首先,它将ProgressBar设置为可见,运行求解逻辑,然后再次将其隐藏。问题是ProgressBar仅在解决数独并打印到屏幕后才显示。我该如何解决?

activity_sudoku.xml

<ProgressBar
    android:id="@+id/progressBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="parent"
    style="?android:attr/progressBarStyleLarge"
    android:visibility="invisible"
    android:indeterminate="true"
    android:elevation="8dp"/>

SudokuActivity.java

private ProgressBar progBar = findViewById(R.id.progressBar);

public void SolveSudoku(View v){
    progBar.setVisibility(View.VISIBLE);
    try{
        //Solving logic
    }
    catch(Exception ex){
        //Error handling for invalid inputs, etc..
    }
    finally{
        progBar.setVisibility(View.INVISIBLE);
    }
}

如果我在最后一条中评论代码行,则在得到结果后,微调器将继续旋转。但就目前而言,ProgressBar根本不显示。任何帮助表示赞赏!

android android-progressbar
1个回答
0
投票

您选择?android:attr/progressBarStyleLarge的ProgressBar的样式是一个微调器。

如果同时需要微调器和进度条,则应在xml中添加2个单独的ProgressBar视图,并以不同的方式设置它们的样式。

为了将ProgressBar设置为实际的加载进度条,可以使用?android:attr/progressBarStyleHorizontal

这是一个同时包含微调器和进度条的示例布局:

    <ProgressBar
        android:id="@+id/spinner_progress_bar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        style="?android:attr/progressBarStyleLarge"
        />

    <ProgressBar
        android:id="@+id/actual_progress_bar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@id/spinner_progress_bar"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        style="?android:attr/progressBarStyleHorizontal"
        />

现在,如果需要进度条,则应手动更新其进度。这是一个示例片段,可在1秒内将进度条从0更新为完整。

        final ProgressBar progressBar = findViewById(R.id.actual_progress_bar);
        progressBar.setMax(100);

        new Thread(
                () -> {
                    try {
                        int a = 0;
                        while (a <= 100) {
                            final int weakA = a;
                            runOnUiThread(() -> progressBar.setProgress(weakA));
                            a++;
                            Thread.sleep(10);
                        }
                    } catch (InterruptedException e) {

                    }
                }
        ).start();

想法是:您应该自己计算算法的进度并相应地进行设置。记住要始终在runOnUiThread()方法中调用ProgressBar.setProgress(int)(或与此相关的任何视图特定方法),否则会出现错误。

© www.soinside.com 2019 - 2024. All rights reserved.