在我的Android应用程序的登录屏幕(LoginActivity)中,有一个“注册”按钮,可以将用户带到WebView(在SignupActivity中)中显示的注册网页。用户注册后(即单击“CreateAccount”按钮),我想将它们带回LoginActivity。
我目前的代码如下。它在第一次安装应用程序时有效,但在第二次重复该过程后,if / else子句根本没有触发(两个日志都没有显示,重定向也没有发生)。为什么呢?
public class SignupActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("SignupActivity", "Signup Activity started");
WebView webView = new WebView(this);
setContentView(webView);
webView.setWebViewClient(new MyWebViewClient());
webView.loadUrl("https://commons.m.wikimedia.org/w/index.php?title=Special:CreateAccount&returnto=Main+Page&returntoquery=welcome%3Dyes");
}
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.equals("https://commons.m.wikimedia.org/w/index.php?title=Main_Page&welcome=yes")) {
// Signup success, so load LoginActivity again
Log.d("SignupActivity", "Overriding URL");
CookieSyncManager.createInstance(getApplicationContext());
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
cookieManager.setAcceptCookie(false);
cookieManager.removeSessionCookie();
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
startActivity(intent);
return true;
} else {
Log.d("SignupActivity", "Not overriding URL, URL is: " + Uri.parse(url).getHost());
return false;
}
}
}
在LoginActivity中,我已将此方法附加到按钮单击:
//Called when Sign Up button is clicked
public void signUp(View view) {
Intent intent = new Intent(this, SignupActivity.class);
startActivity(intent);
}
但是我是WebViews的新手,所以我很乐意在必要时更改此设置。
答案 0 :(得分:1)
您应该简化覆盖WebViewClient中的shouldOverrideUrlLoading方法。然后,当用户注册时,应该将其重定向到让我们说成功页面。所以你知道成功的网址是https://www.example.com/success
。在shouldOverrideUrlLoading
中检查是否要加载的网址是成功网址。如果是,那么只需完成此活动并做任何你想做的事。
修改强>
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.d("SignupActivity", "Loading URL: " + url);
if (url.equals("https://commons.m.wikimedia.org/w/index.php?title=Main_Page&welcome=yes")) {
// Signup success, so load LoginActivity again
Log.d("SignupActivity", "Overriding URL");
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
startActivity(intent);
return true;
} else {
Log.d("SignupActivity", "Not overriding URL, URL is: " + Uri.parse(url).getHost());
return false;
}
}
}
答案 1 :(得分:0)
对于这种情况,您可以采用简单的方法。当您单击“注册”按钮时,您可以从LoginActivity打开新活动(WebActivity)。
您可以在清单中将LoginActivity添加为WebActivity的ParentActivity。
因此,当您单击注册按钮并转到WebActivity时,请不要调用finish()方法,因为它会破坏您的LoginActivity。
现在,当您按下注册按钮时,WebActivity将在Backstack上打开并且LoginActivity在WebActivity中按下后退按钮时,super.backpressed()方法会将您重定向到LoginActivity。
更新(阅读评论后):
如果您想将用户重定向到LoginActivity,那么您可以在用户点击“创建帐户按钮”时调用Backpressed()方法。您的活动中应包含哪些
答案 2 :(得分:0)
我认为你需要JavascriptInterface
才能做到这一点。
在阅读完您的问题之后,我认为您的问题的主要内容是“如何关闭WebView
并将用户数据带到原生”。
将用户带到一个网页完全取决于你的逻辑,所以你需要考虑如何处理它。
但是如果您想要取回用户,则需要与网页进行互动。用户注册后,网页会告诉您注册是否成功,以及有关用户的数据。
调用此函数可将JavascriptInterface
添加到WebView
:
WebView.addJavascriptInterface(Object object, String name)
注册后,网页使用JS
来调用您的原生方法,在该方法中,您可以获得注册结果并执行您想要的操作。
您可能需要阅读this,了解有关JavascriptInterface
。