如何在android webview中使用confirm处理类似facebook的问题
我正在尝试使用android webview实现类似facebook的功能。没有“确认”对话框,工作正常。但当like需要确认时,它就不起作用了。下面是我正在使用的代码片段如何在android webview中使用confirm处理类似facebook的问题,android,facebook-like,facebook-android-sdk,Android,Facebook Like,Facebook Android Sdk,我正在尝试使用android webview实现类似facebook的功能。没有“确认”对话框,工作正常。但当like需要确认时,它就不起作用了。下面是我正在使用的代码片段 private void setUpWebView() { likeWebView.setVerticalScrollBarEnabled(false); likeWebView.setHorizontalScrollBarEnabled(false); likeWebView.setWebV
private void setUpWebView() {
likeWebView.setVerticalScrollBarEnabled(false);
likeWebView.setHorizontalScrollBarEnabled(false);
likeWebView.setWebViewClient(new FacebookWebViewClient());
likeWebView.setWebChromeClient(new MyChromeClient());
likeWebView.getSettings().setJavaScriptEnabled(true);
String url = getFacebookLikeUrl();
likeWebView.loadUrl(url);
}
我还设置了ViewClient和WebChromeClient
private String getFacebookLikeUrl() {
return "http://www.facebook.com/plugins/like.php?" + "href="
+ URLEncoder.encode(mUrl) + "&access_token="
+ URLEncoder.encode(facebook.getAccessToken());
}
请帮我解决这个问题。提前感谢。类似Facebook的确认会在新窗口中打开确认窗口小部件。因此,您的webview应该支持多窗口打开。对于此设置,webview的JavaScriptCanOpenWindowsAutomatically(true)和SetSupportMultipleWidows(true)——
private void setUpWebView() {
likeWebView = new WebView(getContext());
likeWebView.setWebViewClient(new FacebookWebViewClient());
likeWebView.setWebChromeClient(new MyChromeClient());
final WebSettings webSettings = likeWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setSupportMultipleWindows(true);
String url = getFacebookLikeUrl();
likeWebView.loadUrl(url);
likeWebView.setLayoutParams(FILL);
mContent.addView(likeWebView);
}
类似Facebook的确认调用onCreateWindow()方法。因此,在WebChromeClient中重写onCreateWindow方法-
final class MyChromeClient extends WebChromeClient {
// Add new webview in same window
@Override
public boolean onCreateWindow(WebView view, boolean dialog,
boolean userGesture, Message resultMsg) {
WebView childView = new WebView(getContext());
childView.getSettings().setJavaScriptEnabled(true);
childView.setWebChromeClient(this);
childView.setWebViewClient(new FacebookWebViewClient());
childView.setLayoutParams(FILL);
mContent.addView(childView);
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(childView);
resultMsg.sendToTarget();
return true;
}
// remove new added webview whenever onCloseWindow gets called for new webview.
@Override
public void onCloseWindow(WebView window) {
mContent.removeViewAt(mContent.getChildCount() - 1);
}
}
当用户单击“喜欢”或“取消”时,在关闭窗口上确认类似调用的\u小部件。在该方法中,删除最后添加的webview。我将其用于条带签出,从而在移动设备中打开一个新窗口进行支付 根据@Shweta的回复: 在您的活动中:
package myapp.app;
/*** imports ***/
public class LoggedActivity extends FragmentActivity
{
public WebView myWebView;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.logged);
// retrieve the main container
LinearLayout container = (LinearLayout) findViewById(R.id.logged_webviews_container);
// layout params applied to the webviews in order to fit 100% the parent container
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT);
myWebView = new WebView(this);
myWebView.setLayoutParams(layoutParams);
myWebView.setWebViewClient(new BetterWebViewClient(this));
WebSettings settings = myWebView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setSupportMultipleWindows(true);
// on this instruction, we set our extended class below as the Parent Webview webchromeclient
myWebView.setWebChromeClient(new PopupWebView(this, myWebView, container, layoutParams));
// load URL
myWebView.loadUrl('http://www.mywebsite.com');
container.addView(myWebView);
}
}
添加扩展WebChromeClient的此类
package myapp.app;
/*** imports ***/
public class PopupWebChromeClient extends WebChromeClient {
protected Activity activity;
protected WebView parentWebView;
protected RelativeLayout container;
protected WebView popupView;
PopupWebChromeClient(
Activity activity,
WebView parentWebView,
RelativeLayout container
)
{
super();
this.activity = activity;
this.parentWebView = parentWebView;
this.container = container;
}
@Override
public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, Message resultMsg) {
this.parentWebView.setVisibility(WebView.GONE);
this.popupView = new WebView(this.activity);
// setup popuview and add
this.popupView.getSettings().setJavaScriptEnabled(true);
this.popupView.setWebChromeClient(this);
this.popupView.setWebViewClient(new ApkfWebViewClient(this.activity, true));
this.popupView.setLayoutParams(new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.FILL_PARENT,
RelativeLayout.LayoutParams.FILL_PARENT
));
this.container.addView(this.popupView);
// send popup window infos back to main (cross-document messaging)
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(popupView);
resultMsg.sendToTarget();
return true;
}
// remove new added webview on close
@Override
public void onCloseWindow(WebView window) {
this.popupView.setVisibility(WebView.GONE);
this.parentWebView.setVisibility(WebView.VISIBLE);
}
}
在布局xml中,不要设置webview,因为我们会动态创建它们。我已经解决了这个问题,方法是删除WebChromeClient的onCreateWindow()方法,并为webview启用这两个选项。likeWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);如WebView.getSettings().setSupportMultipleWindows(true);谢谢大家。你应该把这个作为答案发布,并接受你自己的答案,这样其他人可以很容易地知道。你能告诉我你的代码是否也是我问题的解决方案吗?嗨,我做了完全相同的事情(或多或少)。但它在安卓4.0和安卓4.3之间崩溃(仅适用于安卓4.4及以上版本)。崩溃是本机的[0xdeadd00d(代码=1)处的致命信号11(SIGSEGV),线程1637(WebViewCoreThre)]。在此之前,我在decodeIndirectRef中看到这个警告无效的间接引用0xa74a9fd0。这在Android 4.1/4.2/4.3上对你有用吗?这非常有用,但我有一个问题,你能告诉我ApkfWebViewClient的内容是什么,以及你在哪里定义它吗?很好!ApkfWebViewClient是WebViewClient的一个子类(具有自定义的shouldOverrideUrlLoading、onPageStarted、onPageFinished、onReceivedError…),因此,老实说,在我询问后,请使用WebViewClient。我重新检查了代码,注意到您为什么使用它,但感谢您的解释,因为它可能会帮助其他人