我有一个屏幕,当设备是lanscape和portrait时显示不同的用户界面。设备为纵向时显示ListView
,设备为lanscape时显示GridView
。
它看起来像youtube应用程序或谷歌播放商店应用程序。
感谢您阅读并回答我的问题。
编辑:我想添加有关我的问题的更多详细信息:
我希望看到特定的例子或详细的解决方案。 但任何答案都是适当的。 感谢
答案 0 :(得分:7)
开发此功能有两件事。
首先,您必须制作两种不同的布局:
res
|- layout
|- mylayout.xml
|- layout-land.xml
|- mylayout.xml
在layout/mylayout.xml
文件中,在ListView
的{{1}}中添加layout-land/mylayout.xml
,包括GridView
。
当您致电setContentView
时,Android会自动选择正确的布局,具体取决于当前的屏幕方向。
@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);
现在,在代码中,如果/ 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
}
回复您的修改:
片段与此活动非常相似。
如果您想在方向更改期间保存数据,请按照official documentation on this topic进行操作,尤其是Retaining an Object During a Configuration Change上的部分。
您不应按照in the documentation所解释的那样使用清单中的android:configChanges
:
自己处理配置更改可以使其更多 难以使用替代资源,因为系统没有 自动为您应用它们。应该考虑这种技术 必须避免因配置而重新启动的最后手段 更改,不建议用于大多数应用程序。
答案 1 :(得分:1)
尝试此操作并相应更改布局。
public String getOrientation(Context context){
final int rotation = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();
switch (rotation) {
case Surface.ROTATION_0:
return "portrait";
case Surface.ROTATION_90:
return "landscape";
case Surface.ROTATION_180:
return "reverse portrait";
default:
return "reverse landscape";
}
}
此方法检测并返回设备方向更改。可能非常有用。
答案 2 :(得分:1)
在应用程序中保存数据的一种好方法是独立于应用程序中的活动,即an application object。虽然文档说“通常不需要子类应用程序”,但我发现它们非常有用。您的应用程序类需要在应用程序清单中提及,并在任何活动对象之前创建。因此,将所有数据存储在应用程序类中,然后在方向更改时,您的活动会发生什么情况并不重要。