Android WebView:处理方向更改


147

问题是轮换后的性能。WebView必须重新加载页面,这可能有点乏味。

在不每次都从源中重新加载页面的情况下,处理方向更改的最佳方法是什么?


3
“从源重新加载”是指它是重新下载页面,还是只是重新呈现页面?
杰里米·洛根

Blackhex引用的解决方案解决了我的问题。
Italo Borssatto 2012年

6
我想知道我的应用程序到底有什么特别之处,以至于这些答案都不起作用……
RobinJ

Answers:


91

如果您不希望WebView在方向更改时重新加载,只需在Activity类中重写onConfigurationChanged:

@Override
public void onConfigurationChanged(Configuration newConfig){        
    super.onConfigurationChanged(newConfig);
}

并在清单中设置android:configChanges属性:

<activity android:name="..."
          android:label="@string/appName"
          android:configChanges="orientation|screenSize"

有关更多信息,请参见:http :
//developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange

https://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges


4
我测试了一下,但发现不起作用,如下所示设置configChanges属性即可。android:configChanges =“ keyboardHidden | orientation”
virsir 2010年

18
这样做,实际上是在鼓励,因为之前已经多次提及
马蒂亚斯

3
Matthias:这不是真的-请参阅Javadoc for WebView。
krtek 2011年

有关此解决方案的两点注意事项:1)如果您有一个带有WebView的抽象Activity,则该configChanges属性将添加到子类Activity 2)如果您的应用程序依赖于多个项目,则该configChanges属性将被添加到该项目的清单中。依赖关系树的顶部(可能不是包含Activity类的项目)。
阿曼达·S

4
这样的onConfigurationChanged方法重写是没有用的。
Miha_x64

69

编辑:此方法不再按文档中所述工作


原始答案:

这可以通过覆盖onSaveInstanceState(Bundle outState)您的活动并saveState从Web视图中调用来解决:

   protected void onSaveInstanceState(Bundle outState) {
      webView.saveState(outState);
   }

当然,在重新放大Webview之后,请在onCreate中恢复它:

public void onCreate(final Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.blah);
   if (savedInstanceState != null)
      ((WebView)findViewById(R.id.webview)).restoreState(savedInstanceState);
}

26
这不适用于方向更改-显示空白屏幕。saveState \ restoreState方法被调用,但没有帮助。
Oleksii Malovanyi,2011年

1
这是onCreate代码段:setContentView(R.layout.webview); mWebView =(WebView)findViewById(R.id.webview); 如果(savedInstanceState == null){mWebView.getSettings()。setJavaScriptEnabled(true); mWebView.setWebViewClient(new SimpleWebViewClient()); mWebView.loadUrl(Consts.URL_AUTHORIZATION_OAUTH); }其他{mWebView.restoreState(savedInstanceState); }
Oleksii Malovanyi 2011年

12
从saveState的文档中:请注意,此方法不再存储此WebView的显示数据。先前的行为可能会泄漏文件...
brillenheini 2013年

5
“请注意,这种方法不再存储显示数据为这个的WebView” - developer.android.com/reference/android/webkit/WebView.html
史蒂芬马克福特

为了防止重新加载WebView表单,现在有人对“该方法不再存储此WebView的显示数据”有什么建议吗?
卢卡斯·P。,

24

最好的答案是遵循此处找到的Android文档 基本上这将阻止Webview重新加载:

<activity android:name=".MyActivity"
      android:configChanges="keyboardHidden|orientation|screenSize|layoutDirection|uiMode"
      android:label="@string/app_name">

(可选)您可以通过覆盖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();
    }
}

6
我敢肯定,您不需要onConfigurationChanged()方法,只需清单中的其他属性即可。我的猜测是对此的本地支持是由WebView提供的,这就是为什么此答案现在是最佳答案的原因(因为最初提出该问题时此答案无效)
Booger 2015年

1
我批准@Booger,您无需覆盖onConfigurationChanged()方法。您所需要做的就是在manifest.xml文件中添加android:configChanges =“ orientation | screenSize”。
ozanurkan '19

5

我试过使用onRetainNonConfigurationInstance(返回WebView),然后在onCreate期间使用getLastNonConfigurationInstance将其恢复并重新分配它。

