HorizontalScrollView의 사이즈 변경 시 레이아웃을 새로 고치는 방법은?
_____A: HorizontalScrollView의 크기가 변경되면 내부 뷰들도 그에 맞게 레이아웃이 다시 계산되고 갱신되어야 합니다. 이를 위해 다음과 같은 방법들을 사용할 수 있습니다.
---
1. `requestLayout()` 호출하기
사이즈가 변경되는 시점에 `horizontalScrollView.requestLayout()`을 호출하면, 뷰 시스템이 해당 뷰와 하위 뷰들의 레이아웃을 다시 측정하고 배치합니다.
```java
horizontalScrollView.requestLayout();
```
---
2. 직접 레이아웃 요청 리스너 사용
뷰가 사이즈를 변경할 때 호출되는 `OnLayoutChangeListener`를 등록하면 변경 사항 감지 후 추가 작업을 할 수 있습니다.
```java
horizontalScrollView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom,
int oldLeft, int oldTop, int oldRight, int oldBottom) {
if ((right - left) != (oldRight - oldLeft)) {
// 사이즈가 변경됨
horizontalScrollView.requestLayout();
}
}
});
```
---
3. `post()`를 활용하여 레이아웃 지연 요청
사이즈가 변경된 직후에 레이아웃 갱신을 할 때 UI 스레드의 작업이 완료된 후 요청하려면 `post()`를 사용합니다.
```java
horizontalScrollView.post(new Runnable() {
@Override
public void run() {
}
});
```
---
4. `invalidate()`로 뷰 재그리기 트리거
만약 레이아웃은 유지하되 단순히 뷰를 다시 그려야 한다면 `invalidate()` 호출도 가능하지만, 사이즈 변경 시에는 `requestLayout()`이 더 적절합니다.
```java
horizontalScrollView.invalidate();
```
---
5. 커스텀 HorizontalScrollView에서 `onSizeChanged()` 오버라이드
별도로 뷰를 커스텀하여 사이즈 변경을 감지하고 싶다면 `onSizeChanged()` 메서드를 오버라이드 해 처리할 수 있습니다.
```java
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if (w != oldw || h != oldh) {
requestLayout();
}
}
```
---
요약
- HorizontalScrollView 사이즈 변경시 가장 기본적인 대응 방법은 `requestLayout()` 호출입니다.
- 사이즈 변경 이벤트를 감지하기 위해 `OnLayoutChangeListener`나 `onSizeChanged()`를 활용할 수 있습니다.
- 레이아웃 처리가 보장되어야 하므로 단순 `invalidate()`보다는 `requestLayout()` 사용이 권장됩니다.
- 상황에 따라 `post()`를 통해 UI 스레드에서 안전하게 갱신 요청을 할 수도 있습니다.
---
참고: 일반적으로 Android 뷰 시스템은 크기 변경 시 자동으로 레이아웃을 다시 계산하므로 추가 작성을 해야 할 경우는 다음과 같은 특수한 상황(예: 동적으로 콘텐츠가 바뀌는 복잡한 뷰 내부 등)입니다.
이 방법은 Android 앱에서 `HorizontalScrollView`의 크기가 변경될 때 해당 레이아웃을 다시 그리거나 업데이트할 수 있도록 도와줍니다.
1. 레이아웃 변경 감지하기 `ViewTreeObserver`를 사용하여 `HorizontalScrollView`의 크기 변경 이벤트를 감지할 수 있습니다.
`ViewTreeObserver`의 `OnGlobalLayoutListener`를 통해 레이아웃이 새로 그려질 때마다 호출되는 콜백을 설정할 수 있습니다.
```java HorizontalScrollView horizontalScrollView = findViewById(R.id.horizontalScrollView); horizontalScrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { // 레이아웃이 변화했을 때 처리할 코드 refreshLayout(); } }); ```
2. 레이아웃 새로 고치기 `refreshLayout()` 메소드는 레이아웃을 새로 고치는 로직을 포함해야 합니다.
예를 들어, 뷰를 다시 측정하고 배치하거나, 새로운 데이터를 설정하는 등의 작업을 수행할 수 있습니다.
```java private void refreshLayout() { // 필요에 따라 레이아웃을 새로 고치는 로직 구현 // 예: 데이터 변경, 뷰 업데이트 등 // 새로고침 후 다시 그리는 것이 필요할 수 있음 horizontalScrollView.requestLayout(); horizontalScrollView.invalidate(); } ```
3. 불필요한 호출 방지 `OnGlobalLayoutListener`는 레이아웃 변경이 여러 번 발생할 수 있으므로, 필요할 경우 이벤트를 해제하여 불필요한 호출을 방지하는 것이 좋습니다.
레이아웃 변경을 감지한 후에는 리스너를 제거하는 코드를 추가합니다.
```java horizontalScrollView.getViewTreeObserver().removeOnGlobalLayoutListener(this); ```
4. 전체 코드 예시 아래는 `HorizontalScrollView`의 크기가 변경될 때 레이아웃을 새로 고치는 전체 코드 예시입니다.
```java HorizontalScrollView horizontalScrollView = findViewById(R.id.horizontalScrollView); horizontalScrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { // 레이아웃 새로 고침 동작 refreshLayout(); // 리스너 제거 (한 번만 호출되게 하려면) horizontalScrollView.getViewTreeObserver().removeOnGlobalLayoutListener(this); } }); private void refreshLayout() { // 레이아웃 새로 고치는 로직 // 예: 데이터 업데이트 또는 뷰의 크기 변경 horizontalScrollView.requestLayout(); horizontalScrollView.invalidate(); } ``` 이런 방식으로 `HorizontalScrollView`의 사이즈가 변경될 때 레이아웃을 효과적으로 새로 고칠 수 있습니다.
작성자:
박주연 [비회원]
| 작성일자: 1년 전
2025-04-19 11:21:15
조회수: 164 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 164 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.