2012-04-16 63 views
1

我有一個圖庫,它允許用戶瀏覽圖庫,選擇圖像作爲他們的選擇,並繼續瀏覽圖庫而不更改該選擇。這可以通過使用onItemSelected來查看他們正在選擇的圖像(即點擊)是否已經被選擇的圖像(通過圖庫的運動)。所以:改變方向後圖庫調用onItemSelected

  1. 用戶在Gallery中前後移動。
  2. 用戶決定自己喜歡的圖像並將圖庫置於其上。
  3. 用戶單擊圖像,它將被「選中」並被賦予綠色邊框。
  4. 用戶可以繼續前進或後退到圖庫中,而不會自動「選擇」當前居中的圖像。

這很好。但是,我現在試圖在選擇圖像時允許方向更改,並且我發現在所有onConfigChanged代碼執行完畢後,在Gallery上調用onItemSelected。

所以onConfigChange我設置參數(即在方向改變之前畫廊在哪個索引上),然後我調用我的initialiseUI方法。這將成功執行,並設置所需的所有內容,包括將Gallery定位在與定位更改前相同的索引處。但是,在中心圖像上調用onItemSelected。這會導致居中圖像被選爲他們的選擇(綠色邊框等),而不需要用戶點擊它。

我嘗試使用布爾標誌「configIsChanging」,以便只在configIsChanging爲false時執行onItemSelected代碼。不幸的是,這似乎並不奏效,因爲onItemSelected在onConfigChange完成之後被調用,並且到那時該標誌已被重置爲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

是的,我已經這樣做了,但是我的Activity比上面解釋的代碼更復雜。它遍歷許多「問題」,每個問題都有一組圖像作爲潛在答案,用戶必須爲每個問題選擇一個。除非我在代碼中處理配置更改,否則方向更改將使用戶回到第一個問題。 – breadbin 2012-04-16 11:19:21

+0

我明白問題的原因,但這些可能會幫助您更好地進行調試:http://developer.android.com/guide/topics/manifest/activity-element.html#config和http://stackoverflow.com/questions/456211 /活動的重啓上旋轉機器人。這個想法是在onRetainNonConfigurationState – josephus 2012-04-16 11:29:48

+0

上使用onSavedInstanceState,我會看看,謝謝。 – breadbin 2012-04-16 11:31:52

1

難道你不能把你的布爾(也許是一個字段)在你的onResume/onCreate?

configIsChanging = true;在你的2個方法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 2012-04-16 13:33:53

+0

好的,我得到了它的工作。必須改變一些事情。 Stack不會讓我回答我自己的問題5個小時,因爲我的聲望<100,但我明天會爲任何需要它的人提供解決方案。 – breadbin 2012-04-16 14:04:51

+0

我搞混了,它是onResume和onCreate,對不起。 但它爲你工作的好事=] 你應該用答案編輯你的問題,直到你可以發佈答案。 – 2012-04-16 14:14:23