我在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: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)
(或与此相关的任何视图特定方法),否则会出现错误。