2011-11-10 2 views
5

(DialogFragment)와 (Person) 이름과 성을 가진 하나의 Person을 편집하기위한 간단한 DialogFragment를 만드는 방법과 각각의 enum (직장, 집 등) 및 주소.안드로이드 DialogFragment와 설정 변경

우선 Person 객체를 DialogFragment에 제대로 전달하려면 어떻게해야합니까? 내 현재 솔루션에는 DialogFragment가 작성된 후 dialog.show() 전에 호출되는 setPerson (Person person) 메소드가 있습니다. 이 작업은 구성 변경이 발생할 때까지 (사용자가 화면을 회전시킬 때까지) 잘됩니다. DialogFragment가 다시 만들어지고 Person 객체에 대한 참조가 null입니다. 나는 onSaveInstanceState를 사용하여 인스턴스를 저장할 수 있지만 객체가 복잡하고 값 비싸며 큰 객체를이 방법으로 지속하면 낭비되는 것처럼 보입니다.

또한 대화 상자를 사용하는 활동에서 구성 변경을 사용하지 않도록 설정했지만 문제가 해결되었지만 대화 상자를 다시 사용할 수있게하고 구성 변경을 사용하지 않도록 설정하는 데 필요한 모든 작업이 필요하지 않게되었습니다.

세 번째 옵션은 Person에 대한 참조를 정적 변수에 저장하는 것이지만 다시 대화 상자를 사용하여 여러 인스턴스를 지원할 수있게하려는 것입니다.

재사용 가능한 대화 상자에서 값 비싸고 복잡한 객체를 다른 사람들이 어떻게 처리합니까?

답변

2

글쎄, 여러 가지 해결책이 있습니다. 편집중인 객체를 완전히 직렬화 할 수 없다면 아무도 환상적이거나 안전하지 않을 수 있습니다.

전혀 그렇지 않은 경우 android:configChanges="orientation"을 사용하지 않는 것이 좋습니다. 100 % 피할 수 없습니다. 다른 구성 변경이 있으며 해당 솔루션을 사용하는 경우 앱이 다른 앱과 계속 충돌합니다.

그러나 대다수의 경우 작동 할 간단한 솔루션은 DialogFragment에서 setRetainInstance(true)으로 전화하는 것입니다. 이렇게하면 구성 변경시 조각이 삭제되거나 다시 생성되지 않습니다. 그러나 이것이 작동하지 않을 수있는 경우가 있습니다. OS가 메모리를 절약하기 위해 활동 또는 앱을 '얼음 위에 놓으려고'하는 구성 변경 외에도 다른 이유가 있습니다. 이 경우 개체가 손실됩니다.

1

조각에 복잡한 개체를 전달하는 가장 깨끗한 방법은 개체가 Parcelable을 구현하기 Bundle에 개체를 추가하고 fragment.setArguments(bundle)으로 Fragment에 번들을 전달하는 것입니다. 호출을 통해 번들을 검색하여 조각의 onActivityCreated()에있는 객체의 압축을 풀 수 있습니다.

는 단순히 조각의 방법으로 제공하는 번들에있는 "작업"parcelable 객체를 저장, 구성 변경에 인수를 지속하고 savedInstanceState !=null 경우 onActivityCreated() 나중에 인수 압축을 해제합니다.

Parcelable 구현에서 눈에 띄는 성능 저하가 있거나 일종의 "실시간"개체가있는 경우 데이터 개체를 보관할 비 UI 조각을 만드는 것이 좋습니다. 세부 사항에 익숙하지 않으면 setRetainInstance(true)을 UI가 아닌 부분에서 만들고 Activity의 인터페이스를 통해 UI 조각과의 연결을 조정할 수 있습니다.