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
时光标出现,我才能在其中输入一些文本。
我尝试过的:
- 在 XML 中和以编程方式设置
focusable
和 focusableInTouchMode
,在 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 时,光标出现并且一切正常)。
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;
}
我在工具栏的可扩展操作视图中有一个 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
时光标出现,我才能在其中输入一些文本。
我尝试过的:
- 在 XML 中和以编程方式设置
focusable
和focusableInTouchMode
,在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 时,光标出现并且一切正常)。
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;
}