android EditText 焦点行为
android EditText focus behavior
我认为这很容易实现,但显然不是。我有一个带有 2 个 editTexts 和 1 个 TextView 的片段。都有自定义的 Drawables 作为背景。这是我正在寻找的行为:
- 片段打开时,没有焦点 - 正常
- 当您点击任一编辑时,它会获得焦点,所有文本都会被选中,并且 softKeyboard 会以数字模式打开 - 这也行得通
- 输入新号码后,单击软键盘右下角的蓝色键(制表符或复选标记符号)时,软键盘关闭并且没有焦点 - 没有闪烁的光标。 - 这就是我无法开始工作的原因。
请帮忙。 Kotlin 或 Java OK
你需要实现这个逻辑(如果你想进一步升级,这只是一个例子)
布局:
...
<View
android:id="@+id/f_c_focus_view"
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="0dp"
android:layout_height="0dp" />
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:imeOptions="actionDone"
android:inputType="number" />
<EditText
android:id="@+id/editText2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:imeOptions="actionDone"
android:inputType="number"/>
...
在布局中你可以看到隐藏的 'focus' 视图,它需要拦截焦点,因为如果你有一个 EditText 作为视图的第一个组件,它总是会获得焦点。我的 EditText 组件有一个 imeOptions="actionDone"
,我将在代码中进一步处理它,您可以有不同的 imeOptions。
代码:
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
...
focusView.requestFocus() // intercept focus on view created
editText1.setOnEditorActionListener { v, actionId, _ ->
when(actionId) {
EditorInfo.IME_ACTION_DONE -> { // handle checkmark key press on the keyboard
v.clearFocus()
hideKeyBoard(v)
}
}
false
}
editText2.setOnEditorActionListener { v, actionId, _ ->
when(actionId) {
EditorInfo.IME_ACTION_DONE -> {
v.clearFocus()
hideKeyBoard(v)
}
}
false
}
...
}
private fun hideKeyBoard(v: View) {
val imm = context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(v.windowToken, 0)
}
我认为这很容易实现,但显然不是。我有一个带有 2 个 editTexts 和 1 个 TextView 的片段。都有自定义的 Drawables 作为背景。这是我正在寻找的行为:
- 片段打开时,没有焦点 - 正常
- 当您点击任一编辑时,它会获得焦点,所有文本都会被选中,并且 softKeyboard 会以数字模式打开 - 这也行得通
- 输入新号码后,单击软键盘右下角的蓝色键(制表符或复选标记符号)时,软键盘关闭并且没有焦点 - 没有闪烁的光标。 - 这就是我无法开始工作的原因。
请帮忙。 Kotlin 或 Java OK
你需要实现这个逻辑(如果你想进一步升级,这只是一个例子)
布局:
...
<View
android:id="@+id/f_c_focus_view"
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="0dp"
android:layout_height="0dp" />
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:imeOptions="actionDone"
android:inputType="number" />
<EditText
android:id="@+id/editText2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:imeOptions="actionDone"
android:inputType="number"/>
...
在布局中你可以看到隐藏的 'focus' 视图,它需要拦截焦点,因为如果你有一个 EditText 作为视图的第一个组件,它总是会获得焦点。我的 EditText 组件有一个 imeOptions="actionDone"
,我将在代码中进一步处理它,您可以有不同的 imeOptions。
代码:
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
...
focusView.requestFocus() // intercept focus on view created
editText1.setOnEditorActionListener { v, actionId, _ ->
when(actionId) {
EditorInfo.IME_ACTION_DONE -> { // handle checkmark key press on the keyboard
v.clearFocus()
hideKeyBoard(v)
}
}
false
}
editText2.setOnEditorActionListener { v, actionId, _ ->
when(actionId) {
EditorInfo.IME_ACTION_DONE -> {
v.clearFocus()
hideKeyBoard(v)
}
}
false
}
...
}
private fun hideKeyBoard(v: View) {
val imm = context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(v.windowToken, 0)
}