我正在开发适用于Android的SDK。作为此SDK的一部分,我需要将自己的WebViewClient
设置为WebView
与WebView
和SDK集成的应用程序WebView
。(意味着不属于我的SDK)。
出于这个原因,这个WebViewClient
可能已经设置为WebViewClient
,在这种情况下,我需要从WebView
获取此WebViewClient
的实例设置我自己的WebViewCleint
并将我WebView
的回调方法转发给应用程序开发人员设置的最初配置方法。
我注意到来自 API V26 的int()
类有getWebViewClient方法。但显然,我正在寻找一种方法在以前的版本上执行此操作。也许使用支持库有某种方法可以做到这一点?
有人知道如何在旧版本的WebView中获取设置WebViewClient的实例?使用Reflection或任何其他方法?
答案 0 :(得分:0)
我设法使用反射来获取WebViewClient的实例:
Object providerInstance = getProviderInstance();
Object contentsClientAdapter = getContentsClientAdapter(providerInstance);
Object webViewClient = getWebViewClientFromClientAdapter(contentsClientAdapter);
if (webViewClient instanceof WebViewClient) {
mPreviousWebViewClient = (WebViewClient) webViewClient;
}
这些是深入研究WebView
对象以获取WebViewClient
对象的三种方法:
public Object getProviderInstance() {
Object returnValue = null;
try {
Class<? extends WebView> mWebViewClass = mWebView.getClass();
Field providerField = mWebViewClass.getDeclaredField("mProvider");
providerField.setAccessible(true);
Object mProvider = providerField.get(mWebView);
returnValue = mProvider;
} catch (NoSuchFieldException aE) {
aE.printStackTrace();
} catch (IllegalAccessException aE) {
aE.printStackTrace();
}
return returnValue;
}
private Object getContentsClientAdapter(Object aProviderInstance) {
Object returnValue = null;
try {
Class<?> aClass = aProviderInstance.getClass();
Field contentsClientAdapterField = aClass.getDeclaredField("mContentsClientAdapter");
contentsClientAdapterField.setAccessible(true);
Object mContentsClientAdapter = contentsClientAdapterField.get(aProviderInstance);
returnValue = mContentsClientAdapter;
} catch (NoSuchFieldException aE) {
aE.printStackTrace();
} catch (IllegalAccessException aE) {
aE.printStackTrace();
}
return returnValue;
}
private Object getWebViewClientFromClientAdapter(Object aContentsClientAdapter) {
Object returnValue = null;
try {
Class<?> aClass = aContentsClientAdapter.getClass();
Field WebViewClientField = aClass.getDeclaredField("mWebViewClient");
WebViewClientField.setAccessible(true);
Object mWebViewClient = WebViewClientField.get(aContentsClientAdapter);
returnValue = mWebViewClient;
} catch (NoSuchFieldException aE) {
aE.printStackTrace();
} catch (IllegalAccessException aE) {
aE.printStackTrace();
}
return returnValue;
}
但我真的希望找到另一种方法来做同样的事情。不太容易破损的东西。