android webview onkeydown,android – WebView片段内的OnKeyDown

它可能会奏效,但这不是一个好主意.如果你没有正确处理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();

}

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值