1

我有一个画廊,它允许用户浏览画廊,选择图像作为他们的选择,并继续浏览画廊而不更改该选择。这通过使用 onItemSelected 来查看他们正在选择的图像(即单击)是否是已经选择的图像(通过画廊的动作)。所以:

  1. 用户在画廊中前后移动。
  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 事件有任何经验吗?有任何想法吗?如果需要,我可以发布更多代码。非常感谢您的帮助。

4

3 回答 3

3

您是否尝试过将 android:configChanges="orientation" 放入清单中?

于 2012-04-16T11:08:36.790 回答
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;
   }
}

这对我有用。

于 2012-04-16T11:50:47.653 回答
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
}
于 2012-04-18T12:20:04.747 回答