当我旋转屏幕时,WebView会重新加载整个页面。我不能拥有这个,因为我的一些内容包含动态/随机材料。目前,当旋转屏幕时,会从loadUrl()方法重新加载原始URL。
知道我的代码有什么问题吗?
的 MainActivity.java 的
package com.mark.myapp;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends Activity {
WebView web;
String webURL = "http://www.google.co.uk/";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null)
((WebView)findViewById(R.id.web)).restoreState(savedInstanceState);
web = (WebView) findViewById(R.id.web);
web.getSettings().setJavaScriptEnabled(true);
web.loadUrl(webURL);
web.setPadding(0, 0, 0, 0);
web.getSettings().setLoadWithOverviewMode(true);
web.getSettings().setUseWideViewPort(true);
web.getSettings().setSupportZoom(true);
web.getSettings().setBuiltInZoomControls(true);
web.setWebViewClient(new HelloWebViewClient());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
private class HelloWebViewClient extends WebViewClient {
public boolean shouldOverrideUrlLoading(WebView web, String url) {
web.loadUrl(url);
return true;
}
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) {
web.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
的的AndroidManifest.xml 的
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mark.myapp"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
答案 0 :(得分:80)
我认为主要的问题是你调用web.loadUrl(webURL);还有当savedInstanceState!= null
时修改强>
尝试:
if (savedInstanceState == null)
{
web.loadUrl(webURL);
}
EDIT2 :您还需要onSaveInstanceState和onRestoreInstanceState覆盖。
@Override
protected void onSaveInstanceState(Bundle outState )
{
super.onSaveInstanceState(outState);
web.saveState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
{
super.onRestoreInstanceState(savedInstanceState);
web.restoreState(savedInstanceState);
}
注意:还请在您的Activity中添加AndroidManifest.xml 机器人:configChanges = “方向|屏幕尺寸” 感谢
答案 1 :(得分:59)
不需要java编码。 在清单文件中使用它。
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
像:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.Example.WebviewSample.webviewsample"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
答案 2 :(得分:16)
(清单)
android:configChanges="orientation|screenSize"
在班级
@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
}
答案 3 :(得分:12)
在清单中为我添加android:configChanges="orientation|screenSize"
<activity
android:name="com.example.HelloWorld.WebActivity"
android:label="@string/title_activity_web"
android:configChanges="orientation|screenSize" >
</activity>
答案 4 :(得分:7)
我不相信这会再起作用了。在我的例子中,使用WebView.restore(Bundle savedInstanceState)
恢复状态仍会触发重新加载网址。
查看restoreState()
的{{3}},您会看到它:
如果在此WebView有机会构建状态(加载页面,创建后退/前进列表等)之后调用它,则可能会产生不良副作用。
和
请注意,此方法不再恢复此WebView的显示数据。
支持@ e4c5向我指出docs
中的正确方向当然,极端的行动方针是防止方向变化触发活动破坏/创建。有关如何执行此操作的文档是answer
答案 5 :(得分:5)
在Manifest中添加此代码
<activity
...
android:configChanges="orientation|screenSize">
答案 6 :(得分:4)
重写onConfigChange
方法以避免重定位更改数据
您在AndroidMainfest
档案中的活动。
android:configChanges="orientation|keyboardHidden"
并在WebView设置中也有这些
webview.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
webview.loadUrl("Your URL To Load");
答案 7 :(得分:4)
在清单文件中尝试此操作:
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
答案 8 :(得分:4)
将其放在Manifest.xml文件活动中:
android:configChanges="orientation|screenSize"
以下是一个例子:
<activity android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar"
android:configChanges="orientation|screenSize">
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
答案 9 :(得分:4)
引用here,
警告:从Android 3.2(API级别13)开始,“屏幕大小” 当设备在纵向和横向之间切换时也会发生变化 取向。因此,如果您希望阻止运行时重新启动 开发API级别13或更高级别时的方向更改(如 由minSdkVersion和targetSdkVersion属性声明),你 除“方向”外,还必须包含“screenSize”值 值。也就是说,你必须decalare 机器人:configChanges = “方向|屏幕尺寸”。但是,如果你的 应用程序目标API级别12或更低,然后您的活动始终 处理此配置更改本身(此配置更改 即使在Android 3.2或Android上运行,也不会重新启动您的活动 更高的设备)。
在您的活动中设置android:configChanges="orientation|screenSize"
将解决此问题。
另外,请注意以下内容
切记:声明活动以处理配置时 更改,您有责任重置您的任何元素 提供替代品。如果您声明您的活动来处理 方向改变并且具有应该在其间改变的图像 横向和纵向,您必须为每个资源重新分配每个资源 onConfigurationChanged()中的元素。
答案 10 :(得分:3)
此解决方案对我来说效果很好:
(1)在AndroidManifest.xml中添加此行 android:configChanges =“ keyboard | keyboardHidden | orientation | screenLayout | uiMode | screenSize | smallestScreenSize”
喜欢这个(和上面的答案一样)
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
(2)然后在MainActivity.java中验证savedInstanceState
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainContext = getApplicationContext();
----
myWebView = (WebView) findViewById(R.id.webView);
prepareWebView();
myWebView.addJavascriptInterface(myJavaScriptInterface, "WEB2Android");
if (savedInstanceState == null) {
myWebView.post(new Runnable() {
@Override
public void run() {
myWebView.loadUrl("http://www.appbiz.ro/foto_konta");
}
});
}
----
}
(3),然后:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
@Override
protected void onSaveInstanceState(Bundle outState )
{
super.onSaveInstanceState(outState);
myWebView.saveState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
{
super.onRestoreInstanceState(savedInstanceState);
myWebView.restoreState(savedInstanceState);
}
答案 11 :(得分:0)
在Androidmanifest.xml中添加它:
<activity android:name=".MyActivity"
android:configChanges="orientation|screenSize|screenLayout|keyboardHidden">
现在,当其中一种配置更改时,MyActivity
不会重新启动。相反,MyActivity
收到对onConfigurationChanged()
的呼叫。
添加此内容:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
}
else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
}