3

我有一个屏幕,当设备是横向和纵向时显示不同的用户界面。它显示了ListView设备是纵向的,它显示了GridView设备是横向的。它看起来像 youtube 应用程序或 google play 商店应用程序。

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

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

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

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

4

3 回答 3

7

开发此功能有两件事。

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

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 语句。

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

  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
    }
    

要回复您的编辑:

片段与活动非常相似。

如果您想在方向更改期间保存数据,请遵循有关此主题的官方文档,尤其是在配置更改期间保留对象的部分。

您不应按照文档中的android:configChanges说明使用 in Manifest :

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

于 2013-05-15T14:09:44.417 回答
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";
            }
        }

此方法检测并返回设备方向变化。可能很有用。

于 2013-05-15T13:57:52.443 回答
1

在独立于应用程序中的活动的应用程序中保存数据的一种好方法是拥有一个应用程序对象。虽然文档说“通常不需要继承 Application”,但我发现它们非常有用。您的应用程序类需要在应用程序清单中提及,并且它会在任何活动对象之前创建。因此,将您的所有数据存储在您的应用程序类中,然后当方向改变时,您的活动会发生什么并不重要。

于 2013-05-15T14:03:40.933 回答