方向更改时Android WebView刷新

方向更改时Android WebView刷新,android,android-webview,Android,Android Webview,我有一个使用webview加载URL的应用程序。它有一个登录功能。登录后,它将重定向到主页。我的代码如下 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myWebView = (WebView) findViewById(R.id.w

我有一个使用webview加载URL的应用程序。它有一个登录功能。登录后,它将重定向到主页。我的代码如下

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    myWebView = (WebView) findViewById(R.id.webview);
    WebSettings webSettings = myWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setDomStorageEnabled(true);

    myWebView.setWebViewClient(new WebViewClient());
    myWebView.addJavascriptInterface(new JavaScriptInterface(this), "Android");

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)
        != PackageManager.PERMISSION_GRANTED) {

        ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.READ_PHONE_STATE},
            MY_PERMISSIONS_REQUEST_READ_PHONE_STATE);
    } else {
        loadURL();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_PHONE_STATE: {
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                loadURL();
            } else {
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.READ_PHONE_STATE},
                        MY_PERMISSIONS_REQUEST_READ_PHONE_STATE);
            }
            return;
        }
    }
}

private void loadURL() {
    //myWebView.loadUrl("http://192.168.0.198:8080/dashboard/");

    myWebView.loadUrl("http://192.168.0.156:8080/dashboard/");
}
下面是我的AndroidManifest.xml文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tg_david.myapplication">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:configChanges="orientation|screenSize"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>


如您所见,我已经包括了android:configChanges=“orientation | screenSize”,但它仍然不起作用。每次手机改变方向时,网络视图仍会刷新。刷新后,页面将重定向回登录页面。可能是因为WebView在手机方向更改时清除会话并强制页面注销吗?

您需要做的就是覆盖onSaveInstanceState和onRestoreInstanceState

@Override
protected void onSaveInstanceState(Bundle outState ){
    super.onSaveInstanceState(outState);
    mWebView.saveState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState){
    super.onRestoreInstanceState(savedInstanceState);
    mWebView.restoreState(savedInstanceState);
}
另一个解决方案是将清单中的活动标记更新为

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"


您需要做的就是重写onSaveInstanceState和onRestoreInstanceState

@Override
protected void onSaveInstanceState(Bundle outState ){
    super.onSaveInstanceState(outState);
    mWebView.saveState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState){
    super.onRestoreInstanceState(savedInstanceState);
    mWebView.restoreState(savedInstanceState);
}
另一个解决方案是将清单中的活动标记更新为

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"


此解决方案对我很有效:

(1) 在AndroidManifest.xml中添加以下行 android:configChanges=“键盘|键盘隐藏|方向|屏幕布局| uiMode |屏幕大小|最小屏幕大小”

像这样:

<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>
(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);
}

此解决方案对我很有效:

(1) 在AndroidManifest.xml中添加以下行 android:configChanges=“键盘|键盘隐藏|方向|屏幕布局| uiMode |屏幕大小|最小屏幕大小”

像这样:

<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>
(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);
}

在最新的Android版本中,只需在清单
Android:configChanges=“键盘|键盘隐藏|方向|屏幕布局| uiMode |屏幕大小|最小屏幕大小”

根据需要添加或删除上述参数。 在许多情况下,我们也有一个Splash活动,我们通常会错过这些选项,我可以通过提及上面相同的参数并重写函数来修复我的情况

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
}
在飞溅活动中


如果有帮助,请告诉我。

在最新的Android版本中,只需在清单中提到Android:configChanges=“keyboard | keyboardHidden | orientation | screenLayout | uiMode | screenSize | smallestScreenSize”

根据需要添加或删除上述参数。 在许多情况下,我们也有一个Splash活动,我们通常会错过这些选项,我可以通过提及上面相同的参数并重写函数来修复我的情况

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
}
在飞溅活动中


如果有帮助,请告诉我。

没有,仍然不起作用。我添加了2个覆盖并更改了我的清单。它总是刷新并迫使我重新登录。不,仍然不起作用。我添加了2个覆盖并更改了我的清单。它总是刷新并迫使我重新登录。