似乎还没有工作。我禁不住觉得自己真的很亲密!到目前为止,我只得到了一个空白/白色背景的WebView。张贴在这里,希望有人可以帮助将其推向终点。

也许我不应该通过WebView。也许来自WebView中的对象

我尝试的另一种方法(不是我的最爱)是在活动中设置此方法:

 android:configChanges="keyboardHidden|orientation"

...然后在这里几乎什么也不做:

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  // We do nothing here. We're only handling this to keep orientation
  // or keyboard hiding from causing the WebView activity to restart.
}

可行,但可能不被视为最佳做法

同时,我还有一个ImageView,我想根据旋转自动更新。事实证明这很容易。在我的res文件夹,我必须drawable-landdrawable-port持有横向/纵向变化,然后我用R.drawable.myimagenameImageView的的来源和Android‘做正确的事’ -耶!

...除非您注意配置更改,否则不会。:(

所以我很矛盾。使用onRetainNonConfigurationInstanceImageView旋转可以工作,但是WebView持久性不会...或使用onConfigurationChangedWebView保持稳定,但ImageView不会更新。该怎么办?

最后一点:就我而言,强制定向不是可以接受的折衷方案。我们确实确实想很好地支持轮换。有点喜欢Android浏览器应用程序的功能!;)


7
您不应该从onRetainNonConfigurationInstance返回任何视图。这些视图将附加到“活动上下文”中,因此,如果保存该视图,则每次方向发生变化时,您都会随身携带所有行李。该视图是“泄漏的”。(请参见此处的最后一段:developer.android.com/resources/articles/…)onRetainNonConfigurationInstance的最佳做法是保存视图所需的数据,而不是视图本身。
Declan Shanaghy

3

一种折衷办法是避免轮换。添加此选项可仅将活动固定为纵向。

android:screenOrientation="portrait"

这实际上在很多情况下都有效,并且是我决定实施的解决方案:-)
Abdo 2012年

1
嘿,这是一项要求更改
Max Ch

3

处理方向更改和防止在Rotate上重新加载WebView的最佳方法。

@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
}

考虑到这一点,为防止每次更改方向都调用onCreate(),您必须添加 android:configChanges="orientation|screenSize" to the AndroidManifest.

要不就 ..

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

3

只需在清单文件中编写以下代码行即可。真的行:

<activity android:name=".YourActivity"
  android:configChanges="orientation|screenSize"
  android:label="@string/application_name">

3

我感谢这有点晚,但这是我在开发解决方案时使用的答案:

AndroidManifest.xml

    <activity
        android:name=".WebClient"
        android:configChanges="keyboard|keyboardHidden|orientation|screenSize" <--- "screenSize" important
        android:label="@string/title_activity_web_client" >
    </activity>

WebClient.java

public class WebClient extends Activity {

    protected FrameLayout webViewPlaceholder;
    protected WebView webView;

    private String WEBCLIENT_URL;
    private String WEBCLIENT_TITLE;

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

    @SuppressLint("SetJavaScriptEnabled")
    protected void initUI(){
        // Retrieve UI elements
        webViewPlaceholder = ((FrameLayout)findViewById(R.id.webViewPlaceholder));

        // Initialize the WebView if necessary
        if (webView == null)
        {
            // Create the webview
            webView = new WebView(this);
            webView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
            webView.getSettings().setSupportZoom(true);
            webView.getSettings().setBuiltInZoomControls(true);
            webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
            webView.setScrollbarFadingEnabled(true);
            webView.getSettings().setJavaScriptEnabled(true);
            webView.getSettings().setPluginState(android.webkit.WebSettings.PluginState.ON);
            webView.getSettings().setLoadsImagesAutomatically(true);

            // Load the URLs inside the WebView, not in the external web browser
            webView.setWebViewClient(new SetWebClient());
            webView.setWebChromeClient(new WebChromeClient());

            // Load a page
            webView.loadUrl(WEBCLIENT_URL);
        }

        // Attach the WebView to its placeholder
        webViewPlaceholder.addView(webView);
    }

