HorizontalScrollView에서 스크롤 위치를 저장하고 복원하는 방법은?
_____A1: `HorizontalScrollView`의 현재 가로 스크롤 위치는 `getScrollX()` 메서드를 호출하여 얻을 수 있습니다. 예:
```java
int scrollX = horizontalScrollView.getScrollX();
```
Q2: HorizontalScrollView의 스크롤 위치를 저장하는 최선의 시점은 언제인가요?
A2: 보통 액티비티나 프래그먼트의 상태를 저장할 때인 `onSaveInstanceState()` 내에서 스크롤 위치를 저장하는 것이 좋습니다. 또한, 화면을 닫거나 다른 UI 상태 변화가 있을 때도 저장할 수 있습니다.
Q3: 스크롤 위치를 저장하기 위한 방법은 무엇인가요?
A3: `Bundle`에 스크롤 위치 값을 넣어 저장합니다. 예:
```java
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
int scrollX = horizontalScrollView.getScrollX();
outState.putInt("scroll_position", scrollX);
}
```
Q4: 저장한 스크롤 위치를 어떻게 복원할 수 있나요?
A4: `onRestoreInstanceState()` 혹은 `onCreate()` 메서드에서 `Bundle`로부터 저장된 위치를 읽고, 스크롤뷰에 적용합니다. 예:
```java
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
final int scrollX = savedInstanceState.getInt("scroll_position");
horizontalScrollView.post(() -> horizontalScrollView.scrollTo(scrollX, 0));
}
```
Q5: 왜 `post()` 메서드를 사용하여 스크롤 복원을 하나요?
A5: 뷰 계층이 아직 레이아웃을 완료하기 전에는 스크롤 위치를 설정해도 적용되지 않습니다. `post()`를 사용하면 레이아웃 후에 스크롤 위치를 설정할 수 있습니다.
Q6: 뷰의 상태 저장 기능(`onSaveInstanceState`)을 이용할 수도 있나요?
A6: 기본적으로 `HorizontalScrollView`는 스크롤 위치를 자동 저장하고 복원합니다. 하지만 커스텀 처리가 필요한 경우 위 방법처럼 직접 저장하고 복원할 수 있습니다.
Q7: 프래그먼트에서 HorizontalScrollView 스크롤 위치를 저장할 때 유의점은?
A7: 프래그먼트의 `onSaveInstanceState`에서 저장하고, `onViewCreated` 혹은 `onActivityCreated`에서 복원해야 하며, `post()`를 통해 레이아웃 완료 후 스크롤 위치를 설정해야 합니다.
요약
- `getScrollX()`로 위치를 얻고, `Bundle`에 저장
- `onRestoreInstanceState()` 또는 `onCreate()`에서 값을 읽어 `post()`로 `scrollTo()` 실행
- 뷰가 레이아웃 된 후에 스크롤 위치를 설정하는 것이 중요
이 방법을 따르면 `HorizontalScrollView`의 스크롤 위치를 효과적으로 저장하고 복원할 수 있습니다.
구체적인 구현 방법은 다음과 같습니다.
1. 스크롤 위치 저장 스크롤을 할 때 현재 위치를 저장하려면, `HorizontalScrollView`의 `getScrollX()` 메서드를 사용하여 현재 스크롤 위치를 가져올 수 있습니다.
이 값을 `SharedPreferences`에 저장하는 방법이 일반적입니다.
예제 코드 ```java // ScrollView에서 scrollX 값을 가져옵니다.
int scrollX = horizontalScrollView.getScrollX(); // SharedPreferences에 저장합니다.
SharedPreferences sharedPreferences = getSharedPreferences("MyPrefs", MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putInt("scrollX", scrollX); editor.apply(); ```
2. 스크롤 위치 복원 앱이 다시 시작되거나 액티비티가 재생성될 때 저장된 스크롤 위치를 복원하려면, `SharedPreferences`에서 해당 값을 읽어 `HorizontalScrollView`의 `scrollTo()` 메서드를 사용하여 스크롤 위치를 설정합니다.
예제 코드 ```java // SharedPreferences에서 scrollX 값을 읽어옵니다.
SharedPreferences sharedPreferences = getSharedPreferences("MyPrefs", MODE_PRIVATE); int savedScrollX = sharedPreferences.getInt("scrollX", 0); // 기본값은 0 // HorizontalScrollView에 해당 위치로 스크롤합니다.
horizontalScrollView.scrollTo(savedScrollX, 0); ```
3. 전체 구현 예시 ```java public class MyActivity extends AppCompatActivity { private HorizontalScrollView horizontalScrollView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); horizontalScrollView = findViewById(R.id.horizontalScrollView); // 저장된 스크롤 위치 복원 restoreScrollPosition(); } @Override protected void onPause() { super.onPause(); // 스크롤 위치 저장 saveScrollPosition(); } private void saveScrollPosition() { int scrollX = horizontalScrollView.getScrollX(); SharedPreferences sharedPreferences = getSharedPreferences("MyPrefs", MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putInt("scrollX", scrollX); editor.apply(); } private void restoreScrollPosition() { SharedPreferences sharedPreferences = getSharedPreferences("MyPrefs", MODE_PRIVATE); int savedScrollX = sharedPreferences.getInt("scrollX", 0); horizontalScrollView.post(() -> horizontalScrollView.scrollTo(savedScrollX, 0)); } } ``` 주의할 점 - `onPause()` 메서드에서 스크롤 위치를 저장하는 것은 액티비티가 화면에서 사라질 때 위치를 잃지 않기 위함입니다.
- `post()` 메서드를 사용하여 UI 스레드에서 스크롤 위치를 설정하는 것이 좋습니다.
이는 뷰가 레이아웃된 후에 스크롤을 적용하기 위해서입니다.
위와 같은 방법으로 `HorizontalScrollView`의 스크롤 위치를 저장하고 복원할 수 있습니다.
작성자:
최현민 [비회원]
| 작성일자: 1년 전
2025-04-19 11:20:57
조회수: 136 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 136 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.