【问题标题】:Changing android:configChanges dynamically动态更改 android:configChanges
【发布时间】:2011-08-30 16:14:37
【问题描述】:

我正在创建一个杂志应用程序,它使用 ViewPager 并在不同的 WebViews 上滚动。 大多数页面是纵向的,但其中一些可以被视为横向。

为了处理这个问题,我在Activity 中使用了两种方法来持有ViewPager

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" 添加到Activity 将“禁止”重新创建视图。

我想到的两种可能的解决方案:

  1. 根据页面更改代码中的android:configChanges,但我找不到该调用是否存在。
  2. 强制重新创建 onConfigurationChanged() 方法。我不知道如何强制重新创建 fragment

有什么想法吗?

【问题讨论】:

    标签: android android-fragments android-viewpager


    【解决方案1】:

    也许有一种方法可以解决这个问题,方法是在清单中用相似的名称定义两次活动并将第二个化身设置为启用 = 假。然后通过调用PackageManager.setComponentEnabledSetting(....) 来动态切换这两个活动,虽然这只是一个想法,但不确定它是否会起作用。

    【讨论】:

    • 我刚刚阅读了一些关于setComponentEnabledSetting() 方法的内容。它的问题是它需要一个ComponentName,它是用包名和类名创建的,所以活动的名称不能相等。如果这是解决方案,它与定义两个不同的activities 并在页面滚动时启动它们听起来不太好:(
    【解决方案2】:

    我正在创建一个杂志应用,它使用 ViewPager 并在不同的 WebView 上滚动。

    这靠谱吗?

    大部分页面是纵向的,但其中一些可以被视为横向。

    请允许以横向方式查看所有页面。如果您的用户想要横向观看您的应用(例如,他们不想为了使用您的应用而将电视侧放),请让他们这样做。

    有什么想法吗?

    在活动的onResume() 中,通知杂志页面片段根据当时的Configuration (getResources().getConfiguration()) 修复其VideoView 的大小/位置。

    【讨论】:

    • a) 你所说的可靠是什么意思? b)大多数页面都是全屏图像,不幸的是我没有资源以横向模式显示它们。 c) 我想在onResume() 方法中添加该逻辑,但这将意味着重新创建视频。不仅浪费资源,还需要把所有的逻辑都添加到seekTo()
    • @Macarse: '你所说的可靠是什么意思?" -- 我预计ViewPagerWebView 会为触摸事件而战。"这将意味着重新创建视频" -- 是的。但是,我有一种有趣的感觉,即您将无法得到您想要的东西。我不知道您的两个具体想法(在您问题的底部)是否可能。
    【解决方案3】:

    我刚刚修好了。感谢您的回答。

    我的解决方案是让Activity 具有android:configChanges="orientation|keyboardHidden" 标志。

    之后,我覆盖了Fragment 中的onConfigurationChanged() 方法,在此我根据需要调整WebViewVideoView 的大小。

    编辑:

    我刚刚对此进行了blog post

    【讨论】:

    • 这个实现很简单,在Coinverse app中运行良好!我在 DialogFragment 中覆盖了onConfigurationChanged,以便让 ExoPlayer 和嵌入式 YouTube 播放器视图无缝播放内容,而不会因方向更改而中断。在onConfigurationChanged 中,我更新了 DialogFragment 尺寸以保持内容与屏幕方向成比例。
    猜你喜欢
    • 2022-11-27
    • 1970-01-01
    • 2023-03-09
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多