2014-12-15 3 views
0

귀하의 활동에 ViewsonRestoreInstanceState()으로 복원하려면 고유 ID가 있어야한다고 Android 개발자 가이드에 알려줍니다. 이는 onRestoreInstanceState()이 ID를 키로 사용하여 SparseArray을 만들어 작동하기 때문입니다.onRestoreInstanceState() 및 고유보기 ID

이렇게 많은 표준 안드로이드 방식이 ID 재사용을 권장하기 때문에 매우 이상합니다. 예를 들어, ArrayAdapter의 모든 생성자는 resourceId를 매개 변수로 사용하므로 ListView에있는 모든 자식에 대해 동일한 xml 리소스가 확장됩니다. 마찬가지로 xml에 <include layout ...>을 사용하면 뷰 ID를 다시 사용하게됩니다.

개발자가 실제로 표준, 권장 방식을 사용하지 않는 한 실제로 모든 Views에 고유 ID가 있다는 요구 사항을 충족하는 많은 응용 프로그램이 있다는 것을 알 수 없습니다.

이 결론이 잘못 되었습니까? 또한 ID가 모두 다르지 않은 경우 onRestoreInstanceState의 동작은 무엇이며 수용 가능한 동작입니까?

편집

다음과 같이 관련 따옴표 페이지 http://developer.android.com/training/basics/activity-lifecycle/recreating.html에 표시되는 읽기 :

참고 : 위해서는 안드로이드 시스템을위한 활동의 ​​뷰 상태를 복원하기 위해, 각 뷰해야 android : id 속성으로 제공되는 고유 한 ID가 있어야합니다.

주의 : 기본 구현이 뷰 계층 구조의 상태를 복원 할 수 있도록 항상 onRestoreInstanceState()의 수퍼 클래스 구현을 호출하십시오.

+0

어디에서 볼 수 있습니까? onRestoreInstanceState에 대한 설명서에 없습니다. 또한 내 지식 중 가장 좋은 점에 관해서는 내게 의미가 없습니다 .RestoreInstanceState는 당신을 위해 아무것도하지 않습니다. 당신은 손으로 각 요소를 복원해야합니다. –

+0

나는 그것을 지금 찾을 수 없다. 그것은 대담한 서신으로 그것을 말하기 위해 사용되었습니다 (비슷한 질문을 올린 8 월에 최근에). 이것은 지금 당황 스럽지만, 최근에 체크하지 않았기 때문에 구현을 변경했을 수도 있습니다. 그것은 사실 (예 : http://stackoverflow.com/q/6045361/3973077 여러 다른 사람들이 같은 문제를 발견하는 것을 보았습니다.)이었습니다. 전문가가 무슨 일이 일어나는지 확인할 수 있다면 고맙겠습니다. –

+0

이것은 onRestoreInstanceState()의 문서에 없었습니다.'View'에서의 그 메소드의 기본 구현은'IllegalStateException'을 저장하고 예상되는 다른 구체적인 매개 변수로 호출되면 그 효과에 메시지를 던지도록 설계되었습니다 :'BaseSavedState.EMPTY_STATE'. 이것은 일반적으로 커스텀'View'에서 메소드를 잘못 구현함으로써 발생합니다. – corsair992

답변

1

AdapterView (AN Adapter를 사용하는 모든 ViewGroup들에 대한 기본 클래스)를 저장하거나 아이에게 View들입니다의 상태를 복원, 즉 Adapter의 영역이기 때문에 그 수준에서 처리해야하지 않도록 구현 .

여러 위치에 정적으로 포함 된 하위 레이아웃의 경우 저장 될 상태가있는 경우 모든 상태 유지 View에 고유 ID를 할당하거나 Activity에서 수동으로 상태를 관리해야합니다 또는 Fragment.

불행히도 형제 중 단지 하나가 아닌 View 구조 전체에서 고유해야합니다. 이것은 전체 구조의 상태가 하나의 단일 차원 SpareArray 안에 저장된다는 사실 때문입니다. 따라서 동일한 ID를 공유하는 구조에 상태가 여러 개있는 View이있는 경우 구조의 마지막 상태 만 저장되며 상태 복원시 해당 ID를 사용하여 모든 View에 적용됩니다.

+0

감사합니다. 그것은 매우 설득력있는 대답입니다. 나는 안드로이드의 끔찍한 문서 (처음이 아닌!)에 의해 오도되고있다. 링크 된 페이지는 고유 ID 요구 사항이'AdapterView'의 자식에는 적용되지 않는다는 사실을 언급해야합니다. –

관련 문제