我试图找到一种方法来处理WebView后台堆栈,类似于Android Web浏览器在我自己的应用程序的WebView中按下后退按钮时如何处理它.
问题与Javascript重定向有关.WebView后备堆栈似乎包含只是重定向的URL.这是我的相关代码:
private class ArticleWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK)
{
WebView wv = (WebView)findViewById(R.id.web);
if (wv.canGoBack())
{
wv.goBack();
return true;
}
}
return super.onKeyDown(keyCode, event);
}
Run Code Online (Sandbox Code Playgroud)
如您所见,按后退按钮可选择堆栈中的先前URL,该URL在调用shouldOverrideUrlLoading()之后加载到WebView本身.我实际上在shouldOverrideUrlLoading()中做了很多与这个特定问题无关的事情,所以"删除我的WebViewClient实现"对我来说不起作用.无论如何,当前一个URL是Javascript重定向时,该URL加载,然后Javascript立即重定向到WebView所在的URL.我无法禁用Javascript,因为网站依赖于它.我也无法更改网站(第三方).
这种重定向问题的结果是最终用户的恶性循环,他们疯狂地回击只是比Android网页处理引擎稍快.
现在这里有趣的地方:Android网页浏览器处理后退按钮就好了Javascript重定向!它遵循重定向很好,但后退按钮执行用户期望它做的事情.这意味着可以正确处理这种情况.Android Web浏览器如何处理此问题?
这是Android特定的.
我从一个自定义类派生我在Android中的所有活动,它提供了一个漂亮,干净的地方,可以放置应用程序中所有布局使用的公共代码,特别是一些常见的setContentView()覆盖代码,它将布局注入到我的布局中.所以这是典型的层次结构:
MyActivity extends MyBaseClass -> MyBaseClass extends Activity -> Activity
Run Code Online (Sandbox Code Playgroud)
对于我的某个应用,我需要Google地图支持.所以我试图将MyBaseClass转换为模板/泛型,以便我可以做类似的事情:
MyActivity extends MyBaseClass<MapActivity> -> MyBaseClass<T> extends T -> T
Run Code Online (Sandbox Code Playgroud)
当然,这无法编译,因为Java模板/泛型并不像我在尝试后不久发现的C++模板那样有用.所以我最终创建了一个完整的单独的类作为临时解决方法:
MyActivity extends MyBaseMapClass -> MyBaseMapClass extends MapActivity -> MapActivity
Run Code Online (Sandbox Code Playgroud)
并将MyBaseClass中的所有代码复制到MyBaseMapClass中.除了涉及进口的一些小改动之外,代码是相同的.它有效,但它不是一个好的解决方案.
我越过我的手指,上面将是问题的结束,我将永远不必再次重访它.
不幸的是,我开始尝试使用一个更复杂的基类的片段和活动组合,并且上面的代码重复问题变成了一个严重的问题.每当我在一个文件中进行更改时,我必须记住将其克隆到其他文件,并且开发速度足够快,以至于我很快就会失去同步.
Activity,MapActivity,FragmentActivity,ListActivity,PreferenceActivity等.我是否需要为我想要使用的每一个创建一个单独的派生类?我希望不会,因为这个原因,我已经开始限制我的推导(我的一些活动因此没有某些特征).我有时会使用两个独立的基类(其中一些活动需要将更多视图扩展到布局中,但并非所有活动都需要这样做),这进一步加剧了这个问题:
MyActivity extends MyBaseClass -> MyBaseClass extends Activity -> Activity
MyActivity2 extends AnotherBaseClass -> AnotherBaseClass extends MyBaseClass -> MyBaseClass extends Activity -> Activity
Run Code Online (Sandbox Code Playgroud)
If I want to use the code for AnotherBaseClass in Maps, I not only have to create MyBaseMapClass, but also AnotherBaseMapClass and copy …