处理方向更改后的Android GridView反转

处理方向更改后的Android GridView反转,android,gridview,screen-orientation,Android,Gridview,Screen Orientation,编辑:此问题可能与 我的主应用程序屏幕使用GridView显示图标网格。每个图标都有一个图像、名称和意图。我将活动设置为处理方向更改,以便可以更改背景。onCreate方法使用3个不做任何事情的测试图标和一个打开PreferencesActivity的preferences图标设置GridView: super.onCreate(savedInstanceState); setContentView(R.layout.main); GridView gv = (GridView) findV

编辑:此问题可能与


我的主应用程序屏幕使用GridView显示图标网格。每个图标都有一个图像、名称和意图。我将活动设置为处理方向更改,以便可以更改背景。onCreate方法使用3个不做任何事情的测试图标和一个打开PreferencesActivity的preferences图标设置GridView:

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);
    }
});

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

尝试将设置用户界面的逻辑分开:

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();
}
GridView-gv;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
在此处配置yourui();
}
public void configureYourUIHere(){
gv=(GridView)findViewById(R.id.main_网格);
如果(getResources().getConfiguration().orientation==
配置。方向(景观)
gv.后退地面资源(R.可牵引主水平面);
其他的
gv.挫折资源(R.可提取的主要背景);
ArrayList图标=新建ArrayList();
添加(新图标(“test1”,R.drawable.test1,null));
添加(新图标(“test2”,R.drawable.test2,null));
添加(新图标(“test3”,R.drawable.test3,null));
图标。添加(新图标(“首选项”)、R.drawable.perferences、新意图(此、,
AlertPreferences.class));
IconAdapter ia=新的IconAdapter(图标);
gv.设置适配器(ia);
gv.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
公共视图单击(AdapterView arg0、视图arg1、整型arg2、长型arg3){
Intent i=((IconAdapter)arg0.getAdapter()).getItem(arg2.getIntent();
如果(i!=null)
家庭活动。这。startActivity(i);
}
});
}
公共无效OnConfiguration已更改(配置newConfig){
super.onConfigurationChanged(newConfig);
在此处配置yourui();
}

这实际上是自定义适配器的问题。问题和解决方案都在这里

说得太早了。我花了更多的时间进行测试,发现如果我按下preferences按钮(这样preferences活动就会出现),旋转屏幕,然后点击back按钮,仍然会导致问题。一定有比在屏幕旋转或可能已经旋转时重新初始化所有内容更好的修复方法。实际上,当方向改变时,Android会调用
ondestory
onCreate
方法,因此您必须重新初始化UI。在这种情况下,你能做的就是自己处理这种“轮换”,而不是让操作系统来做。您可以通过将其添加到清单上的活动引用中来实现这一点:
android:configChanges=“keyboardHidden | orientation”
我的清单中已经有这一行了。我也不能每次都删除它们并让它转到
onCreate
,因为尽管在这个特定的活动中这并不重要,但我还有其他类似的活动。
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();
}