当设备改变方向时更改用户界面 Android

3
我有一个屏幕,当设备处于纵向或横向时会显示不同的用户界面。当设备纵向时,它显示 ListView,而当设备为横向时,则显示GridView。它看起来像YouTube应用程序或Google Play商店应用程序。
感谢您阅读并回答我的问题。
编辑:我想添加有关我的问题的更多细节:
  • 我正在使用片段来管理此视图。
  • 当旋转屏幕时,我需要保存所有数据和该视图(避免重新加载大量数据)。
  • 我尝试在清单上添加android:configChanges,并在此片段中使用onConfigurationChanged。但它没有成功。
我希望能够看到特定的示例或详细解决方案。但任何答案都可以。谢谢。

你在做这件事时遇到了什么问题? - Iftikar Urrhman Khan
我找不到解决这个问题的方法。 - Thanh Le
3个回答

7
这个功能需要开发两个方面。
首先,您需要制作两个不同的布局:
res
|- layout
   |- mylayout.xml
|- layout-land.xml
   |- mylayout.xml

layout/mylayout.xml 文件中,包含一个需要的 ListView,在 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);

现在,在代码中,您需要检查您处于哪种方向,以进行if / else语句。
为了检测您处于哪种方向,请遵循以下状态:
  1. create a file in res/values/bool.xml

    <resources>
        <bool name="isLandscape">false</bool>
    </resources>
    
  2. create a file in res/values-land/bool.xml

    <resources>
       <bool name="isLandscape">true</bool>
    </resources>
    
  3. Now in your activity you can easily test, every time you need, if you are in landscape or portrait mode and apply the corresponding action

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

回应您的编辑:

对于此问题,片段与活动非常相似。

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

不应该像文档中所解释的那样在清单中使用android:configChanges

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


谢谢您的回答。根据您的解决方案,如果屏幕旋转,我应该把数据放在哪里?是放在应用程序对象中还是其他地方?谢谢。 - Thanh Le
如果您想在屏幕方向改变时保存数据,请遵循官方的Android解释:http://developer.android.com/guide/topics/resources/runtime-changes.html - ol_v_er
我正在使用Fragment,但它没有onRetainNonConfigurationInstance()函数。我必须在父Activity中实现此函数,对吗?但我想在Fragment内完成所有操作。你有什么解决方案吗?谢谢。 - Thanh Le
不,没有。有一个Fragment方法,setRetainInstance,可以解决这个问题。 - ol_v_er
非常感谢。我认为我可以解决这个问题。但是你能否更详细地解释一下setRetainInstance呢?我会将你的答案标记为被接受的答案。非常感谢。 - Thanh Le
显示剩余2条评论

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";
            }
        }

这个方法可以检测并返回设备方向的改变,非常有用。


1

在独立于应用程序活动的应用程序中保存数据的好方法是拥有 一个应用程序对象。尽管文档说“通常没有必要子类化应用程序”,但我发现它们非常有用。您的应用程序类需要在应用程序清单中被提及,并在任何活动对象之前创建。因此,将所有数据存储在应用程序类中,这样无论发生什么情况,活动在方向更改时都不会受到影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接