[실용편] Kotlin Progressbar (Horizontal) 사용법

소개



이번에는 AndroidStudio에서의 앱 개발에 사용되는 Progressbar의 간단한 구현을 해 나가고 싶습니다.
Progressbar의 설치 방법의 기사는 있었습니다만, 실용적인 실장 방법이 기재된 기사가 없었기 때문에 메모 정도에 남겨 가고 싶습니다.

이번 기사는 해외 동영상에서 가져온 정보이므로 자세한 해설은 할 수 없습니다.
(영어할 수 없어서 죄송합니다...)
참고로 한 동영상
6분 정도를 볼 수 있으면 코드가 쓰여진 곳입니다.

만들기



activity_main.xml



간단한 구현을 위해
  • 시작하기위한 버튼
  • ProgressBar(Horizontal)
  • 결과 표시 텍스트

  • 을 최종적으로 아래의 이미지와 같이 설치해 가고 싶습니다.



    먼저 각 부품을 이미지처럼 설치하십시오.
    (굉장히 던지고...)

    계속해서, 버튼과 텍스트·ProgressBar의 각종 설정을 실시해 갑니다.

  • 버튼
  • id -> startButton
  • text -> start


  • ProgressBar
  • layout_width -> 250dp
  • max -> 100
  • progress -> 0


  • 텍스트
  • id -> resultText
  • text -> (빈)
  • 스패너 마크 text -> Complete!!


  • 스패너 마크란?

    이런 마크가 붙은 속성
    이렇게 하면 text의 값을 가설할 수 있다.

    MainActivity.kt



    이번에는 startButton을 누르면 변수 i가 100이 될 때까지 ProgressBar를 작동시키는 프로그램을 작성합니다.

    MainActivity.kt
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            // それぞれのViewを格納
            val startButton = findViewById<Button>(R.id.startButton)
            val progressBar = findViewById<ProgressBar>(R.id.progressBar)
            val resultText = findViewById<TextView>(R.id.resultText)
            // UI処理をするためにHandlerクラス生成
            val handler = Handler(Looper.getMainLooper())
    
    
            // startButtonが押された時の処理
            startButton.setOnClickListener {
               // テキストをリセット
          resultText.text = ""
                thread {
                    var i = 0
                    while (i < 100) {
                        i++
                        // 50ミリ秒間待機
                        // これを設置する理由は、ないと一瞬で終わっちゃうから...
                        android.os.SystemClock.sleep(50)
                        // メインスレッドに接続してからUI処理
                        handler.post {
                            // progressで現在の進捗率を更新
                            progressBar.progress = i
                        }
                    }
                    handler.post {
               // iが100になったら表示
                        resultText.text = "Complet!!"
                    }
                }
    
            }
        }   
    

    아니~, java와 비교해 상당히 깨끗이 하고 있네요.
    kotlin에서는 ``thread''나 ``handler.post''와 같은 것은 SAM 변환 할 수 있습니다.
    자세한 것은 쓰지 않습니다만, 간단하게 말하면 메소드를 하나 밖에 가지지 않는 Java 인터페이스를 kotlin이라고 보다 간결하게 쓸 수 있어요라고 하는 구조입니다.

    이야기가 있었습니다만 해설해 가고 싶습니다.

    우선 thread {} 를 사용하는 이유입니다만, 잘 모르겠습니다. . . (하?)
    특히 인터넷을 사용한 처리도 방대한 처리를 하고 있는 것도 아닌데, 왜 스레드를 나눌 필요가 있는지 자신도 모릅니다. 어쩌면 ProgressBar를 사용하는 경우 스레드를 분리하는 것이 결정적인 것일 수 있습니다.
    만약 아는 분이 계시면 코멘트 해 주시면 다행입니다. . .
    (힘 부족으로 죄송합니다)

    계속해서 handler.post 하지만,
    이것은 thread를 나누어 메인 thread로부터 벗어났기 때문에 일시적으로 메인 thread에 접속하기 위한 처리입니다.
    ProgressBar나 resultText의 갱신을 위해서 UI의 조작을 하지 않으면 안됩니다만, UI의 조작은 메인 thread가 아니면 할 수 없습니다. 그 때문에 Handler(Looper.getMainLooper()) 로 메인 thread에 접속하기 위한 클래스를 생성해 handler.post {} 로 UI 조작을 하고 있다고 하는 것입니다.

    동작 확인



    startButton을 누르면 ProgressBar가 진행률을 표시하고,
    처리가 끝나면 resultText에 Complete!!라고 표시해 줍니다.

    좋은 웹페이지 즐겨찾기