Android TextChangedListener 和 OnKeyListener 干扰

Android TextChangedListener and OnKeyListener interfere

我有一个 activity 和一个 viewpager 和 4 fragments 作为页面。

在其中一个片段中,我需要处理后退按钮按下,所以我这样做了:

public void setBackButtonAction(final View view)
{
    //view is root view of fragment
    view.setFocusableInTouchMode(true);
    view.setOnKeyListener(new View.OnKeyListener()
    {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event)
        {
            if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK)
            {
                if (currentView == VIEW_MODE_ALL_CAT)
                {
                    return false;
                }
                else if (currentView == VIEW_MODE_THIS_CAT)
                {
                    currentView = VIEW_MODE_ALL_CAT;
                    // do something
                    return true;
                }
            }

            return false;
        }
    });
}

到目前为止一切顺利,按预期工作。

并且我在这个片段中有一个 EditText,我需要将它连接到一个适配器以过滤结果,我是这样做的:

public void setSearchFilterListener()
{
    searchFilter.addTextChangedListener(new TextWatcher()
    {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after)
        {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count)
        {
            mAdapter.getFilter().filter(s);
        }

        @Override
        public void afterTextChanged(Editable s)
        {
        }
    });
}

这也符合预期。

但是 如果我使用这个 EditText,然后按下后退按钮,我处理后退按钮的代码根本不会调用。

刚刚发生了什么?如果我打开应用程序并按下后退按钮,将调用用于处理后退的代码,但是如果我用 EditText 然后按下后退按钮,处理后退的代码 根本不会调用。

有人知道这里发生了什么吗?

如有任何帮助,我们将不胜感激。

因为使用你的方法setBackButtonAction,你只在根视图上设置了onKeyListener,当你的EditText设置为焦点时,它会找到EditText的onKeyListener,而不是根视图的onKeyListener查看。

要覆盖返回行为,您应该覆盖 onBackPressed()