【问题标题】:Keep webview while changing layout on screen rotation在更改屏幕旋转布局时保持 webview
【发布时间】:2012-12-12 16:09:23
【问题描述】:

我的应用程序有两种不同的纵向和横向模式布局,它们都封装了 webview 和一些按钮。按钮纵向位于底部,横向位于左侧,因此 web 视图中有更多的阅读空间。

问题是,活动是在屏幕旋转时重新创建的,并且 webview 会加载第一个页面,这不是想要的行为。

我搜索并发现在活动标签中使用 android:configChanges="orientation" 会阻止重新创建活动。但问题是它会阻止布局在创建活动时发生变化。

我希望我的程序在 2.2 中运行,这是最好的方法吗?

【问题讨论】:

    标签: android android-layout webview orientation


    【解决方案1】:

    我测试了片段,但是处理片段会使事情变得更加复杂,片段本身需要保存和恢复,这在具有 javascript 状态的 web 视图中可能不起作用,所以我进行了更多搜索,并在某处找到了一篇不错的文章并进行了一些修改我提出了一个我建议的解决方案:

    首先,将 android:configChanges="orientation|screenSize|keyboard|keyboardHidden" 添加到 manifest,以便应用处理配置更改而不是 android。

    为 lnadscape 和 Portrait 模式制作两种不同的布局,并将它们放在相应的布局文件夹中。在这两种布局中而不是 webview 中放置一个 LinerLayout 作为 webview 的占位符。

    在代码中定义这样的 initUI 方法,并将所有与 UI 初始化相关的东西都放在这个方法中:

    public void initui()
    {
        setContentView(R.layout.main);
        if (wv == null) wv = new WebView(this);
        ((LinearLayout)findViewById(R.id.webviewplace)).addView(wv);
        findViewById(R.id.home).setOnClickListener(this);
    }
    

    如果 webview 不存在,它将被创建并在 setContentView(R.layout.main) 之后将其添加到布局中。其他 UI 自定义随后出现。

    在 onConfigurationChanged 中:

    @Override
    public void onConfigurationChanged(Configuration newConfig)
    {
        ((LinearLayout)findViewById(R.id.webviewplace)).removeAllViews();
        super.onConfigurationChanged(newConfig);
        initUI();
    }
    

    在 onConfigChange 中,首先从旧占位符中删除 webview,然后调用 initui 将其添加回新布局。

    并在 oncreate 调用 initui 以便第一次初始化 ui。

    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        initUI()
    }
    

    【讨论】:

      【解决方案2】:

      您不能将上次加载的 URL 保存在 onSaveInstanceState(Bundle outState) 中的 web 视图中,然后确保使用 myWebview.loadUrl(restoredUrl) 重新加载它 onRestoreInstanceState(Bundle savedInstanceState)

      edit 我知道如果您显示的网页需要保留状态,这可能不起作用。但如果不是,它应该可以解决您的问题。

      【讨论】:

      • 这是个好主意,但另一方面,活动的重新创建似乎需要一些时间,有没有办法实用地应用新布局而不重新创建所有内容?
      • 如果横向模式的布局不同,则必须重新创建活动。您可以尝试使用相同的布局,使其动态地在纵向和横向中工作。但是,如果您需要问题中描述的按钮,我真的不知道如何使用单个布局 XML 文件来管理它。当方向改变时,您是否尝试过以编程方式创建/移动/显示/隐藏按钮?也许不是最好的解决方案,但如果你想加快速度,它可能是一个选择。这样你就可以保留 web 视图,只用按钮做一些小事情。
      • 我尝试以编程方式执行此操作,但由于它太难了,所以我搜索了更多更好的方法,我找到了一个使用两个 XML 布局文件甚至没有片段的方法来执行此操作。它的工作就像一个魅力!
      【解决方案3】:

      来自此文档https://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange 我刚刚用 android:configchanges 编辑了清单,所以它对我来说很好。

      <activity android:name=".Webhtml"
      android:configChanges="orientation|screenSize"/>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-28
        相关资源
        最近更新 更多