Android: 活动开始时清除EditText的焦点

9

我有一个应用程序的设置页面。一旦活动开始,它直接聚焦于编辑文本,并且我使用以下代码来清除焦点。

<RelativeLayout 
     android:id="@+id/RequestFocusLayout"
     android:focusable="true"
     android:focusableInTouchMode="true"
     android:layout_width="0px"
     android:layout_height="0px"/>

在Java代码中

 RelativeLayout focuslayout = (RelativeLayout) findViewById(R.id.RequestFocusLayout);
 focuslayout.requestFocus();

以上代码在活动第一次启动时运行良好,如果再次启动相同的活动,则自动使编辑文本获得焦点。

有人能帮我解决这个问题吗?


焦点是从开始状态回来还是从其他活动中回来的? - Dheeresh Singh
如果从其他活动返回,则EditText会获得焦点。 - Maddy
尝试在清单文件中为该活动提供android:windowSoftInputMode="stateHidden" - MKJParekh
8个回答

13

实际上,活动中的第一个可聚焦视图接收初始焦点。如果这恰好是您的EditText,则它将首先获得焦点。

如果您不想要那样,这里有几个选项:

将焦点放在另一个视图上

以编程方式确定您希望将初始焦点放置在哪个视图上。

@Override
protected void onStart() {

    super.onStart();
    findViewById( R.id.yourOtherViewId ).requestFocus();
}

使布局中的早期视图获取焦点

如果你希望它看起来好像“没有视图具有初始焦点”,你可以使父视图组可获得焦点。在下面的示例中,我通过设置android:focusableInTouchMode="true"使我的LinearLayout可获取焦点:

<LinearLayout
    android:focusableInTouchMode="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <EditText
        ...

9
If Come back from other activity edittext get focused. 

将这些代码行放置于onStart()或onResume()函数中

  RelativeLayout focuslayout = (RelativeLayout) findViewById(R.id.RequestFocusLayout);
 focuslayout.requestFocus();

5

如果您的EditText是RelativeLayout的子级,您可以使用android:descendantFocusability请求焦点:

<RelativeLayout 
     android:id="@+id/RequestFocusLayout"
     android:focusable="true"
     android:layout_width="0px"
     android:layout_height="0px" 
     android:descendantFocusability="beforeDescendants" 
     android:focusableInTouchMode="true" />

5
我使用了这个页面上提供的解决方法,但是它没有起作用。你需要在AndroidManifest的活动标签中添加这个属性:
android:windowSoftInputMode="stateHidden"

它运作得非常完美。


4

在我的父视图组中,只有android:focusableInTouchMode ="true"才帮助我真正地解决了问题。


0
将代码放在onStart()方法中以移除焦点,这样应该就可以正常工作了。

0
在布局的XML文件中,为你的EditText指定一个imeOption:
android:imeOptions="actionGo"

接下来,在Activity的Java文件中为您的EditText添加一个动作监听器。
mYourEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_GO) {
            // hide virtual keyboard
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(mYourEditText.getWindowToken(), 0);
            return true;
        }
        return false;
    }
});

其中 mYourEditText 是一个 EditText 对象。


0

如果在启动 Activity 时要将焦点放在屏幕上的 EditText 上,请使用

android:focusableInTouchMode="true"

在包含该EditText的父级中。例如,如果EditText位于RelativeLayout中,请在RelativeLayout中使用此行。


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