它可能会奏效,但这不是一个好主意.如果你没有正确处理Fragment或者你的代码中的某个地方对它的生命周期有点粗心,它很可能会导致崩溃.但有一个简单的方法来解决这个问题.而不是使用静态方法,在实例本身上保存实例和调用方法.这样你可以检查实例是否为null,如果不是,Fragment可以处理对goBack()或canGoBack()本身的调用:

public class MainBrowserActivity extends SingleFragmentActivity {

BrowserFragment browserFragment = null;

@Override

protected Fragment createFragment() {

this.browserFragment = BrowserFragment.newInstance();

return this.browserFragment;

}

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_BACK && this.browserFragment != null && this.browserFragment.canGoBack()) {

this.browserFragment.goBack();

return true;

}

return super.onKeyDown(keyCode, event);

}

}

如您所见,保存了BrowserFragment实例,然后在BrowserFragment本身上调用goBack()或canGoBack()等方法.当然,您必须在BrowserFragment中实现这些方法,但这不应该是一个问题:

public class BrowserFragment extends Fragment {

public static BrowserFragment newInstance() {

BrowserFragment fragment = new BrowserFragment();

return fragment;

}

private WebView webView;

public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState){

View v = inflater.inflate(R.layout.fragment_activity, parent, false);

getActivity().setTitle(R.string.title_rus);

webView = (WebView) v.findViewById(R.id.webView);

webView.setWebViewClient(new SwingBrowserClient());

WebSettings webSettings = webView.getSettings();

webSettings.setJavaScriptEnabled(true);

Uri data = Uri.parse("http://www.swinginmoscow.ru/m/");

webView.loadUrl(data.toString());

return v;

}

public boolean canGoBack() {

return this.webView != null && this.webView.canGoBack();

}

public void goBack() {

if(this.webView != null) {

this.webView.goBack();

}

}

}

我对您的代码进行了一些额外的改进.首先,我添加了空检查以防止任何可能的NullPointerExceptions,其次建议始终使用静态工厂方法来创建新的Fragments实例.这就是我添加到BrowserFragment的静态newInstance()方法.这样做的好处是,您可以实现一种方法,无论您在何处使用它,都可以为您设置BrowserFragment.您可以向newInstance()方法添加参数以将一些值传递给BrowserFragment或添加一些必需的侦听器等,但由于您没有将任何值传递给BrowserFragment,因此newInstance()方法仍然是空的.尽管如此,最好始终使用这样的工厂方法,即使它们只调用新的BrowserFragment().

通常这种方法要好得多.特别是从体系结构的角度来看,因为您没有直接与Activity中的WebView进行交互. WebView与Activity没有任何关系,它是BrowserFragment实现的一部分,因此Activity不应该知道甚至还有WebView.如何实现对goBack()或canGoBack()的调用或者他们究竟做什么对Activity不感兴趣. Activity只是告诉BrowserFragment“我想回去”,BrowserFragment可以完成工作.这样可以更好地分离职责,使代码更易读,更清晰,更易于维护.

编辑:

另外我不知道SingleFragmentActivity,但通常任何Activity都实现onBackPressed()方法.您不必重写onKeyDown()来捕获后退键事件.你可以这样做:

@Override

public void onBackPressed() {

if (this.browserFragment != null && this.browserFragment.canGoBack()) {

this.browserFragment.goBack();

} else {

// The back key event only counts if we execute super.onBackPressed();

super.onBackPressed();

}

}

如果您有任何其他问题,请随时提出!

