2010-06-19 28 views
2

编辑后:我的主应用程序屏幕使用GridView控件来显示图标的网格这个问题可能与BaseAdapter causing ListView to go out of order when scrolled的Android GridView的倒车操纵定向更改


。每个图标都有一个图像,名称和意图。我将“活动”设置为处理方向更改,以便我可以更改背景。该onCreate方法建立在GridView 3测试图标没有做任何事情,它会打开一个PreferencesActivity首选项图标:

super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 

GridView gv = (GridView) findViewById(R.id.main_grid); 
if (getResources().getConfiguration().orientation == 
     Configuration.ORIENTATION_LANDSCAPE) 
    gv.setBackgroundResource(R.drawable.main_bg_horiz); 
else 
    gv.setBackgroundResource(R.drawable.main_bg); 

ArrayList<Icon> icons = new ArrayList<Icon>(); 
icons.add(new Icon("Test 1", R.drawable.test1, null)); 
icons.add(new Icon("Test 2", R.drawable.test2, null)); 
icons.add(new Icon("Test 3", R.drawable.test3, null)); 
icons.add(new Icon("Preferences", R.drawable.perferences, new Intent(this, 
     AlertPreferences.class))); 
IconAdapter ia = new IconAdapter(icons); 
gv.setAdapter(ia); 
gv.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3){ 
     Intent i = ((IconAdapter)arg0.getAdapter()).getItem(arg2).getIntent(); 
     if (i != null) 
      HomeActivity.this.startActivity(i); 
    } 
}); 

而且onConfigurationChanged很简单:

super.onConfigurationChanged(newConfig);  
GridView gv = (GridView) findViewById(R.id.main_grid); 

if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 
    gv.setBackgroundResource(R.drawable.main_bg_horiz); 
else 
    gv.setBackgroundResource(R.drawable.main_bg); 

背景变化很好,但代码引入了GridView的一个新问题。无论我如何开始应用程序,它都可以工作。但是,当我改变方向时,GridView中图标的顺序反转。当我旋转屏幕回到它开始的方向时,一切都恢复正常。这里发生了什么?

回答

0

尝试你在哪里设置用户界面逻辑分离:

GridView gv; 

public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    configureYourUIHere();  
} 

public void configureYourUIHere(){ 
    gv = (GridView) findViewById(R.id.main_grid); 
    if (getResources().getConfiguration().orientation == 
      Configuration.ORIENTATION_LANDSCAPE) 
     gv.setBackgroundResource(R.drawable.main_bg_horiz); 
    else 
     gv.setBackgroundResource(R.drawable.main_bg); 

    ArrayList<Icon> icons = new ArrayList<Icon>(); 
    icons.add(new Icon("Test 1", R.drawable.test1, null)); 
    icons.add(new Icon("Test 2", R.drawable.test2, null)); 
    icons.add(new Icon("Test 3", R.drawable.test3, null)); 
    icons.add(new Icon("Preferences", R.drawable.perferences, new Intent(this, 
      AlertPreferences.class))); 
    IconAdapter ia = new IconAdapter(icons); 
    gv.setAdapter(ia); 
    gv.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3){ 
      Intent i = ((IconAdapter)arg0.getAdapter()).getItem(arg2).getIntent(); 
      if (i != null) 
       HomeActivity.this.startActivity(i); 
     } 
    }); 
} 

public void onConfigurationChanged(Configuration newConfig){ 
    super.onConfigurationChanged(newConfig);  
    configureYourUIHere(); 
} 
+0

说得过早。我花了一些时间进行测试,发现如果按下首选项按钮(因此首选项活动出现),旋转屏幕,然后点击后退按钮,仍然可能导致问题。必须有更好的解决办法,而不必在屏幕旋转或可能旋转时重新初始化所有内容。 – 2010-06-19 21:03:58

+0

实际上,Android在方向更改时调用'onDestroy'和'onCreate'方法,因此您必须重新初始化UI。在这种情况下,你可以做的是试图通过你自己来处理这个'轮换',而不是让操作系统去做。你可以通过添加到清单上的活动引用来实现:'android:configChanges =“keyboardHidden | orientation”' – Cristian 2010-06-19 21:24:17

+0

我已经在我的清单中有该行。我也无法删除它们,并且每次都将它放到'onCreate'上,因为尽管在这个特定的活动中它并不重要,但我也有类似的地方。 – 2010-06-21 14:40:47