需求:

安卓页面webview加载H5页面,H5页面能能返回到安卓页面

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView; import com.outfit7.talkingfriends.gui.view.wardrobe.R;
import com.outfit7.talkingfriends.gui.view.wardrobe.utils.TelecomUrl; public class TelecomActivity extends AppCompatActivity { /**
* 自定义的,当js调用history.go时加载的链接,以监听history.go方法的调用
*/
private final static String ON_BACK_PRESSED = "onBackPressed";
private static final String RETURN_FLAG = "ShijilongBack"; private ImageView telecomBack;
private ImageView phoneClear;
private EditText phoneNumber;
private TextView telecomNext;
private LinearLayout inputLayout;
private String phone;
private boolean payState = false;
private WebView webView; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_telecom);
telecomBack = findViewById(R.id.telecomBack);
phoneClear = findViewById(R.id.phoneClear);
phoneNumber = findViewById(R.id.phoneNumber);
telecomNext = findViewById(R.id.telecomNext);
inputLayout = findViewById(R.id.inputLayout); //监听输入
phoneNumber.addTextChangedListener(new TextWatcher() {
private CharSequence temp; @Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
temp = s;
} @Override
public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override
public void afterTextChanged(Editable s) {
if (temp.length() == 0) {
phoneClear.setVisibility(View.INVISIBLE);
telecomNext.setEnabled(false);
} else if (temp.length() > 0 && temp.length() < 11) {
phoneClear.setVisibility(View.VISIBLE);
telecomNext.setEnabled(false);
} else if (temp.length() == 11) {
phoneClear.setVisibility(View.VISIBLE);
telecomNext.setEnabled(true);
}
}
}); //清空输入
phoneClear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
phoneNumber.setText("");
phoneClear.setVisibility(View.INVISIBLE);
telecomNext.setEnabled(false);
}
}); //返回
telecomBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
//跳转
telecomNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
hideSoftKeyboard();
phone = phoneNumber.getText().toString();
inputLayout.setVisibility(View.GONE);
loadWebView();
}
});
} /**
* 加载支付页面
*/
private void loadWebView() {
webView = new WebView(this);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
pageFinished();
super.onPageFinished(view, url);
} @Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.i("wanglei", "url=" + url);
overrideUrlLoading(url);
return super.shouldOverrideUrlLoading(view, url);
}
});
webView.loadUrl(TelecomUrl.assembleUrl(phone));
setContentView(webView);
} /**
* 重写js页面window.history.go方法
*/
public void pageFinished() {
String script = "javascript:(function(){window.history.go = function(){window.location.href='" + ON_BACK_PRESSED + "';}})()";
webView.loadUrl(script);
} /**
* 拦截url加载
*/
public void overrideUrlLoading(String url) {
if (url.contains(ON_BACK_PRESSED)) {//拦截返回和取消按钮http://cemp.189.cn:8080/pay/web/onBackPressed
onBackPressed();
} else if (url.contains(RETURN_FLAG)) {//拦截支付返回结果,成功和失败都会包含ShijilongBack
int beginIndex = url.indexOf("code=") + 5;
String code = url.substring(beginIndex, beginIndex + 1);
Log.i("wanglei", "code=" + code);
if (!TextUtils.isEmpty(code)) {
payState = ("0".equals(code) ? true : false);
onBackPressed();
}
}
} /**
* 隐藏软键盘
*/
private void hideSoftKeyboard() {
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
} @Override
public void onBackPressed() {
//测试支付成功
if (payState) {
setResult(RESULT_OK);
}
super.onBackPressed();
}
}

代码中有些业务逻辑,可以自行删除

JS调用onBackPressed的更多相关文章

  1. [转]JS调用Android里面的方法,Android调用JS里面的方法

    FROM : http://blog.csdn.net/hj563308597/article/details/45197709 Android WebView 在公司Android的开发过程中遇到一 ...

  2. JS调用Android、Ios原生控件

    在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...

  3. 如何通过JS调用某段SQL语句

    如何通过JS调用某段SQL语句,这样的需求在报表.数据平台开发中很常见.以报表平台FineReport开发为例,例如在点击某个按钮之后,来判断一下数据库条数,再决定下一步操作.那这在后台如何实现呢? ...

  4. iOS开发--JS调用原生OC篇

    JS调用原生OC篇 方式一(反正我不用) 第一种方式是用JS发起一个假的URL请求,然后利用UIWebView的代理方法拦截这次请求,然后再做相应的处理. 我写了一个简单的HTML网页和一个btn点击 ...

  5. 通过js调用android原生方法

    有时候我们有这样一个需求,监听html中控件的一些事件.例如点击html中某个按钮,跳转到别的activity,复制某段文本. 首先是对webview的设置: myWebView = (WebView ...

  6. js调用php和php调用js的方法举例

    js调用php和php调用js的方法举例1 JS方式调用PHP文件并取得php中的值 举一个简单的例子来说明: 如在页面a.html中用下面这句调用: <script type="te ...

  7. android webView开发之js调用java代码示例

    1.webView设置 webView.getSettings().setJavaScriptEnabled(true);//设置支持js webView.addJavascriptInterface ...

  8. c#JS调用

    using MSScriptControl; using System; using System.Collections.Generic; using System.Reflection; usin ...

  9. Android 使用js调用Java

    效果如: 主要用到一个接口类:MyObject package com.example.jsdemo; import android.content.Context; import android.s ...

随机推荐

  1. Xshell 配置密钥

  2. SRVCC B1,B2事件总结

    何为SRVCC? SRVCC(Single Radio Voice Call Continuity)是3GPP提出的一种VoLTE语音业务连续性方案,主要是为了解决当单射频UE 在LTE网络和2G/3 ...

  3. php桥接模式(bridge pattern)

    有点通了 <?php /* The bridge pattern is used when we want to decouple a class or abstraction from its ...

  4. thinkPHP5框架路由常用知识点汇总

    一.路由的模式 普通模式(默认pathinfo,不解析路由) 'url_route_on' => false 混合模式(pathinfo+解析路由) 'url_route_on' => t ...

  5. Elasticsearch 中的 ignore_above

    检索超过ignore_above设定长度的字段后,无法返回结果

  6. 使用 Express Generator快速创建Express应用

    全局安装express-generator npm install express-generator -g 根据需求生成自己需要的模板 生成ejs模板:express demo --view=ejs ...

  7. 协程 和 async await

    协程, 是 为了 避免 闭包传递变量 的 性能损耗 而产生  . 如果不是 为了 避免 闭包传递变量 的 性能损耗 ,    线程池 和 Task 已经够了,  不需要 再设计 出 协程 来  . 闭 ...

  8. BigDecimal保留小数

    public class test1_format { public static void main(String[] args) { BigDecimal decimal = new BigDec ...

  9. [Inside HotSpot] Serial垃圾回收器 (一) Full GC

    Serial垃圾回收器Full GC Serial垃圾回收器的Full GC使用标记-压缩(Mark-Compact)进行垃圾回收,该算法基于Donald E. Knuth提出的Lisp2算法,它会把 ...

  10. Blink示例程序

    打开Arduino IDE(话说与Processing IDE的UI好像啊 然后将这段代码输入.也可从文件>例子>01.Basics/Blink(File/Examples/01.Basi ...