设备更改方向android时更改用户界面

Tha*_* Le 3 android android-layout

我有一个屏幕,当设备是lanscape和portrait时显示不同的用户界面.它显示ListView设备是纵向的时间,它显示GridView何时设备是lanscape.它看起来像youtube应用程序或谷歌播放商店应用程序.

感谢您阅读和回答我的问题.

编辑:我想添加有关我的问题的更多详细信息:

  • 我正在使用片段来管理这个视图.
  • 我需要保存所有数据并在此视图中旋转(避免重新加载大量数据).
  • 我试图在清单上添加android:configChanges并在此片段中使用onConfigurationChanged.但这并不成功.

我希望看到特定的例子或详细的解决方案.但任何答案都是适当的.谢谢

ol_*_*_er 7

开发此功能有两件事.

首先,您必须制作两种不同的布局:

res
|- layout
   |- mylayout.xml
|- layout-land.xml
   |- mylayout.xml
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

现在,在代码中,您需要检查if/else语句的方向.

要检测您的方向,请遵循以下状态:

  1. 在中创建一个文件 res/values/bool.xml

    <resources>
        <bool name="isLandscape">false</bool>
    </resources>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在中创建一个文件 res/values-land/bool.xml

    <resources>
       <bool name="isLandscape">true</bool>
    </resources>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在,在您的活动中,您可以在每次需要时轻松测试,如果您处于横向或纵向模式并应用相应的操作

    boolean landscape = getResources().getBoolean(R.bool.isLandscape);
    if (landscape) {
        // do something with your GridView
    } else {
        // do something with your ListView
    }
    
    Run Code Online (Sandbox Code Playgroud)

要回复您的修改:

碎片与活动非常相似.

如果要在方向更改期间保存数据,请按照本主题中官方文档进行操作,尤其是有关在配置更改期间保留对象的部分.

您不应该使用文档中android:configChanges解释的in Manifest :

自己处理配置更改会使使用备用资源变得更加困难,因为系统不会自动为您应用它们.当您必须避免因配置更改而重新启动时,此技术应被视为最后的手段,并且不建议用于大多数应用程序.