제일 심플한 방법은 키를 화면 별로 생성하는 겁니다. 아래는 변경된 코드입니다.
public class AppSettings implements Settings {
private static final String KEY_LAST_POSITION = "%stPosition";
private final Storage storage;
public AppSettings(Storage storage) {
this.storage = storage;
}
private String getLastPositionKeyPerScreen(String screeName) {
return String.format(KEY_LAST_POSITION, screeName);
}
@Override
public int getLastPosition(String screenName) {
String key = getLastPositionKeyPerScreen(screenName);
return storage.geInt(key, 0);
}
@Override
public void setLastPosition(String screenName, int value) {
String key = getLastPositionKeyPerScreen(screenName);
storage.putInt(key, value);
}
}
public class TextManager {
private final CircularIterator<String> textIt;
private final Settings settings;
private final TextManagerListener listener;
public TextManager(CircularIterator<String> textIt, Settings settings, TextManagerListener listener) {
this.textIt = textIt;
this.settings = settings;
this.listener = listener;
}
public void restoreStatus(String screenName) {
int savedPosition = settings.getLastPosition(screenName);
textIt.setCurrentPosition(savedPosition);
listener.onPositionRestored(textIt.currentItem(), savedPosition);
}
public void saveStatus(String screenName) {
int lastPosition = textIt.getCurrentPosition();
settings.setLastPosition(screenName, lastPosition);
listener.onPositionSaved(lastPosition);
}
public String currentItem() {
return textIt.currentItem();
}
public String next() {
return textIt.next();
}
public String previous() {
return textIt.previous();
}
}
public class MainActivity extends AppCompatActivity {
private static final String PREFS_NAME = "my_prefs";
private static final String SCREEN_NAME = MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupView();
setupDependencies();
}
private TextView numberTxt;
private void setupView() {
numberTxt = findViewById(R.id.numberTxt);
findViewById(R.id.leftBtn).setOnClickListener(v -> {
updateText(textManager.previous());
});
findViewById(R.id.rightBtn).setOnClickListener(v -> {
updateText(textManager.next());
});
}
private TextManager textManager;
private void setupDependencies() {
final CircularIterator<String> textIterator = new CircularIterator<>(
Arrays.asList(getResources().getStringArray(R.array.numbers))
);
final PrefsStorage storage = new PrefsStorage(getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE));
final AppSettings settings = new AppSettings(storage);
textManager = new TextManager(textIterator, settings, new TextManagerListener() {
@Override
public void onPositionRestored(String text, int position) {
try {
numberTxt.setText(text);
} catch (IllegalArgumentException e) {
// Do something on your requirement
}
}
@Override
public void onPositionSaved(int position) {
// Do something if you want
}
});
textManager.restoreStatus(SCREEN_NAME);
}
private void updateText(String next) {
numberTxt.setText(next);
}
@Override
protected void onStop() {
super.onStop();
textManager.saveStatus(SCREEN_NAME);
}
}
편의상 클래스 이름을 키값으로 사용하고 있습니다. 님이 화면에 따라 상수로 정의하신 문자열을 사용하셔도 됩니다. MainActivity를 클래스에 따라 바꾸면 자동으로 SCREEN_NAME도 바뀌겠죠.
private static final String SCREEN_NAME = MainActivity.class.getSimpleName();
한가지 생각해 볼 수 있는 방법으로는 BaseFragment를 하나 생성하시고 공통적인 코드를 넣으신 다음, 상속을 받아 사용할 수도 있습니다.
public abstract class BaseFragment extends Fragment {
private String getScreenName() {
return this.getClass().getSimpleName();
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
textManager.restoreStatus(getScreenName());
}
}
여기서 키포인트는 키값을 화면에 따라 사용하는 겁니다.