    private class SetWebClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.web_client, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }else if(id == android.R.id.home){
            finish();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onBackPressed() {
        if (webView.canGoBack()) {
            webView.goBack();
            return;
        }

        // Otherwise defer to system default behavior.
        super.onBackPressed();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig){
        if (webView != null){
            // Remove the WebView from the old placeholder
            webViewPlaceholder.removeView(webView);
        }

        super.onConfigurationChanged(newConfig);

        // Load the layout resource for the new configuration
        setContentView(R.layout.activity_web_client);

        // Reinitialize the UI
        initUI();
    }

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

        // Save the state of the WebView
        webView.saveState(outState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState){
        super.onRestoreInstanceState(savedInstanceState);

        // Restore the state of the WebView
        webView.restoreState(savedInstanceState);
    }

}

2

您可以尝试在Activity上使用onSaveInstanceState()onRestoreInstanceState()在WebView实例上调用saveState(...)restoreState(...)


2

到了2015年,许多人正在寻找仍可在Jellybean,KK和Lollipop手机上使用的解决方案。经过很多努力后,我找到了一种更改方向后保持Web视图完整的方法。我的策略基本上是将webview存储在另一个类的单独的静态变量中。然后,如果发生旋转,我将从活动中分离Web视图,等待定向完成,然后将Web视图重新附加到活动中。例如...首先将其放在清单中(keyboardHidden和keyboard是可选的):

<application
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:name="com.myapp.abc.app">

    <activity
            android:name=".myRotatingActivity"
            android:configChanges="keyboard|keyboardHidden|orientation">
    </activity>

在单独的应用程序类中,输入:

     public class app extends Application {
            public static WebView webview;
            public static FrameLayout webviewPlaceholder;//will hold the webview

         @Override
               public void onCreate() {
                   super.onCreate();
    //dont forget to put this on the manifest in order for this onCreate method to fire when the app starts: android:name="com.myapp.abc.app"
                   setFirstLaunch("true");
           }

       public static String isFirstLaunch(Context appContext, String s) {
           try {
          SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext);
          return prefs.getString("booting", "false");
          }catch (Exception e) {
             return "false";
          }
        }

    public static void setFirstLaunch(Context aContext,String s) {
       SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(aContext);
            SharedPreferences.Editor editor = prefs.edit();
            editor.putString("booting", s);
            editor.commit();
           }
        }

在活动中输入:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if(app.isFirstLaunch.equals("true"))) {
            app.setFirstLaunch("false");
            app.webview = new WebView(thisActivity);
            initWebUI("www.mypage.url");
        }
}
@Override
    public  void onRestoreInstanceState(Bundle savedInstanceState) {
        restoreWebview();
    }

public void restoreWebview(){
        app.webviewPlaceholder = (FrameLayout)thisActivity.findViewById(R.id.webviewplaceholder);
        if(app.webviewPlaceholder.getParent()!=null&&((ViewGroup)app.webview.getParent())!=null) {
            ((ViewGroup) app.webview.getParent()).removeView(app.webview);
        }
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT);
        app.webview.setLayoutParams(params);
        app.webviewPlaceholder.addView(app.webview);
        app.needToRestoreWebview=false;
    }

protected static void initWebUI(String url){
        if(app.webviewPlaceholder==null);
          app.webviewPlaceholder = (FrameLayout)thisActivity.findViewById(R.id.webviewplaceholder);
        app.webview.getSettings().setJavaScriptEnabled(true);       app.webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        app.webview.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
        app.webview.getSettings().setSupportZoom(false);
        app.webview.getSettings().setBuiltInZoomControls(true);
        app.webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
        app.webview.setScrollbarFadingEnabled(true);
        app.webview.getSettings().setLoadsImagesAutomatically(true);
        app.webview.loadUrl(url);
        app.webview.setWebViewClient(new WebViewClient());
        if((app.webview.getParent()!=null)){//&&(app.getBooting(thisActivity).equals("true"))) {
            ((ViewGroup) app.webview.getParent()).removeView(app.webview);
        }
        app.webviewPlaceholder.addView(app.webview);
    }

最后,简单的XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".myRotatingActivity">
    <FrameLayout
        android:id="@+id/webviewplaceholder"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</RelativeLayout>

解决方案中有几处可以改进的地方,但是我已经花了很多时间,例如:一种较短的方法来验证Activity是否是首次启动,而不是使用SharedPreferences存储。此方法可保留完整的Webview(afaik),其文本框,标签,UI,javascript变量和URL未反映的导航状态。


