1

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

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

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

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

4

3 回答 3

1

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

首先,将 android:configChanges="orientation|screenSize|keyboard|keyboardHidden" 添加到清单中,以便应用处理配置更改而不是 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()
}
于 2012-12-18T18:32:03.833 回答
0

您不能将最后加载的 URL 保存在 webview 中onSaveInstanceState(Bundle outState),然后确保onRestoreInstanceState(Bundle savedInstanceState)使用重新加载它myWebview.loadUrl(restoredUrl)吗?

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

于 2012-12-12T16:19:14.593 回答
0

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

<activity android:name=".Webhtml"
android:configChanges="orientation|screenSize"/>
于 2017-02-07T13:56:02.907 回答