EditText에 focus가 있고 키보드가 올라가 있고 rvList의 visibility가 gone인 상태에서 레이아웃을 클릭했을 때 Toast 메시지를 띄우고 키보드가 내려가도록 하려고 했는데 메시지는 뜨지 않았고 키보드도 내려가지 않았다.
activity_main.xml
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/layoutDataList"
...
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/editText">
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/layoutSwipeRefresh"
android:layout_width="0dp"
android:layout_height="0dp"
android:visibility="gone"
...>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:visibility="gone" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
if (binding.editText.hasFocus()) {
binding.rvRecipeList.isGone = true
}
}
binding.layoutDataList.setOnClickListener {
if (binding.rvDataList.isGone) {
closeKeyboard(binding.root)
}
binding.rvRecipeList.isVisible = true
}
SwipeRefreshLayout이 자기 영역만큼 클릭 이벤트를 다 잡고 있어서 클릭이 되지 않았던 것이었다. RecyclerView는 gone 되었지만 SwipeRefreshLayout는 visible이었던 것이다. 따라서 RecyclerView가 아닌 SwipeRefreshLayout의 visibility를 조정하니 해결되었다.
MainActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
if (binding.editText.hasFocus()) {
binding.layoutSwipeRefresh.isGone = true
}
}
binding.layoutDataList.setOnClickListener {
if (binding.layoutSwipeRefresh.isGone) {
closeKeyboard(binding.root)
}
binding.layoutSwipeRefresh.isVisible = true
binding.rvRecipeList.isVisible = true
}
레이아웃 간의 상하 관계를 염두에 두어야 한다!