Android:强制EditText删除焦点?

Ale*_*987 340 android focus android-edittext

我希望能够从EditText中删除焦点.例如,如果键盘出现,并且用户使用后退按钮隐藏它,我希望焦点和光标消失.怎么做到呢?

xtr*_*xtr 326

你可以使光标和焦点消失

edittext.clearFocus();
Run Code Online (Sandbox Code Playgroud)

但是检测键盘隐藏是一项艰苦的工作.

  • 它有效,但它将焦点设置回活动中的第一个可聚焦视图,因此如果您在活动中只有一个视图,您可能认为它没有,但它确实有效,您必须了解其行为:) (177认同)
  • 如果其他人正努力让这个工作,如果你将`android:focusable ="true"`和`android:focusableInTouchMode ="true"`添加到你的活动或片段的根`布局`,这会将焦点改为`Layout`而不是`EditText`. (89认同)
  • clearFocus()不起作用. (48认同)

小智 246

你可以添加它onCreate,它会在每次激活开始时隐藏键盘.

您还可以以编程方式将焦点更改为另一个项目.

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Run Code Online (Sandbox Code Playgroud)

  • 像我这样的人首先跳过问题本身的评论:@AmritpalSingh有一种更优雅的方式(仅使用XML属性)来实现这一点.看看这个 ! (2认同)

Sin*_*jun 156

LinearLayoutEditText在XML中添加.

<LinearLayout 
    android:focusable="true"
    android:focusableInTouchMode="true" 
    android:clickable="true"
    android:layout_width="0px"
    android:layout_height="0px" />
Run Code Online (Sandbox Code Playgroud)

或者你可以通过在"EditText"之前添加这些行来查看相同的内容.

<Button
    android:id="@+id/btnSearch"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:gravity="center"
    android:text="Quick Search"
    android:textColor="#fff"
    android:textSize="13sp"
    android:textStyle="bold" />

<EditText
    android:id="@+id/edtSearch"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_centerVertical="true"
    android:layout_marginRight="5dp"
    android:gravity="left"
    android:hint="Name"
    android:maxLines="1"
    android:singleLine="true"
    android:textColorHint="@color/blue"
    android:textSize="13sp"
    android:textStyle="bold" />
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个解决方案与我的EditText上的.clearFocus()结合使用(这是布局中第一个可聚焦的项目,因此clearFocus()不能单独工作).将LinearLayout欺骗为可聚焦是一种简单易用的解决方案.好工作Singh Arjun :) (14认同)

Pas*_*lis 92

删除焦点但仍保持专注:

editText.setFocusableInTouchMode(false);
editText.setFocusable(false);
editText.setFocusableInTouchMode(true);
editText.setFocusable(true);
Run Code Online (Sandbox Code Playgroud)

EditText将失去焦点,但可以在新的触摸事件中再次获得它.

  • 这似乎将焦点转移到下一个可聚焦视图,而不是从编辑文本中删除焦点.似乎Android并不想"不专心"; 出于这个原因,我选择在我的项目中使根布局为focusable/focusableInTouchMode.它也具有语义意义:当您不想专注于特定的编辑文本时,将焦点设置为根布局类似于退后一步并专注于完整的活动/片段而不是特定的视图. (10认同)
  • 您可以尝试“clearFocus” (2认同)

小智 69

删除autofocus edittext android

它对我有用

编辑在他们建议使用LinearLayout的链接中,但简单的View将起作用

<View
    android:id="@+id/focus_thief"
    android:layout_width="1dp"
    android:layout_height="1dp"
    android:focusable="true"
    android:focusableInTouchMode="true" />
Run Code Online (Sandbox Code Playgroud)

然后,如果这个"小偷"被放置在布局的顶部(成为第一个可聚焦的项目),则呼叫clearFocus()将起作用.

  • 虽然这在理论上可以回答这个问题,[但最好](http://meta.stackexchange.com/q/8259)在此处包含答案的基本部分,并提供参考链接. (11认同)

Kin*_*ses 54

将这两个属性添加到父布局(例如:线性布局,相对布局)

android:focusable="true"
android:focusableInTouchMode="true" 
Run Code Online (Sandbox Code Playgroud)

它会做的伎俩:)

  • 最佳解决方案,无需添加新视图.谢谢 (7认同)
  • 这背后的基本逻辑是什么? (2认同)
  • 不要奇怪。Android有时会怀疑自己的创作者不了解。 (2认同)
  • 应该在上面. (2认同)
  • @UtsavGupta的基本(和不可预测的)逻辑/行为是,当视图失去焦点时,Android会将其设置为视图层次结构中支持它的“第一个”视图。 (2认同)

Jar*_*Law 30

您还可以在清单操作部分中包含android:windowSoftInputMode ="stateAlwaysHidden".

这相当于:

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Run Code Online (Sandbox Code Playgroud)

但是以XML方式.

仅供参考,您还可以使用以下代码隐藏键盘:

// hide virtual keyboard
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mYourEditText.getWindowToken(), 0);
Run Code Online (Sandbox Code Playgroud)


edi*_*rsh 22

尝试在你的观点中使用这个对我有用:

<View
    android:id="@+id/fucused"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="true"
    android:focusableInTouchMode="true"/>
Run Code Online (Sandbox Code Playgroud)

  • 我无法相信Android中的焦点管理有多糟糕,在尝试了不同的可能解决方案之后,直到我感到沮丧,这个评论是唯一可以完美运行的选项......只需在xml上添加一个简单的视图即可(诀窍)显然,当你想从其他地方删除时,你将焦点设置到该视图)谢谢.. (4认同)
  • 我会说更像'Fuckused`但是......是的. (4认同)
  • 确切地说,"乱了"!:d (3认同)

小智 18

