Android: Force EditText to remove focus?
我希望能够从EditText中删除焦点。 例如,如果键盘出现,并且用户使用后退按钮隐藏它,我希望焦点和光标消失。 怎么做到呢?
你可以使光标和焦点消失
1 | edittext.clearFocus(); |
但是检测键盘隐藏是一项艰苦的工作。
您可以将其添加到
您还可以以编程方式将焦点更改为另一个项目。
1 | this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); |
在XML中的
1 2 3 4 5 6 | <LinearLayout android:focusable="true" android:focusableInTouchMode="true" android:clickable="true" android:layout_width="0px" android:layout_height="0px" /> |
或者你可以通过在"EditText"之前添加这些行来查看相同的内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <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" /> |
删除焦点但仍保持专注:
1 2 3 4 | editText.setFocusableInTouchMode(false); editText.setFocusable(false); editText.setFocusableInTouchMode(true); editText.setFocusable(true); |
EditText将失去焦点,但可以在新的触摸事件中再次获得它。
删除autofocus edittext android
它对我有用
编辑在他们建议使用LinearLayout的链接中,但简单的View将起作用
1 2 3 4 5 6 | <View android:id="@+id/focus_thief" android:layout_width="1dp" android:layout_height="1dp" android:focusable="true" android:focusableInTouchMode="true" /> |
然后,如果这个"小偷"被放置在布局的顶部(成为第一个可聚焦的项目),则对
将这两个属性添加到父布局(例如:线性布局,相对布局)
1 2 | android:focusable="true" android:focusableInTouchMode="true" |
它会做的伎俩:)
您还可以在清单操作部分中包含android:windowSoftInputMode ="stateAlwaysHidden"。
这相当于:
1 | this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); |
但是以XML方式。
仅供参考,您还可以使用以下代码隐藏键盘:
1 2 3 | // hide virtual keyboard InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(mYourEditText.getWindowToken(), 0); |
尝试在你的视图中使用这个
它对我有用:
1 2 3 4 5 6 | <View android:id="@+id/fucused" android:layout_width="wrap_content" android:layout_height="wrap_content" android:focusable="true" android:focusableInTouchMode="true"/> |
你必须删除
如果你不使用它仍然是同样的问题
user
1 2 | android:focusable="true" android:focusableInTouchMode="true" |
希望它对你有所帮助。
添加到您的父布局,您将
要在活动开始时隐藏键盘,请在onCreate()中编写以下代码。
1 2 3 | InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0); |
清除焦点并从编辑文本中删除光标.....
1 2 3 | editText.clearFocus(); editText.setCursorVisible(false); |
这是我在SO上的第一个答案,所以如果有错误的话,不要太苛刻。 :d
在SO周围几乎没有答案,但我觉得发布我的完整解决方案的冲动导致我疯了。我已经抓住了周围的点点滴滴,请原谅我,如果我不给每个人各自的信用...... :)
(我会简化我的结果,因为我的观点有太多的元素,我不想用它来垃圾邮件,并会尽量使它尽可能通用......)
对于您的布局,您需要一个父您的EditText和父视图定义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <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:hint="hint"
也,
1 2 | android:descendantFocusability="beforeDescendants" android:focusableInTouchMode="true" |
使EditText不会专注于进入Activity,以及稍后在Activity中设置它时,这个设置有助于你可以在其上设置onTouchListener来从EditText中窃取焦点。
现在,在活动中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | 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; } } |
我在这个问题页面上找到的小部分答案很少,以及我在此博客上找到的活动解决方案的部分。其余的我错过了我必须弄清楚自己正在清除焦点在EditText上,我在setOnEditorActionListener和onTouchLister中添加了父视图。
希望这有助于某人并节省他们的时间。 :)
干杯,
Z.
在评论中,您询问是否可以关注另一个视图而不是EditText。是的,它可以。对于要在开头聚焦的视图使用
同时关注其他视图将削减一些代码。 (例如隐藏键盘的代码)
我有同样的问题。这让我更疯狂。
我有一个带有ScrollView的扩展Dialog,它有一个带有扩展LinearLayout的TableLayout,其中包含一个SeekBar和一个EditText。
显示对话框后,第一个EditText始终自动对焦,在键盘上完成文本编辑后,EditText仍然具有焦点,键盘仍然可见。
我尝试了几乎所有这个线程的解决方案,没有一个对我有用。
所以这里我的简单解决方案:(text = EditText)
1 2 3 4 5 6 7 8 9 10 11 12 | 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; } }); |
顺便说一下,我没有使用以下任何代码片段来解决它:
1 2 3 | //setFocusableInTouchMode( true ) //setFocusable( true ) //setDescendantFocusability( ViewGroup.FOCUS_BEFORE_DESCENDANTS ) |
我没有使用像宽度和高度为1dp的视图的间隔项。
希望它可以帮助某人:D
您还可以在清单操作部分中包含
这相当于:
1 | this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); |
1 | editText.setFocusableInTouchMode(true) |
当用户触摸时,
当主要布局(活动,对话框等)变得可见时,即使它是布局中的第一个视图,
1 2 3 4 5 6 7 8 9 10 11 12 | 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,可以避免对元素的任何关注。
这是一个例子:
1 2 3 4 5 6 7 8 9 | <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> |
这里,设置为"blocksDescendants"的属性android:descendantFocusability阻止了对子元素的关注。
你可以在这里找到更多信息。
1 2 3 4 5 6 7 8 9 10 11 12 | 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 |