在Fragment中,KeyEvent.KEYCODE_BACK被调用两次

7
我在我的片段中调用了KeyEvent.KEYCODE_BACK,但出现了奇怪的情况,它被调用了两次。我不知道为什么会这样。以下是我的片段代码:
    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    myFragmentView = inflater.inflate(R.layout.folders, container, false);

    myFragmentView.setFocusableInTouchMode(true);
    myFragmentView.requestFocus();
    myFragmentView.setOnKeyListener(new View.OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // TODO Auto-generated method stub

            if (keyCode == KeyEvent.KEYCODE_BACK) {

                String parent = file.getParent().toString();
                file = new File(parent);
                File list[] = file.listFiles();

                myList.clear();

                for (int i = 0; i < list.length; i++) {
                    myList.add(list[i].getName());
                }
                Toast.makeText(getActivity(), parent, Toast.LENGTH_LONG)
                        .show();
                setListAdapter(new ArrayAdapter<String>(getActivity(),
                        android.R.layout.simple_list_item_1, myList));

            }

            return true;

        }
    });

    return myFragmentView;
}

一个将用于按键按下事件,另一个将用于按键松开事件。 - Stephen
如果我明确调用键事件下,为什么会调用键事件上? - Jack
问题上面就是它? - Jack
2个回答

25

在这种情况下,onKey方法确实会被调用两次,一次是按下键时的事件,另一次是释放键时的事件。请尝试添加一个条件:

if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
    ...
}

希望有所帮助。


我按照你的答案成功了,但是我之前犯了一个错误,就是将返回值设置为false。最后非常感谢。 - Faizan Haidar Khan

0
如果您知道您将要调用onKeyDown方法,为什么不使用该方法呢?public boolean onKeyDown (int keyCode, KeyEvent event)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接