1
为什么自从手动处理配置更改以来,WebView从未被破坏过,为什么还要拆开并重新附加WebView?
2015年

@Fred因为我想保持Webview的准确状态及其内容完整无缺,包括cookie,以及由HTML5或JS在Webview加载的网页内实现的按钮和复选框的状态。我所做的唯一调整是调整大小。
2015年

Fred表示您不需要在清单中声明configChanges时通过静态类分离/重新附加Web视图。这样,您的视图和活动在任何情况下都不会被破坏。
Eugene Kartoyev

2

您唯一要做的就是将以下代码添加到清单文件中:

<activity android:name=".YourActivity"
      android:configChanges="orientation|screenSize"
      android:label="@string/application_name">

2

更新:当前的策略是将WebView实例分离时将其移至Application类,而不是保留的片段,并像Josh一样将其重新附加到简历上。为了防止应用程序关闭,如果要在用户在应用程序之间切换时保持状态,则应使用前台服务。

如果使用片段,则可以使用WebView的保留实例。Web视图将保留为类的实例成员。但是,您应该在OnCreateView中附加Web视图,并在OnDestroyView之前分离Web视图,以防止其被父容器破坏。

class MyFragment extends Fragment{  

    public MyFragment(){  setRetainInstance(true); }

    private WebView webView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       View v = ....
       LinearLayout ll = (LinearLayout)v.findViewById(...);
       if (webView == null) {
            webView = new WebView(getActivity().getApplicationContext()); 
       }
       ll.removeAllViews();
       ll.addView(webView, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

       return v;
    }

    @Override
    public void onDestroyView() {
        if (getRetainInstance() && webView.getParent() instanceof ViewGroup) {
           ((ViewGroup) webView.getParent()).removeView(webView);
        }
        super.onDestroyView();
    } 
}

PS点数转到kcoppock答案

至于'SaveState()',它根据官方文档不再起作用:

请注意,此方法不再存储此WebView的显示数据。如果从未调用restoreState(Bundle),则以前的行为可能会泄漏文件。


请注意,尽管setRetainInstance确实保留了Fragment,但视图(以及WebView)仍然被销毁。
Fred

1
@Fred您可以提供该声明的来源吗?我已经在一个小型应用程序中对此进行了测试,该应用程序的片段带有setRetainInstance(true),可显示youtube页面,并且如果更改方向,该视图似乎会保留下来,因为视频不会中断。好像webview不会被破坏。
Pinkerton

@Rai这只是一个误读,从那时起我已经编辑了一些答案(它仍然需要一些措辞修复)。如果您对当前的状态感兴趣-此方法有效。但是问题是,当内存不足时,android会终止应用程序。我有一个重要的输入表单,用户必须在另一个应用程序中阅读一条消息,因此我必须使用带有通知的前台服务来防止进程被杀死。但是android仍然会破坏活动并因此破坏保留的框架。但是保留了Application类的实例-所以我现在将WebView移至Application。
鲍里斯·特鲁霍夫

1
我还将MutableContextWrapper用作WebView的基础,我将上下文切换到附加和分离活动。Chromium内置在缩放控件中的另一个大问题是保存对旧活动的引用,因此,没有将WebView附加到Application而不是Activity的放大解决方案。TL; DR; 如果您的表单不是那么重要,并且您可以接受这样一个事实,那就是在应用程序切换之后,您的进程可能会被杀死,而Webview无法恢复,请使用保留框架解决方案。PS我也认为,谷歌的员工远,远离现实生活中的问题,所有的部件,小工具..
鲍里斯Treukhov

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

@Override
protected void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);    
}

这些方法可以在任何活动上覆盖,基本上,它基本上允许您在每次创建/销毁活动时保存和恢复值,当屏幕方向更改时,该活动在后台被破坏并重新创建,因此您可以使用这些方法更改期间临时存储/恢复状态。

您应该更深入地研究以下两种方法,并查看它是否适合您的解决方案。

http://developer.android.com/reference/android/app/Activity.html



1

这是唯一对我有用的东西(我什至在其中使用了save实例状态,onCreateView但它并不那么可靠)。

public class WebViewFragment extends Fragment
{
    private enum WebViewStateHolder
    {
        INSTANCE;

        private Bundle bundle;

