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