android 自动完成文本视图始终保持焦点

2ekbmq32  于 2023-01-07  发布在  Android
关注(0)|答案(4)|浏览(138)

我在一个Activity(LinearLayout)中有2 AutoCompleteTextViews和几个additional controls(radiogroup、button等)。
例如:用户单击AutoCompleteTextView,控件获得焦点。因此光标开始 Flink ,自动完成下拉列表和键盘显示。这很好。但是,如果user now clicks on of the radio buttons(或其他控件),AutoCompleteTextView is still blinking中的光标和键盘仍显示。
如何让焦点自动消失?

**编辑:**xml代码

<AutoCompleteTextView
                android:id="@+id/ediFrom"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:singleLine="true"
                android:text="" />
iyr7buue

iyr7buue1#

唯一对我有效的解决方案是添加以下行

android:focusable="true" 
android:focusableInTouchMode="true"

到AutoCompleteTextView的父视图(如线性布局等)

ycl3bljg

ycl3bljg2#

您是否尝试过each viewandroid:focusableInTouchMode="true"代码片段

<AutoCompleteTextView
      android:id="@+id/ediFrom"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:layout_weight="1"
      android:singleLine="true"
      android:focusableInTouchMode="true"
      android:text="" />

http://android-developers.blogspot.in/2008/12/touch-mode.html

oipij1gg

oipij1gg3#

为了避免设置其他所有内容focusable(如果您碰巧在许多其他布局中使用相同的文本视图,这会很痛苦),我们选择覆盖逻辑,以在活动级别拦截触摸屏事件:

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    View v = getCurrentFocus();
    if (v instanceof EditText) {
        int scrcoords[] = new int[2];
        v.getLocationOnScreen(scrcoords);
        // calculate the relative position of the clicking position against the position of the view
        float x = event.getRawX() - scrcoords[0];
        float y = event.getRawY() - scrcoords[1];

        // check whether action is up and the clicking position is outside of the view
        if (event.getAction() == MotionEvent.ACTION_UP
                && (x < 0 || x > v.getRight() - v.getLeft()
                || y < 0 || y > v.getBottom() - v.getTop())) {
            if (v.getOnFocusChangeListener() != null) {
                v.getOnFocusChangeListener().onFocusChange(v, false);
            }
        }
    }
    return super.dispatchTouchEvent(event);
}

如果你把这个逻辑放在你的基本Activity中,任何一个有编辑文本的屏幕,当你点击它外面的任何地方时,都会触发onFocusChange。通过听onFocusChange,你可以在另一个视图上触发clearFocusrequestFocus。这或多或少是一个技巧,但至少你不必为许多布局上的任何其他项目设置可聚焦。
请访问http://developer.android.com/reference/android/app/Activity.html#dispatchTouchEvent(安卓系统的视图和运动事件)

egdjgwm8

egdjgwm84#

当下拉菜单被取消时(选择值,单击外部),可以使用setOnDismissListener()方法清除焦点
这个Kotlin代码对我来说很好用,你也可以很容易地把它重写成java:

materialAutoCompleteTextBox.setOnDismissListener {
  materialAutoCompleteTextBox.clearFocus()
}

相关问题