在屏幕旋转时更改布局时保持webview

时间:2012-12-12 16:09:24

标签: android android-layout webview orientation

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

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

我搜索并发现在活动标签中使用android:configChanges =“orientation”会阻止重新创建活动。但问题是,它会阻止布局的变化,就像在活动创建中一样。

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

3 个答案:

答案 0 :(得分:1)

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

首先,将android:configChanges =“orientation | screenSize | keyboard | keyboardHidden”添加到清单,以便app处理配置更改而不是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()
}

答案 1 :(得分:0)

您是否可以在onSaveInstanceState(Bundle outState)的网页浏览中保存上次加载的网址,然后确保使用onRestoreInstanceState(Bundle savedInstanceState)重新加载myWebview.loadUrl(restoredUrl)

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

答案 2 :(得分:0)

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

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