如何在Android中防止活动启动时EditText获取焦点?

3161

我在Android中有一个Activity,其中包含两个元素:

  1. EditText
  2. ListView

当我的Activity启动时,EditText立即具有输入焦点(闪烁光标)。我不希望任何控件在启动时具有输入焦点。我尝试过:

EditText.setSelected(false);
EditText.setFocusable(false);

没有成功。我该如何说服EditTextActivity启动时不选择自己?

54个回答

8

当我的按钮被按下时,我使用以下代码来防止EditText夺取焦点。

addButton.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        View focused = internalWrapper.getFocusedChild();
        focused.setVisibility(GONE);
        v.requestFocus();
        addPanel();
        focused.setVisibility(VISIBLE);
    }
});

Basically, hide the edit text and then show it again. This works for me as the EditText is **not** in view so it doesn't matter whether it is showing.

You could try hiding and showing it in succession to see if that helps it lose focus.

8
您可以通过创建一个布局宽度和高度均为0dp的虚拟EditText,并将焦点请求到该视图来实现此目的。 在您的XML布局中添加以下代码片段:
<EditText
    android:id="@+id/editText0"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:hint="@string/dummy"
    android:ems="10" 
    >
     <requestFocus />
    </EditText>

7
View current = getCurrentFocus();

if (current != null) 
    current.clearFocus();

7
当你的活动被打开时,键盘会自动显示,这会导致EditText获得焦点。您可以通过在manifest.xml文件中的activity标记中编写以下行来禁用键盘。
android:windowSoftInputMode="stateAlwaysHidden|adjustPan"

6

请确保从xml文件中的EditText标签中移除行"<requestFocus />"

<EditText
   android:id="@+id/input"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content">

   <requestFocus /> <!-- remove this line --> 
</EditText>

5

你有Edittextlist。在OnStart/On Create中,应该将焦点设置在listview上:listview.requestfocus()


我喜欢这个,因为它足够简单和干净。 - rgv

4
尝试
edit.setInputType(InputType.TYPE_NULL);

edit.setEnabled(false);

4
/** 
 * set focus to top level window
 * disposes descendant focus 
 * disposes softInput 
 * */
public static void topLevelFocus(Context context){
    if(Activity.class.isAssignableFrom(context.getClass())){
        ViewGroup tlView = (ViewGroup) ((Activity) context).getWindow().getDecorView();
        if(tlView!=null){
            tlView.setFocusable(true);
            tlView.setFocusableInTouchMode(true);
            tlView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
        }
    }
}

4

只需在EditText的父布局中添加android:focusableInTouchMode="true",即可解决此尴尬行为。


4

通过继承EditText并重写onTouchEvent方法,可以实现此功能。

class NonFocusableEditText: EditText {

    constructor(context: Context): super(context)
    constructor(context: Context, attrs: AttributeSet?): super(context, attrs)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int): super(context, attrs, defStyleAttr)

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        return if (isFocusable) super.onTouchEvent(event) else false
    }
}

然后您可以像正常的EditText一样在布局中使用它:

<com.yourpackage.NonFocusableEditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"    
        android:hint="@string/your_hint"
        android:imeOptions="actionDone"
        android:inputType="textNoSuggestions" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接