当前位置:  开发笔记 > 前端 > 正文

Android WebView:处理方向更改

如何解决《AndroidWebView:处理方向更改》经验,为你挑选了4个好方法。

问题是旋转后的性能.WebView必须重新加载页面,这可能有点单调乏味.

每次处理方向更改而不从源重新加载页面的最佳方法是什么?



1> Totach..:

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

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

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



有关详细信息,请参阅:http:
//developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange

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


这样做实际上是气馁的,正如之前多次提到的那样
我测试但发现不起作用,设置如下的configChanges属性将起作用.机器人:configChanges = "keyboardHidden |方向"
Matthias:这不是真的 - 请参阅Javadoc for WebView.
这样的`onConfigurationChanged`方法覆盖是没用的.
它正在研究android姜饼,但不适用于ICS

2> 小智..:

编辑:此方法不再按照文档中的说明运行


原始答案:

这可以通过覆盖onSaveInstanceState(Bundle outState)您的活动并saveState从Webview 调用来处理:

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


这不适用于方向更改 - 显示空白屏幕.调用saveState\restoreState方法,但它没有帮助.
从saveState的文档:_请注意,此方法不再存储此WebView的显示数据.以前的行为可能会泄漏文件... _
"请注意,此方法不再存储此WebView的显示数据" - http://developer.android.com/reference/android/webkit/WebView.html

3> Tinashe..:

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


在活动中:

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


你不需要onConfigurationChanged()方法我很确定,只是Manifest中的附加属性.我的猜测是,WebView提供了对此的本机支持,这就是为什么这个答案现在是最好的答案(因为当最初询问这个问题时这不起作用)

4> Joe D'Andrea..:

我尝试使用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.myimagename用于ImageView的源和Android"做正确的事" - 耶!

...除非你观察配置更改,否则它不会.:(

所以我很不相干.使用onRetainNonConfigurationInstanceImageView旋转工作,但WebView持久性不...或使用onConfigurationChanged并且WebView保持稳定,但ImageView不会更新.该怎么办?

最后一点:在我的情况下,强迫定位不是一个可接受的妥协.我们确实希望优雅地支持旋转.有点像Android浏览器应用程序的功能!;)


您不应该从onRetainNonConfigurationInstance返回任何视图.视图附加到活动上下文中,因此,如果您保存视图,则每次更改方向时都会带有所有行李.该观点被"泄露".(请参阅此处的最后一段:http://developer.android.com/resources/articles/faster-screen-orientation-change.html)onRetainNonConfigurationInstance的最佳实践是保存视图所需的数据,而不是视图本身.
推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有