你必须删除 <requestFocus/>

如果你不使用它仍然是同样的问题

用户LinearLayout作为父级并设置

android:focusable="true"
android:focusableInTouchMode="true"
Run Code Online (Sandbox Code Playgroud)

希望它对你有所帮助.


Con*_*ext 18

添加到您的父母布局你在哪里把你的EditText这个android:focusableInTouchMode="true"

  • 这招对我的作品.如果视图是第一个`EditText`,似乎`clearFocus()`清除其焦点,然后开始通过视图树搜索焦点候选,然后找出相同的视图.结果是一样的.但是如果你把`android:focusableInTouchMode`放在焦点遍历的最终位置. (2认同)

Pra*_*ode 18

要在活动开始时隐藏键盘,请在onCreate()中编写以下代码.

InputMethodManager imm = (InputMethodManager)
getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
Run Code Online (Sandbox Code Playgroud)

清除焦点并从编辑文本中删除光标.....

editText.clearFocus();

editText.setCursorVisible(false);
Run Code Online (Sandbox Code Playgroud)

  • 注意:要使 ```editText.clearFocus();``` 工作,您需要将 ```android:focusableInTouchMode="true" android:focusable="true"``` 添加到根布局 (2认同)

zed*_*zed 10

这是我在SO上的第一个答案,所以如果有错误的话,不要太苛刻.:d

在SO周围几乎没有答案,但我觉得发布我的完整解决方案的冲动导致我疯了.我已经抓住了周围的点点滴滴,请原谅我,如果我不给每个人各自的信用...... :)

(我会简化我的结果,因为我的观点有太多的元素,我不想用它来垃圾邮件,并会尽量使它尽可能通用......)

对于您的布局,您需要一个父您的EditText父视图定义如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
              android:orientation="vertical"
              android:layout_width="match_parent" 
              android:layout_height="match_parent"
              android:id="@+id/lytContainer"
              android:descendantFocusability="beforeDescendants"
              android:focusableInTouchMode="true">
<EditText android:layout_width="fill_parent" 
              android:layout_height="wrap_content" 
              android:id="@+id/etEditor"
              android:inputType="number"
              android:layout_gravity="center" 
              android:hint="@string/enter_your_text"
              android:textColor="@android:color/darker_gray" 
              android:textSize="12dp"
              android:textAlignment="center" 
              android:gravity="center" 
              android:clickable="true"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

所以,我在这里需要一些东西.我需要为我的EditText设置占位符 - 这就是 -

机器人:提示="暗示"

也,

android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"
Run Code Online (Sandbox Code Playgroud)

使EditText不会专注于进入Activity,以及稍后在Activity中设置它时,这个设置有助于你可以在其上设置onTouchListener来从EditText中窃取焦点.

现在,在活动中:

package com.at.keyboardhide;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnTouchListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout;

public class MainActivity extends Activity implements OnTouchListener{
private EditText getEditText;
private LinearLayout getLinearLayout;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

    setContentView(R.layout.keyboardmain);
    getEditText = (EditText)findViewById(R.id.etEditor);
    getLinearLayout = (LinearLayout)findViewById(R.id.lytContainer);
    getLinearLayout.setOnTouchListener(this);

    getEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                Log.d("EDTA", "text was entered.");
                getEditText.clearFocus();
                imm.hideSoftInputFromWindow(barcodeNo.getWindowToken(), 0);
                return true;
            }
            return false;
        }
    });
}
@Override
public boolean onTouch(View v, MotionEvent event) {
    if(v==getLinearLayout){
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getEditText.getWindowToken(), 0);
        getEditText.clearFocus();
        return true;
        }
    return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

我在这个问题页面上找到的小部分答案很少,以及我在此博客上找到的活动解决方案的部分.其余的我错过了我必须弄清楚自己是清除焦点在EditText上,我在setOnEditorActionListener和onTouchLister中添加了父视图.

希望这有助于某人并节省他们的时间.:)

干杯,Z.


Nik*_*ski 6

在评论中,您询问是否可以关注另一个视图而不是EditText.是的,它可以..requestFocus()要在开头聚焦的视图的使用方法(在onCreate()方法中)

同时关注其他视图将削减一些代码.(例如隐藏键盘的代码)


Pix*_*tar 5

我有同样的问题。这让我更加疯狂。

我有一个带有 ScrollView 的扩展对话框,它有一个带有扩展 LinearLayout 的 TableLayout,其中包含一个 SeekBar 和一个 EditText。

第一个 EditText 在显示 Dialog 后始终自动对焦,并且在通过键盘完成编辑文本后 EditText 仍然具有焦点并且键盘仍然可见。

我尝试了该线程的几乎所有解决方案,但没有一个对我有用。

所以这里是我的简单解决方案:(text = EditText)

text.setOnEditorActionListener( new OnEditorActionListener( ){
    public boolean onEditorAction( TextView v, int actionId, KeyEvent event ){
        if( (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) ||
            (actionId == EditorInfo.IME_ACTION_DONE) ){
            text.clearFocus( );
            InputMethodManager iMgr = null;
            iMgr = (InputMethodManager)mContext.getSystemService( Context.INPUT_METHOD_SERVICE );
            iMgr.hideSoftInputFromWindow( text.getWindowToken(), 0 );
        }
        return true;
    }
});
Run Code Online (Sandbox Code Playgroud)

顺便说一下,我没有使用以下任何片段来解决它:

//setFocusableInTouchMode( true )
//setFocusable( true )
//setDescendantFocusability( ViewGroup.FOCUS_BEFORE_DESCENDANTS )
Run Code Online (Sandbox Code Playgroud)

而且我没有使用像宽度和高度为 1dp 的视图这样的间隔项。

希望它可以帮助某人:D