        public void saveWebViewState(WebView webView)
        {
            bundle = new Bundle();
            webView.saveState(bundle);
        }

        public Bundle getBundle()
        {
            return bundle;
        }
    }

    @Override
    public void onPause()
    {
        WebViewStateHolder.INSTANCE.saveWebViewState(myWebView);
        super.onPause();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState)
    {
        View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
        ButterKnife.inject(this, rootView);
        if(WebViewStateHolder.INSTANCE.getBundle() == null)
        {
            StringBuilder stringBuilder = new StringBuilder();
            BufferedReader br = null;
            try
            {
                br = new BufferedReader(new InputStreamReader(getActivity().getAssets().open("start.html")));

                String line = null;
                while((line = br.readLine()) != null)
                {
                    stringBuilder.append(line);
                }
            }
            catch(IOException e)
            {
                Log.d(getClass().getName(), "Failed reading HTML.", e);
            }
            finally
            {
                if(br != null)
                {
                    try
                    {
                        br.close();
                    }
                    catch(IOException e)
                    {
                        Log.d(getClass().getName(), "Kappa", e);
                    }
                }
            }
            myWebView
                .loadDataWithBaseURL("file:///android_asset/", stringBuilder.toString(), "text/html", "utf-8", null);
        }
        else
        {
            myWebView.restoreState(WebViewStateHolder.INSTANCE.getBundle());
        }
        return rootView;
    }
}

我为WebView的状态制作了Singleton支架。只要存在应用程序进程,状态便会保留。

编辑:这loadDataWithBaseURL不是必需的,它与

    //in onCreate() for Activity, or in onCreateView() for Fragment

    if(WebViewStateHolder.INSTANCE.getBundle() == null) {
        webView.loadUrl("file:///android_asset/html/merged.html");
    } else {
        webView.restoreState(WebViewStateHolder.INSTANCE.getBundle());
    }

虽然我读过这篇文章,但不一定能与Cookie一起使用。


使用单例是有问题的,因为它假定您只需要使用一个实例。
Android开发人员

@androiddeveloper啊。好吧,如果您的情况不正确,那确实是个问题。我只有一个WebView实例,所以这个问题甚至都没有解决。
EpicPandaForce'3

1

试试这个

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends AppCompatActivity {

    private WebView wv;

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

        wv = (WebView) findViewById(R.id.webView);
        String url = "https://www.google.ps/";

        if (savedInstanceState != null)
            wv.restoreState(savedInstanceState);
        else {
            wv.setWebViewClient(new MyBrowser());
            wv.getSettings().setLoadsImagesAutomatically(true);
            wv.getSettings().setJavaScriptEnabled(true);
            wv.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
            wv.loadUrl(url);
        }
    }

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

    @Override
    public void onBackPressed() {
        if (wv.canGoBack())
            wv.goBack();
        else
            super.onBackPressed();
    }

    private class MyBrowser extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }

}

0

此页面解决了我的问题,但我必须在初始页面中进行一些更改:

    protected void onSaveInstanceState(Bundle outState) {
       webView.saveState(outState);
       }

这部分对我来说有一点问题。在第二个方向上,更改应用程序以空指针终止

使用它为我工作:

    @Override
protected void onSaveInstanceState(Bundle outState ){
    ((WebView) findViewById(R.id.webview)).saveState(outState);
}

似乎是完全一样的。为什么第二个可以工作而前一个不能工作?
Android开发人员

0

您应该尝试这样:

  1. 创建一个服务,在该服务内部,创建您的WebView。
  2. 从您的活动启动服务并绑定到它。
  3. 在该onServiceConnected方法中,获取WebView并调用该setContentView方法以呈现WebView。

我对其进行了测试,但是它不能与其他WebView(例如XWalkView或GeckoView)一起使用。


嗨!您能再解释一下吗?谢谢您
-Jaco

1
好吧,从“活动”中获取Webview实例,并尝试将其引用提供给在后台运行的服务。下次打开该活动时,请尝试首先获取保存的Web视图并进行渲染。
Ramdane Oualitsen

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

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState)
    {
        super.onRestoreInstanceState(savedInstanceState);
        webView.restoreState(savedInstanceState);
    }

您能在回答中添加一些解释吗?
yacc

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.