이쁜 디자인을 쓰려면 외부 라이브러리를 사용해야한다.
나는 안드로이드 기본 레이아웃을 쓸것임.
먼저 gradle에 추가해줘야한다.
https://developer.android.com/jetpack/androidx/releases/swiperefreshlayout?hl=ko
여기를 가면 최신버전을 찾을 수 있다.
나는 간단하게 타이머를 만들어서 위로 당기면 처음부터 다시 시작하는 것을 구현했다.
*데이터바인딩을 사용했음.
<data>
<variable
name="click"
type="android.view.View.OnClickListener" />
</data>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{click}"
android:text="start"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.272"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/btn_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{click}"
android:text="stop"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@id/btn_start" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
SwipeRefreshLayout으로 감싸주면 된다.
isRefreshing=false
이 옵션을 써줘야 refresh됐을때 프로그래스바?가 계속 안돈다.
class MainActivity : AppCompatActivity(), View.OnClickListener {
lateinit var binding: ActivityMainBinding
lateinit var job:Job
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this,R.layout.activity_main)
binding.click=this
binding.refresh.setOnRefreshListener {
binding.refresh.isRefreshing=false
job.cancel()
startTimer()
}
}
override fun onClick(view: View?) {
when(view?.id){
R.id.btn_start -> {
startTimer()
}
R.id.btn_stop -> {
job.cancel()
}
}
}
private fun startTimer() {
var time = 0
job= CoroutineScope(Dispatchers.Default).launch {
while (true){
delay(1000)
time++
withContext(Dispatchers.Main){
binding.tvTitle.text=time.toString()
}
}
}
}
}
성공!