EditText.requestFocus()返回true但并不真正为视图提供焦点

时间:2016-02-24 16:36:19

标签: android android-edittext android-toolbar

我在工具栏中的可展开操作视图中有一个EditText。当我展开动作时,会显示EditText,我希望它能够获得焦点。为实现这一点,我做了以下事情:

action_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    android:id="@+id/connections_find_people_container"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/connections_find_people_edit"  
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"/>

</RelativeLayout>

在我的片段中

@Override
public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
    inflater.inflate(R.menu.add_connection, menu);
    mAddMenuItem = menu.findItem(R.id.menu_add);

    MenuItemCompat.setActionView(mAddMenuItem, R.layout.action_layout);
    mSearchView = MenuItemCompat.getActionView(mAddMenuItem);

    mSearchEditText = (EditText) mSearchView.findViewById(R.id.connections_find_people_edit);

    MenuItemCompat.setOnActionExpandListener(mAddMenuItem, mOnSearchExpandListener);
    super.onCreateOptionsMenu(menu, inflater);
}

private final OnSearchExpandListener mOnSearchExpandListener = new MenuItemCompat.OnActionExpandListener {
        mSearchEditText.requestFocus();
        return true;
    }

    @Override
    public boolean onMenuItemActionCollapse(final MenuItem item) {
        return true;
    }
}

令人惊讶的是,这不起作用。点击工具栏中的操作后,视图会展开,显示mSearchEditText,但无法获得焦点。

更具体(奇怪),mSearchEditText.requestFocus(); 返回true ,但软件键盘仍未显示,且mSearchEditText中没有光标。

显示软件键盘并不是什么大问题,有很多方法可以强制它,但即使我显示键盘,输入也不会将任何文本插入mSearchEditText。只有当我在光标出现时点击mSearchEditText并且我可以在其中输入一些文字后,它才会出现。

我尝试过的事情:

  • 以XML格式和编程方式设置focusablefocusableInTouchMode以及onCreateOptionsMenu()和动态视图展开时
  • 在请求之前清除焦点,例如mSearchEditText.clearFocus()
  • 在视图展开后延迟requestFocus()

这真的很奇怪,因为关注

@Override
public boolean onMenuItemActionExpand(final MenuItem item) {
    mSearchEditText.setFocusableInTouchMode(true);
    mSearchEditText.setFocusable(true);
    mSearchView.postDelayed(new Runnable() {
        @Override
        public void run() {
            if (mSearchEditText.requestFocus()) {
                KeyboardUtils.showSoftKeyboard(ConnectionsFragment.this);
            }
        }
    }, 300);
    return true;
}

显示键盘,应该表示mSearchEditText具有焦点,但输入时不输入任何文字。 (再次,当我点击EditText时,光标出现,一切正常)。

1 个答案:

答案 0 :(得分:0)

有时会发生Aaand,在发布问题后不久我就找到了答案。

我不得不引用EditTextonCreateOptionsMenu()的引用,而是使用传递给MenuItem的{​​{1}}并在那里获得引用。

所以现在这对我有用:

onMenuItemActionExpand()