逻辑
App启动后显示NormalFragment,在NormalFragment中有一个原生的对话框,通过按返回键会对退出App做二次确认,且默认为不退出,同时NormalFragment中有一个按钮,点击后可以跳转到WebWrapperFragment,在WebWrapperFragment中有一个WebView,WebView中有对话框,通过按返回键会对跳转到NormalFragment做二次确认,且默认为不退出。
NormalFragment
布局文件
仅包含一个表示当前Fragment为NormalFragment的TextView和一个用于点击后跳转的按钮。
|
|
点击按钮跳转到WebWrapperFragment
在NormalFragment中设置按钮的点击监听。
|
|
在MainActivity中跳转到WebWrapperFragment。
|
|
WebWrapperFragment
布局文件
仅包含WebView。
|
|
加载html文件
此处以放在assets中的html文件为例。
|
|
demo.js
clickBack为Java调用JS的方法,传入参数为str,当str是”web_wrapper”,会触发id是”web_wrapper_back”的点击事件。
back为JS调用Java的方法,传入参数为”web_wrapper”,当该JS文件被html引用时,会触发back方法。
|
|
demo.html
仅包含表示当前Fragment为WebWrapperFragment的文字和一个用于点击后跳转的按钮。
该html引用了demo.js。
按钮的id是”web_wrapper_back”,当点击后会显示对话框,如果点击对话框中的确认会调用Java的exit方法,如果点击对话框中的取消会调用Java的back方法并传入参数”web_wrapper”,按返回键会默认触发取消。
|
|
WebWrapperJsInteration.java
添加Java方法供JS调用。
|
|
返回键逻辑实现
重写MainActivity的onBackPressed方法。
|
|
显示NormalFragment的对话框
当取消时将用于判断对话框是否为显示状态的标志置为false,按返回键会默认触发取消。
|
|
WebWrapperFragment中后退栈的维护
1、WebView加载html时,JS会调用Java的back(“web_wrapper”),则此时后退栈添加元素”web_wrapper”。
2、按返回键会先判断后退栈中是否有元素,因为有”web_wrapper”,然后Java会调用JS的clickBack(“web_wrapper”),clickBack(“web_wrapper”)对应于html中按钮的点击事件,即会弹出对话框,同时JS会调用Java的removeBack(“web_wrapper”),删除后退栈中的元素”web_wrapper”。
3、再次点击返回键会直接触发对话框的取消,同时JS会调用Java的back(“web_wrapper”),则此时后退栈添加元素”web_wrapper”,又回到最初加载时的状态。