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

时间:2013-05-15 13:45:38

标签: android android-layout

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

感谢您阅读并回答我的问题。

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

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

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

3 个答案:

答案 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语句,您将需要检查您的方向。

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

  1. res/values/bool.xml

    中创建文件
    <resources>
        <bool name="isLandscape">false</bool>
    </resources>
    
  2. res/values-land/bool.xml

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

    boolean landscape = getResources().getBoolean(R.bool.isLandscape);
    if (landscape) {
        // do something with your GridView
    } else {
        // do something with your ListView
    }
    
  4. 回复您的修改:

    片段与此活动非常相似。

    如果您想在方向更改期间保存数据,请按照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。虽然文档说“通常不需要子类应用程序”,但我发现它们非常有用。您的应用程序类需要在应用程序清单中提及,并在任何活动对象之前创建。因此,将所有数据存储在应用程序类中,然后在方向更改时,您的活动会发生什么情况并不重要。