2010-01-26 7 views
1

화면 회전 중 일부 상태를 유지해야하는 "벙어리"맞춤 Android 위젯 (홈 화면 위젯이 아닌 View)이 있습니다. 이 PlayerWidget은 기본적으로 일부 버튼 (뒤로, 앞으로, 재생/일시 중지)과 진행 막대가있는 미디어 플레이어 UI입니다. getter를 통해 중요한 UI 비트를 노출합니다.멍청한 위젯에 대해 분해 불가능한 UI 상태 저장 및 복원

특수한 컨트롤러 개체가 각각 — 인 몇 가지 별도의 Activities이 있습니다.이 컨트롤러는 단추 사용 여부를 업데이트하거나 "재생"또는 "일시 중지"아이콘이 있는지 여부를 업데이트하고 진행률을 업데이트합니다 전화 번호는 Service입니다. 예를 들어

, 하나의 컨트롤러의 "재생을 시작"방법에있어서,이 수행합니다

화면 회전이 onConfigurationChanged이 호출 — 통해 처리되는 Activity있다
mWidget.getMiddleButton().setImageResource(R.drawable.btn_pause); 

setContentView() (레이아웃은 세로와 가로 사이에 차이가 있기 때문에), 새로 만든PlayerWidget컨트롤러 개체 인 컨트롤러 개체에 바인딩합니다.

잘 작동합니다. 새 위젯 인스턴스에서 진행 업데이트가 시작되고 버튼이 예상대로 작동합니다.

PlayerWidget — 컨트롤러에 대한 지식이 없으므로 —은 사용 방법 및 표시 내용을 모르기 때문에 단추에 올바른 아이콘이 없습니다.

나는 그러나 나는 ImageButtons —에서 Drawable을 나누기의 방법이 없습니다 또는이 가장 좋은 아이디어는 부모 Activity 전에 새로운 setContentView() 후 호출 할 수 있습니다 getStaterestoreState 방법을 작성하는 것인지 궁금 해서요?

또는 컨트롤러가 설정하는 Drawable 리소스 ID를 저장하고 나중에 복원 할 수 있도록 PlayerWidget 게터가 반환하는 ImageButton 개체를 래핑하는 것으로 간주했습니다.

컨트롤러에 새로운 PlayerWidget을 바인드 할 때 컨트롤러에 "세트 위젯 -UI- 상태 기반의 현재 컨트롤러 상태"방법이있을 수 있습니까? 그것은 여러 가지 이유로 잠재적으로 복잡하지만, "올바른"방식과 같은 느낌입니다.

이 약간 흐릿한 문제에 대한 의견을 보내 주시면 감사하겠습니다. :)

답변

0

완성을 위해 필자는 생각보다 간단했던 "세트 위젯 -UI- 상태 기반 전류 제어기 상태"접근법을 사용했다.

0

해킹 비트이지만 드로어 블의 리소스 ID를 위젯에 저장할 수 있습니다. 그래서 위젯과 같은 몇 가지 코드를 가지고 :

private int mMiddleButtonImage; 

public void setMiddleButtonImage(int resourceId) { 
    mMiddleButtonImage = resourceId; 
    getMiddleButton().setImageResource(resourceId); 
} 

getState()restoreState() 방법은 다음 오히려 드로어 블 자신보다 정수 리소스 ID를 사용할 수 있습니다.

+0

예.소비자는 버튼에'setEnabled()'와 같은 것을 호출해야하지만 버튼 이미지 설정을 위젯에서 특정 메소드를 호출하기보다는 사용자가'ImageButton'의 래핑 된 버전을 반환한다고 언급 한 것입니다. 감싸 인'ImageButton'은 당신과 같은 방법으로 저장/복원 할 값을 얻습니다. –

+0

@Christopher - 질문에 내 대답을 제안했습니다. 미안해 내가 처음 읽은 것을 놓쳤다. 이 방법은 int ID를 저장하는 것이 가능하지 않을 수도있는 Drawable을 parcelling 또는 serialize하는 것보다 훨씬 빠르기 때문에 바람직하다고 생각합니다. commonsguy 또한 안드로이드 메모리 모델에서 비트 맵이 특별한 방법으로 처리된다는 것을 다른 포스트에서 언급 했으므로, 나는 그것들을 남겨두고 ID를 기억하는 것이 가장 좋을 것이라고 생각한다. –