AutoCompleteTextView始终保持焦点

时间:2014-02-21 16:21:41

标签: android user-interface focus

我在一个活动(LinearLayout)和几个2 AutoCompleteTextViews(无线电组,按钮等)中有additional controls。不知何故,AutoCompleteTextViews是never losing focus

例如: 用户单击AutoCompleteTextView,控件获得焦点。因此光标开始闪烁,显示自动完成下拉列表和键盘。这可以。 但是,如果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="" />

3 个答案:

答案 0 :(得分:7)

只有对我有用的解决方案是添加此行

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

到AutoCompleteTextView的父级(如LinearLayout等..)

答案 1 :(得分:2)

您是否尝试使用android:focusableInTouchMode="true" each view 代码段

<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

答案 2 :(得分:1)

为了避免设置其他所有内容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);
}

如果您将此逻辑放在基本活动中,那么当您点按其外部的任何位置时,任何带有编辑文字的屏幕都会点击onFocusChange。通过聆听onFocusChange,您可以在另一个视图中clearFocusrequestFocus。它或多或少是一个黑客攻击,但至少你不必为许多布局上的任何其他项目设置焦点。

请参阅http://developer.android.com/reference/android/app/Activity.html#dispatchTouchEvent(android.view.MotionEvent)