마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

[안드로이드] textview 배열 저장 하는 법

0 추천
TextView에 array[i]로 배열에 있는 문자열을 버튼 누를 때마다 하나씩 띄우고 있습니다.

앱을 나갔다 다시 들어왔을 때 TextView에 나가기전에 값(에를 들면, array[3]번째에서 나갔다면 다시 들어와도 array[3]번째 문자열이 화면에 남아있도록)이 저장되어 있게 하려면 어떻게 해야되나요ㅜㅜ

sharedpreferences를 사용해야된다면 자세한 예제 보여주시면 정말 감사하겠습니다ㅜㅜㅜ
개발개발자 (1,100 포인트) 님이 2020년 11월 13일 질문

1개의 답변

+1 추천

나갔다 다시 들어온다는 말은 앱을 종료했다 다시 실행한다는 말로 이해하겠습니다. 그렇게 하시려면 Persistent storage(영구저장장치)에 데이터를 기록하셨다가 앱이 다시 실행될 때 저장장치에 해당 값이 있으면 보여주면 됩니다. Persistent storage는 파일이나 데이터베이스를 사용하는 것이 일반적인데, 저장할 데이터가 작/적다면, sharedpreferences에 할 수도 있구요, 그냥 일반 파일을 사용하셔도 됩니다. 그리고 데이터베이스를 사용하시면 좀 더 많은 옵션을 가질 수 있습니다. SQLLite는 안드로이의 플랫폼에 탑재되어 있으므로 Room 같은 데이터베이스 라이브러리를 쓰시면 쉽게 제어할 수 있습니다. 그리고 SharedPreference를 사용하실 거면 Jetpack에 좀 더 향상된 라이브러리가 나왔는데 그것도 한번 살펴보시면 좋을 듯 합니다. (https://android-developers.googleblog.com/2020/09/prefer-storing-data-with-jetpack.html)

만약 앱을 종료하는 게 아니라 앱이 다른 앱으로 갔다 오거나 디바이스 홈버튼을 누른 것 처럼 백그라운드로 갔다가 다시 포그라운드로 다시 나오는 상황이면, 위의 말씀드린 방법을 그대로 적용하셔도 되구요. 님처럼 간단한 상황일 경우는 Activity의 경우는 onSaveInstance  와  onCreate 이벤트를 조합하셔 사용하셔도 됩니다. (링크 참조 https://developer.android.com/topic/libraries/architecture/saving-states)

private static final SELECTED_POSITION_KEY = "selected_position"

TextView textView;

// 몇번째 배열 요소가 눌렸는지
int selectePosition;
String[] displayTexts = ...

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);

    textView = (TextView) findViewById(R.id.text_view);
    Button button = (Button) findViewById(R.id.button);
    button.setOnClickListener(v -> 
        selectedPosition = //값 저장
    )

   restoreViewState(savedInstanceState)
}

// 이전에 저장된 뷰상태가 있다면, 뷰상태 복구는 여기서도 가능함.
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    restoreViewState(savedInstanceState);
}

private void restoreViewState(Bundle savedInstanceState) {
      boolean viewRestored = savedInstanceState != null)
      if (!viewRestored) return;

     selectedPosition = savedInstanceState.getInt(SELECTED_POSITION_KEY);
     if (selectedPosition < 0) {
         selectedPosition = 0;
         return;
     }

    textView.setText(displayTexts[selectedPosition);
}

@Override
public void onSaveInstanceState(Bundle outState) {
    outState.putString(SELECTED_POSITION_KEY, selectedPosition);
    super.onSaveInstanceState(outState);
}

그리고 다른 앱을 뷰상태를 저장했다가 복구하는 테스트는 

1. 안드로이드 스튜디오 실행한 상태로 앱을 실행한다.
2. 디바이스 백버튼을 누른다.
3. 안드로이드 스튜디오의 로그캣에 중지 버튼을 누른다.
4. 디바이스의 타스크 매니저에서 앱을 다시 실행한다.

이렇게 했을 때 상태 복구가 제대로 된 것이라면 확실하게 처리된 것입니다.

참고로, 한 액티비티에 여러개의 프레그먼트를 사용할 경우는 상황에 따라 프레그먼트에서는 onSaveInstance가 발생하지 않을 수있습니다.

도움이 되시길.

spark (161,480 포인트) 님이 2020년 11월 14일 답변
...