2012-04-16 2 views
1

사용자가 갤러리를 탐색하고 선택한 이미지를 선택한 다음 해당 선택을 변경하지 않고 갤러리를 계속 탐색 할 수있는 갤러리가 있습니다. 이것은 onItemSelected를 사용하여 그들이 선택한 이미지 (즉 클릭으로)가 이미 선택된 이미지 (갤러리의 동작에 의해)인지 확인함으로써 작동합니다. 따라서 :갤러리에서 오리엔테이션 변경 후 onItemSelected를 호출합니다.

  1. 사용자가 갤러리를 통해 앞뒤로 이동합니다.
  2. 사용자가 선호하는 이미지를 결정하고 갤러리를 가운데에 배치합니다.
  3. 사용자가 이미지를 클릭하면 "선택됨"이되고 녹색 테두리가 표시됩니다.
  4. 사용자는 현재 가운데 맞춤 이미지가 자동으로 '선택'되지 않고 계속해서 갤러리에서 앞뒤로 이동할 수 있습니다.

괜찮습니다. 그러나 이제는 이미지를 선택할 때 방향 변경을 허용하려고합니다. onConfigChanged 코드가 모두 실행 된 후 갤러리에서 onItemSelected가 호출된다는 것을 발견했습니다.

그래서 onConfigChange 매개 변수 (예 : 방향 변경 전에 갤러리가 있던 인덱스)를 설정 한 다음 initialiseUI 메소드를 호출합니다. 이 작업은 성공적으로 실행되고 방향 변경 전에 위치했던 것과 동일한 색인에 갤러리를 배치하는 것을 포함하여 필요한 모든 것을 설정합니다. 그러나 onItemSelected가 중심 이미지에서 호출됩니다. 이렇게하면 사용자가 클릭하지 않고 중심 이미지가 선택 사항 (녹색 테두리 등)으로 선택됩니다.

부울 플래그 "configIsChanging"을 사용하여 configIsChanging이 false 일 때만 onItemSelected 코드를 실행 해 보았습니다. 안타깝게도 onConfigChange가 완료된 후에 onItemSelected가 호출되고 그 시점에서 플래그가 false로 재설정되었으므로이 방식이 작동하지 않는 것 같습니다.

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    configChanging = true; 

    tempConfigDisplayedIndex = mGallery.getSelectedItemPosition(); 

    super.onConfigurationChanged(newConfig); 

    setContentView(R.layout.take_questionnaire); 

    initialiseUI(); 
    configChanging = false; 
} 

악성 onItemSelected 이벤트에 경험이있는 사람이 있습니까? 어떤 아이디어? 필요한 경우 더 많은 코드를 게시 할 수 있습니다. 어떤 도움을 많이 주셔서 감사합니다.

답변

0

@ Gabriel의 대답에 이어 다음 코드 스 니펫을 사용하여 문제를 해결했습니다. Gabriel의 코드와 약간 다른 점은 아무도 신경 쓰지 않을 비트를 버렸습니다.

@Override 
protected void onResume() { 
    super.onResume();  
    configChanging = true; 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
if (mAdapter.selectedIndex > -1) { 
    tempConfigSelectedIndex = mAdapter.selectedIndex; 
} 

super.onConfigurationChanged(newConfig); 
if (configChanging) { 
    tempConfigDisplayedIndex = mGallery.getSelectedItemPosition(); 

    setContentView(R.layout.take_questionnaire); 

    initialiseUI(); 
} 
} 

@Override 
public void onItemSelected(AdapterView<?> parent, View v, int position, long id) { 

if (!configChanging){ 
    // code here to execute only when user clicks 
} 
configChanging = false; 
// code here to execute when either user clicks OR config is changed 
} 
3

매니페스트에 android : configChanges = "orientation"을 넣으려고 했습니까?

+0

네, 그 작업을 수행했지만 위의 코드보다 훨씬 복잡합니다. 잠재적 인 해답으로 일련의 이미지가있는 여러 개의 "질문"을 반복하고 사용자는 각 질문에 대해 하나를 선택해야합니다. 코드에서 구성 변경을 처리하지 않으면 방향 변경으로 인해 사용자가 첫 번째 질문으로 돌아 가게됩니다. – breadbin

+0

문제의 원인을 이해하지만 디버그에 도움이됩니다. http://developer.android.com/guide/topics/manifest/activity-element.html#config 및 http://stackoverflow.com/questions/456211/activity-restart-on-rotation-android.onRetainNonConfigurationState onSavedInstanceState를 사용하는 것이 좋습니다. – josephus

+0

감사합니다. – breadbin

1

부울 (어쩌면 필드)을 onResume/onCreate에 넣을 수 없습니까?

configIsChanging = true; onPause 및 onResume에서 두 가지 방법을 사용하십시오.

@Override  
public void onConfigurationChanged(Configuration newConfig) 
{ 
    if(!configIsChanging){ 
     tempConfigDisplayedIndex = mGallery.getSelectedItemPosition(); 

     super.onConfigurationChanged(newConfig); 

     setContentView(R.layout.take_questionnaire); 

     initialiseUI(); 
    }else{ 
     configIsChanging = false; 
    } 
} 

이것은 저에게 효과적입니다.

+0

그게 도움이! 이제는 첫 번째 구성 변경에 적용되지만 이후의 구성 변경에 대해서는 이전과 동일한 문제가 발생합니다. 위의 "onResume/onCreate"를 언급 한 다음 다음 줄 "onPause and onResume"에 대해 - onCreate 또는 onPause 또는 둘 다 의미 했습니까? – breadbin

+0

좋아, 잘 했어. 몇 가지를 바꿔야 만했습니다. Stack은 내가 평판이 <100이기 때문에 다른 5 시간 동안 내 자신의 질문에 답할 수는 없지만 그것을 원하면 누구나 내일 해결책을 제시 할 것입니다. – breadbin

+0

예 저는 혼란 스러웠습니다. 그게 의미였습니다. 부활기도하고, 죄송합니다. 하지만 좋은 일은 =] 답변을 게시 할 수있을 때까지 답변으로 질문을 편집해야합니다. –

관련 문제