Android:强制EditText删除焦点?

我想能够从EditText中删除焦点。 例如,如果键盘出现,用户用后退button隐藏,我想焦点和光标消失。 如何做呢?

您可以将此添加到onCreate ,每次活动开始时都会隐藏键盘。

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

 this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

你可以让光标和焦点消失

 edittext.clearFocus(); 

但是检测到关键板的隐藏是一项艰苦的工作。

在XML中的EditText之前添加LinearLayout

 <LinearLayout android:focusable="true" android:focusableInTouchMode="true" android:layout_width="0px" android:layout_height="0px" /> 

或者你可以通过添加这些行来查看“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" /> 

消除焦点,但保持对焦:

 editText.setFocusableInTouchMode(false); editText.setFocusable(false); editText.setFocusableInTouchMode(true); editText.setFocusable(true); 

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

删除autofocus edittext android

它为我工作

编辑在他们build议使用LinearLayout的链接,但简单的视图将工作

 <View android:id="@+id/focus_thief" android:layout_width="1dp" android:layout_height="1dp" android:focusable="true" android:focusableInTouchMode="true" /> 

然后,如果这个“小偷”被放置在布局的顶部(第一个可clearFocus()项目),调用clearFocus()将会起作用。

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

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

它会做的伎俩:)

您也可以在清单操作部分包含android:windowSoftInputMode =“stateAlwaysHidden”

这相当于:

 this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

但采用XML方式。

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

 // hide virtual keyboard InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(mYourEditText.getWindowToken(), 0); 

你必须删除<requestFocus/>

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

用户LinearLayout作为父项并进行设置

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

希望这对你有所帮助。

尝试使用这一个在你看来它为我工作:

 <View android:id="@+id/fucused" android:layout_width="wrap_content" android:layout_height="wrap_content" android:focusable="true" android:focusableInTouchMode="true"/> 

这是我的第一个回答,所以如果有错误,不要太苛刻。 :d

没有什么答案漂浮在SO上,但是我觉得有必要发布我的完整解决scheme,因为这让我很吃惊。 如果我不给每个人分数的话,我都会抓住所有人的点点滴滴,原谅我… 🙂

(我会简化我的结果,因为我的观点有太多的元素,我不希望与垃圾邮件,并会尽量使其尽可能通用…)

对于你的布局,你需要一个父母你的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> 

所以,我在这里需要一些东西。 我需要为我的EditText有一个占位符 – 这就是 –

机器人:提示=“暗示”

也,

 android:descendantFocusability="beforeDescendants" android:focusableInTouchMode="true" 

使得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; } } 

我在这个问题页面find的答案很less,还有我在这个博客上find的有解决scheme的部分。 剩下的我错过了,我必须弄清楚自己是关注的EditText ,我添加到setOnEditorActionListener和onTouchLister 为父视图

希望这可以帮助别人,节省时间。 🙂

干杯,Z.

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

 InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0); 

要清除焦点并从edittext删除光标…..

 editText.clearFocus(); editText.setCursorVisible(false); 

在评论中,您问是否可以集中另一个视图而不是EditText。 是的,它可以。 使用.requestFocus()方法为您想要在开始的焦点(在onCreate()方法)

另外关注其他视图将会削减一些代码量。 (例如隐藏键盘的代码)

添加到您的父级布局你把你的EditText这个android:focusableInTouchMode="true"

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

这相当于:

 this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

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

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

在显示对话框之后,第一个EditText总是自动对焦,并且在完成键盘上的文本编辑之后,EditText仍然有焦点,键盘仍然可见。

我尝试了几乎所有这个线程的解决scheme,没有为我工作。

所以在这里我简单的解决scheme :(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; } }); 

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

 //setFocusableInTouchMode( true ) //setFocusable( true ) //setDescendantFocusability( ViewGroup.FOCUS_BEFORE_DESCENDANTS ) 

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

希望它有助于某人:D

 editText.setFocusableInTouchMode(true) 

当用户触摸时, EditText将能够获得焦点。 当主布局(活动,对话框等)变得可见时, EditText不会自动获得焦点,即使它是布局中的第一个视图。

 EditText.setOnKeyListener(new OnKeyListener() { public boolean onKey(View view, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_ENTER) { InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(URLText.getWindowToken(), 0); EditText.setFocusable(false); EditText.setFocusableInTouchMode(true); return true; } else { return false; } } }); 

您可以通过设置父元素的属性android:descendantFocusability来避免对元素的任何焦点。

这里是一个例子:

 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/search__scroller" android:descendantFocusability="blocksDescendants" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" > </ScrollView> 

在这里,将属性android:descendantFocusability设置为“blocksDescendants”将阻止对子元素的关注。

你可以在这里find更多的信息。

 check your xml file <EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="14sp" > **<requestFocus />** </EditText> //Remove **<requestFocus />** from xml