android webview onkeydown,android – WebView片段内的OnKeyDown相关推荐

  1. Android开发实用小技巧九——内嵌WebView的使用(内置浏览器)

    文章目录 前言 一.效果展示 二.代码 1.样式布局 2.活动页面 总结 前言 内嵌WebView的使用(内置浏览器). 一.效果展示 二.代码 1.样式布局 res/layout/activity_ ...

  2. Android:控件WebView显示网页

    WebView可以使得网页轻松的内嵌到app里,还可以直接跟js相互调用. webview有两个方法:setWebChromeClient 和 setWebClient setWebClient:主要 ...

  3. php webview,Android:控件WebView显示网页 – tinyphp – 博客园

    WebView可以使得网页轻松的内嵌到app里,还可以直接跟js相互调用. webview有两个方法:setWebChromeClient 和 setWebClient setWebClient:主要 ...

  4. webview和android做壳,Android Studio 制作一个 WebView 外壳

    背景 做为一条BS狗,开发应用当然趋向于BS,为了方便维护,降低开发成本,决定只做一个webview做为程序入口,所有的功能页面集中在服务端. 本次踩坑遇到了 js不支持.点击返回直接退出应用.htt ...

  5. android webview应用,Android WebView简单应用

    WebView是View的1个子类,可让你在activity中显示网页.在布局中拉入1个WebView,1个Button,1个EditText 布局代码以下: xmlns:tools="ht ...

  6. Android进阶之路 - WebView的使用与后退键处理

    本篇为大家带来的是WebView的多种使用场景讲解,说起WebView往往给大家带来的印象应该是Android与H5的混合开发,下面洒家为大家进行详细讲解 我那些关于WebView的回忆 ~ 包含入门 ...

  7. android webview详情,Android中的WebView详细介绍

    Android中WebView的详细解释: 1. 概念: WebView(网络视图)能加载显示网页,可以将其视为一个浏览器.它使用了WebKit渲染引擎加载显示网页. 2. 使用方法: (1).实例化 ...

  8. Android开发:关于WebView

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liangruijun.blog.51cto.com/3061169/647456 ...

  9. android webview实例,android WebView 使用实例

    主布局文件: 主活动类WebViewMainActivity.java: package com.example.ch10; import com.example.baseexample.R; imp ...

最新文章

  1. 【Linux - mysql】linux下mysql报Failed to restart mysqld.service: Unit not found
  2. 保存Delphi中的环境设置中的library path
  3. Esper应用以及原理解析
  4. (JAVA)CollectionDemo2
  5. php分页页数过多隐藏,织梦DEDE中内容页分页数目太多时隐藏方法
  6. getclass方法_防止数据重复提交的6种方法(超简单)!
  7. linux mkswap -p参数,Linux基础命令---mkswap
  8. 自建站如何通过Facebook广告引流?
  9. 马斯克亲口承认:自动驾驶的开发难度超乎想象;小米再发1.2亿股权激励;Firefox Lite 已死|极客头条...
  10. nginx解析漏洞简单复现及修复
  11. kafka----kafka connect的使用(一)
  12. AdBlock插件自定义拦截规则
  13. 网站被国外IP攻击 禁止海外IP访问网站的解决办法
  14. 中规院交通院《上海全球城市综合交通体系承载能力与开发研究》
  15. 【专业课程】网络协议分析与安全
  16. spark kryo java,在Spark中自定义Kryo序列化输入输出API
  17. Linux环境重启系统网卡down,linux重启网卡命令有哪些
  18. <机器学习>支持向量机(SVM)理论
  19. 【R模型】R语言二元logistic回归 (保姆级教程)
  20. PNG图片宽高crc32爆破代码

热门文章

  1. C#图表开发——Chart
  2. CATIA CAA二次开发实现获取几何曲线所对应的具体类型
  3. 那天,我们笑着说再见,却深知再见遥遥无期
  4. ORA-39126: Worker unexpected fatal error in KUPW$WORKER.FIXUP_MASTER_TABLE_EXPORT
  5. 操作系统(二) -- 操作系统的接口与实现
  6. 一文教你如何用Python读取图片GPS定位
  7. 自如wi-fi管理密码_如何使您的Dotfile管理轻松自如
  8. X86 SSE/AVX指令集加速学习
  9. php修改服务器文件操作权限
  10. OpenBR安装与编译过程