2012-04-16 66 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