当前位置:   article > 正文

fragment 实现按键监听_fragment监听物理按键

fragment监听物理按键

前言:

最近项目需要在fragment 中实现系统的按键监听,网上很多都是通过对ListView 进行监听,但是这种依赖focus的效果不是很好。

这里总结下自己的实现方式。

 

先来段网上分享:

  1. @Override
  2. protected View initView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  3. //.............
  4. View view = View.inflate(UIUtils.getContext(), R.layout.homefragment, null);
  5. ButterKnife.bind(this, view);
  6. //监听back必须设置的
  7. view.setFocusable(true);
  8. view.setFocusableInTouchMode(true);
  9. //然后在写这个监听器
  10. view.setOnKeyListener(backlistener);
  11. return view;
  12. }
  13. private View.OnKeyListener backlistener = new View.OnKeyListener() {
  14. @Override
  15. public boolean onKey(View view, int i, KeyEvent keyEvent) {
  16. if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
  17. //这边判断,如果是back的按键被点击了 就自己拦截实现掉
  18. if (i == KeyEvent.KEYCODE_BACK) {
  19. Toast.makeText(UIUtils.getContext(), "BACK拦截", Toast.LENGTH_SHORT).show();
  20. return true;//表示处理了
  21. }
  22. }
  23. return false;
  24. }
  25. };

或者是:

  1. public class phonerecorder extends Fragment {
  2. View listview;
  3. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  4. listview = (View) inflater.inflate(R.layout.phonerecorder, null);
  5. mListView = (ListView) listview.findViewById(R.id.listView);
  6. init();
  7. mListView.setOnItemClickListener(clickitemlistener);
  8. listview.setFocusable(true);//这个和下面的这个命令必须要设置了,才能监听back事件。
  9. listview.setFocusableInTouchMode(true);
  10. listview.setOnKeyListener(backlistener);
  11. return listview;
  12. }
  13. private View.OnKeyListener backlistener = new View.OnKeyListener() {
  14. @Override
  15. public boolean onKey(View view, int i, KeyEvent keyEvent) {
  16. if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
  17. if (i == KeyEvent.KEYCODE_BACK) { //表示按返回键 时的操作
  18. if (!rootpatch.equals(currentfilepach) && currentfilepach != null) {
  19. File file = new File(currentfilepach);
  20. openDir2(file.getParent().toString());
  21. currentfilepach = file.getParent().toString();
  22. return true;
  23. } //后退
  24. return false; //已处理
  25. }
  26. }
  27. return false;
  28. }
  29. };
  30. }

 

上面两种方式,都需要寻求focus,通过对指定的View 进行onKeyListener。不失为一种方式,但个人觉得这种方式总是有点牵强。下面来分享下自己的实现:

1、自定义一个listener

  1. import android.view.KeyEvent;
  2. public interface FragmentOnKeyListener {
  3. boolean onKeyDown(int keyCode, KeyEvent event);
  4. }

2、fragment 中注册这个listener

对应的fragment 需要implements FragmentOnkeyListener,这一步很关键。

然后实现该onKeyDown:

  1. @Override
  2. public boolean onKeyDown(int keyCode, KeyEvent event) {
  3. LogUtils.LOGD(TAG, "==== onKeyDown");
  4. if (mMode == SafeboxFilesPreference.MODE_EDIT) {
  5. switchToMode(SafeboxFilesPreference.MODE_NORMAL);
  6. return true;
  7. }
  8. return false;
  9. }

这里可以对不同的keyevent 进行不同的处理。

3、Fragment 对应的Activity 中拦截按键

  1. @Override
  2. public boolean onKeyDown(int keyCode, KeyEvent event) {
  3. if (keyCode == KeyEvent.KEYCODE_BACK) {
  4. Fragment fragment = getShowingFragment();
  5. if (fragment != null && fragment instanceof FragmentOnKeyListener
  6. && ((FragmentOnKeyListener) fragment).onKeyDown(keyCode, event)) {
  7. return true;
  8. }
  9. }
  10. return super.onKeyDown(keyCode, event);
  11. }

在Activity 中如何拿到Fragment 这个比较简单了,根据不同的实现方式,肯定可以拿到这个Fragment。

最终会调用到fragment 已经实现的onKeyDown。

 

由于项目需要这里只需要监听BACK,所以,在Activity 中就进行了拦截,如果按键比较多,可以放到Fragment中。

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/945114
推荐阅读
相关标签
  

闽ICP备14008679号