[Android] 비어 있는 레이아웃을 클릭해도 클릭되지 않는 문제

thsamajiki·2024년 4월 1일
0

트러블슈팅

목록 보기
24/27
post-custom-banner

상황

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
}

느낀 점

레이아웃 간의 상하 관계를 염두에 두어야 한다!

profile
안드로이드 개발자
post-custom-banner

0개의 댓글