EditText.requestFocus() returns 正确但并没有真正将焦点放在视图上

EditText.requestFocus() returns true but doesn't really give focus to the view

我在工具栏的可扩展操作视图中有一个 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(); returns true,但是软件键盘仍然没有显示,[=18 中没有光标=].

显示软件键盘没什么大不了的,有办法强制它,但即使我显示键盘,输入也不会插入任何文本mSearchEditText.只有当我点击 mSearchEditText 时光标出现,我才能在其中输入一些文本。


我尝试过的:

真的很奇怪,因为关注

@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 时,光标出现并且一切正常)。

Aa 有时会发生这种情况,发布问题后不久我就自己找到了答案。

我不得不使用传递给 onMenuItemActionExpand()MenuItem 并在那里获取引用,而不是在 onCreateOptionsMenu() 中获取对 EditText 的引用。

现在这对我有用了:

@Override
public boolean onMenuItemActionExpand(final MenuItem item) {
    final View actionView = MenuItemCompat.getActionView(item);
    final View edit = actionView.findViewById(R.id.connections_find_people_edit);
    if(edit.requestFocus()) {
        KeyboardUtils.showSoftKeyboard(ConnectionsFragment.this);
    }
    return true;
}