2013-10-25 2 views
1

정적 뷰와 동적으로 생성 된 뷰가 혼합 된 액티비티로 Android 앱을 만들고 있습니다. 액티비티에는 XML 파일에 포함 된 UI 요소와 모델 클래스의 내용을 기반으로 동적으로 생성되는 UI 요소가 포함됩니다. (마찬가지로, 내 모델 클래스에 배열이 있고 배열의 모든 요소에 대해 EditText가 생성되고 다른 배열의 모든 요소를 ​​포함하는 Spinner가 생성됩니다)동적으로 생성 된 UI에서 인스턴스 상태 저장 및 복원?

일반적인 저장 방법은 무엇입니까? 동적으로 생성 된 UI 요소가 관련되어있을 때 응용 프로그램의 상태를 복원 할 수 있습니까? 언제 어느 UI 요소가 존재하는지 항상 알 수는 없기 때문에! 현재 바인딩 코드는 장치 방향이 바뀌면 데이터베이스에서 데이터를 간단히 다시로드하여 사용자가 변경 한 내용을 잃어 버립니다.

저는 Google/SO에서이 문제에 대해 잘 살펴 봤는데이 문제와 관련이 없습니다.

덕분에 모든

편집 : 앞으로이 건너 오는 사람들을위한 , 나는 약간 수정 Yakiv의 접근 방식의 버전이 함께 상처 않았다

for (int i = 0; i < views.size(); i++) { 
     View currentView = views.get(i); 
     if (currentView instanceof CheckBox) { 
      outState.putBoolean("VIEW"+i, (((CheckBox) currentView).isChecked())); 
     } else if (currentView instanceof EditText) { 
      outState.putString("VIEW"+i, ((EditText) currentView).getText().toString()); 
     } else if (currentView instanceof Spinner) { 
      //.....etc. etc. 
     } 
    } 

다시 한 번 감사드립니다 Yakiv을 멋진 아이디어.

+0

검색 결과가 잘못되었습니다. 답변은 다음과 같습니다. http://stackoverflow.com/questions/151777/saving-activity-state-in-android. –

+0

귀하의 링크를 가져 주셔서 감사합니다. 그러나 Yakiv의 의견에 대한 답변으로, 귀하가 가지고있는 UI 요소를 알고 번들에 쉽게 저장할 수있는 가장 간단한 경우입니다. 동적으로 생성 된 UI 요소를 알 수 없습니다. 활동에 5 개의 편집 문구가 있거나 50 개가있을 수 있으므로이 값을 번들에 추가하기가 어렵습니다. – user2459186

답변

0

동적 뷰를 복원하려면 상태를 class fields으로 만들고 onCreate으로 초기화해야합니다. 그런 다음 this 문서를 사용하여 상태를 저장하고 복원하십시오.

private List<View> mViews= new ArrayList<View>(); 

@Override 
public void onCreate(..) 
{ 
    LinearLayout parent = ....//initialize it here 
    initializeViews(); 
} 

public void initializeViews() 
{ 
    // create and add 10 (or what ever you need) views to the list here 
    mViews.add(new View(this)); 
} 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 

    int mViewsCount = 0; 
    for(View view : mViews) 
    { 
    savedInstanceState.putInt("mViewId_" + mViewsCount, view.getId()); 
    mViewsCount++; 
    } 

    savedInstanceState.putInt("mViewsCount", mViewsCount); 
} 

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 

    int mViewsCount = savedInstanceState.getInt("mViewsCount");; 
    for(i = 0; i <= mViewsCount) 
    { 
    View view = mViews.get(i); 

    int viewId = savedInstanceState.getInt("mViewId_" + i); 
    view.setId(viewId); 

    mViewsCount++; 
    } 
} 

+0

답장을 보내 주셔서 감사합니다. 좀 혼란스러워, 문제는 거기에 내 활동에 5 EditTexts있을 수 있습니다 또는 50있을 수 있습니다 .. 그래서 'onSaveInstanceState'에서 번들에 값을 추가 할 수있는 방법이 없습니다. 고유 한 '키'(예 : 'dogColour'또는 'dogName'과 같은 경우) – user2459186

+0

답변이 업데이트되었습니다. –

+0

이것은 실제로 정말 멋진 솔루션입니다. 도움을 주셔서 대단히 감사합니다! 문제가 생기면 다시보고하겠습니다. – user2459186