动态更改android:configChanges

6
我正在开发一款杂志应用程序,它使用 ViewPager 并可以在不同的 WebView 之间滚动。大部分页面都是纵向的,但有些页面可以横向查看。
为了处理这种情况,我在承载 ViewPagerActivity 中使用了两种方法:
public void allowOrientationChanges() {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}

public void enforcePortrait() {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

通过调用getActivity().enforcePortrait(),我们确保所有只需要纵向显示的页面都保持纵向状态;而对于需要横纵向视图的页面,则需要经历整个重启过程,因此需要调用getActivity().allowOrientationChanges()
我们想要在一些杂志页面上添加视频功能,但不幸的是HTML5视频标签无法正常工作,因此我们在布局中添加了VideoView。现在需要添加的功能是:
  • 在纵向模式下:在特定位置显示视频(已完成!)。
  • 在横向模式下:使视频全屏(类似于YouTube应用程序)。
我一直在尝试实现这一点,唯一找到的方法是在ActivityonConfigurationChanged()方法中更改VideoView的大小,并通知fragment配置已更改。但是,使用android:configChanges="orientation|keyboardHidden"将禁止视图重新创建,这是一个问题。
我想到了两种可能的解决方案:
  1. 从代码中更改android:configChanges,并根据页面进行调用,但我无法确定该调用是否存在。
  2. onConfigurationChanged()方法中强制重新创建。我不知道如何强制重新创建fragment
有什么想法吗?
3个回答

2
也许有一种方法可以绕过这个问题,就是在清单文件中定义两次相似名称的活动,并将第二次定义设置为enabled=false。然后通过调用PackageManager.setComponentEnabledSetting(....)动态地切换这两个活动,但这只是一个想法,不确定是否可行。

我刚刚了解了一下setComponentEnabledSetting()方法。它的问题在于它需要一个由包名和类名创建的ComponentName,因此活动名称不能相同。如果这是解决方案,那么当页面滚动时启动两个不同的activities,这听起来并不好:( - Macarse

2
我正在创建一个杂志应用程序,它使用ViewPager并在不同的WebViews上滚动。
这可靠吗?
大多数页面是纵向的,但有些页面可以看作是横向的。
请允许所有页面都能以横向方式查看。如果您的用户想要以横向方式查看您的应用程序 - 例如,他们不想将电视翻转以使用您的应用程序 - 请让他们这样做。
有任何想法吗?
在活动的onResume()中,通知杂志页面片段根据当时的Configuration(getResources().getConfiguration())调整其VideoView的大小/位置。

a) 你所说的“可靠”是什么意思? b) 大多数页面都是全屏图像,不幸的是我没有资源以横向模式显示它们。 c) 我考虑将该逻辑添加到“onResume()”方法中,但这意味着视频将被重新创建。这不仅浪费资源,而且我需要添加所有“seekTo()”逻辑。 - Macarse
@Macarse:"你说的'可靠'是什么意思?" -- 我预计 ViewPagerWebView 会争夺触摸事件。"这意味着视频将重新创建" -- 是的。然而,我有一种奇怪的感觉,你可能无法得到想要的结果。我不知道你在问题底部提出的两个具体想法是否可行。 - CommonsWare

2
我已经解决了。感谢你的回答。
我的解决方法是将Activity设置为android:configChanges="orientation|keyboardHidden"标志。
这样做后,我在Fragment中重写onConfigurationChanged()方法,在其中调整WebViewVideoView的大小,具体取决于我需要调整什么。
编辑:
我刚刚发布了一篇关于此问题的博客文章

这个实现简单且在Coinverse app中运行良好!我在DialogFragment中重写了onConfigurationChanged,以便拥有一个ExoPlayer和嵌入式YouTube播放器视图,无需因方向更改而中断播放内容。在onConfigurationChanged中,我更新了DialogFragment的尺寸,以保持内容与屏幕方向成比例。 - AdamHurwitz

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