前提・実現したいこと
お世話になります。
Android StudioとKotlinを使って
長い処理中にProgressBarStyleを表示させるプログラムを作りたいです。
- ボタンを押す
- くるくる回るProgressBarStyleを表示
- 長い処理
- ProgressBarStyleを非表示
このようなイメージです。
発生している問題
色々試してみましたが
・ProgressBarStyleが表示されない
・処理が終わった後にProgressBarStyleが表示される
このような状況になってしまい、実現したいことにたどり着いていません。
どうすればよいか教えてくださいませ。
該当のソースコード
MainActivity.kt
package com.example.progressbarstyletest import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.ProgressBar import com.example.progressbarstyletest.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) binding.button.setOnClickListener{ binding.progressBar.visibility = ProgressBar.VISIBLE //プログレスバー表示 nagaisyori() binding.progressBar.visibility = ProgressBar.INVISIBLE //プログレスバー非表示 } } fun nagaisyori() { //長い処理 var sum = 0.0 for(i in 0..1000000000) { sum += i } binding.textView1.setText("処理が終わりました") } }
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.72" /> <ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyle" 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_toTopOf="parent" android:visibility="invisible"/> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" app:layout_constraintBottom_toTopOf="@+id/progressBar" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
試したこと
binding.progressBar.visibility = ProgressBar.VISIBLE
によりプログレスバーの表示が出来ることは確認しました
以下のようにすると、プログレスバーが表示されてないように見える。
binding.progressBar.visibility = ProgressBar.VISIBLE //プログレスバー表示 nagaisyori() binding.progressBar.visibility = ProgressBar.INVISIBLE //プログレスバー非表示
以下のようにしてみた所、なぜか長い処理が終わった後にプログレスバーがくるくる回り始めてしまう。
binding.progressBar.visibility = ProgressBar.VISIBLE //プログレスバー表示 nagaisyori()
WEBの記事を見つけて以下のような記述をしてみたけどそもそもエラーになってしまう。引数が空のnagaisyori()に入れようとしてるのでエラーが出るのは理解できます。
binding.progressBar.visibility = ProgressBar.VISIBLE nagaisyori{ binding.progressBar.visibility = ProgressBar.INVISIBLE }
「コールバックを使え」と書いてありましたが理解できませんでした。
海外のstackoverflowに、「そもそも同じスレッドだから実現できない。ASyncTaskを使え」という記述を見かけました。
またや「コルーチン」のヒントになりそうな単語が出てきて調べていますが、理解が出来ていない状態です。
progressBarという用意されたViewの一般的な使い方だと思うのでそんなに難しいコードは書かないだろうと思って、
かれこれ半日さまよっていまして‥よろしくお願いいたします。m(__)m
補足情報(FW/ツールのバージョンなど)
Windows 10 10.0
Android Studio 4.1.3
Build #AI-201.8743.12.41.7199119, built on March 11, 2021
Runtime version: 1.8.0_242-release-1644-b01 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
GC: ParNew, ConcurrentMarkSweep
Memory: 1237M
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/26 21:06
2021/03/26 21:27 編集
2021/03/26 21:44