开发此功能有两件事。
首先,您必须制作两种不同的布局:
res
|- layout
|- mylayout.xml
|- layout-land.xml
|- mylayout.xml
在layout/mylayout.xml
文件中,包含ListView
您需要的位置,并在 中layout-land/mylayout.xml
,包含您的GridView
.
当您调用时,Android 将根据当前屏幕方向自动选择正确的布局setContentView
。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mylayout);
mListView = (ListView) findViewById(R.id.mylistview);
mGridView = (GridView) findViewById(R.id.mygridview);
// !!!!!!!
// mListView will be null in landscape
// mGridView will be null in portrait
// !!!!!!!
}
setContentView(R.layout.mylayout);
现在,在代码中,您需要检查要在哪个方向上进行 if/else 语句。
要检测您的方向,请遵循以下状态:
在中创建一个文件res/values/bool.xml
<resources>
<bool name="isLandscape">false</bool>
</resources>
在中创建一个文件res/values-land/bool.xml
<resources>
<bool name="isLandscape">true</bool>
</resources>
现在在您的活动中,您可以轻松地测试,每次您需要时,如果您处于横向或纵向模式并应用相应的操作
boolean landscape = getResources().getBoolean(R.bool.isLandscape);
if (landscape) {
// do something with your GridView
} else {
// do something with your ListView
}
要回复您的编辑:
片段与活动非常相似。
如果您想在方向更改期间保存数据,请遵循有关此主题的官方文档,尤其是在配置更改期间保留对象的部分。
您不应按照文档中的android:configChanges
说明使用 in Manifest :
自己处理配置更改会使使用替代资源变得更加困难,因为系统不会自动为您应用它们。当您必须避免由于配置更改而重新启动并且不建议用于大多数应用程序时,应将此技术视为最后的手段。