我希望能够从EditText删除焦点。例如,如果键盘出现,用户用后退按钮隐藏它,我希望焦点和光标消失。怎样才能做到呢?
你可以将它添加到onCreate中,它会在每次Activity启动时隐藏键盘。
onCreate
Activity
您还可以通过编程方式将焦点更改为另一个项目。
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
您可以使光标和焦点消失
edittext.clearFocus();
但检测时隐藏键盘是一项艰苦的工作。
你也可以在你的manifest action部分中包含android: windowSoftInputMode = " stateAlwaysHidden "。
这相当于:
而是以XML的方式。
供参考,你也可以用代码隐藏键盘:
// hide virtual keyboard InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(mYourEditText.getWindowToken(), 0);
在评论中,你问是否可以聚焦另一个视图而不是EditText。是的,它可以。在onCreate()方法中,使用.requestFocus()方法用于你想要在开始时聚焦的视图。
.requestFocus()
同样聚焦其他视图也会减少一些代码。(例如隐藏键盘的代码)
remove autofocus edittext android
这对我很有用
编辑在链接中,他们建议使用线性布局,但简单视图将工作
<View android:id="@+id/focus_thief" android:layout_width="1dp" android:layout_height="1dp" android:focusable="true" android:focusableInTouchMode="true" />
然后,如果这个“thief”被放置在布局的顶部(成为第一个可聚焦的项),则调用clearFocus()将工作。
clearFocus()
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
在XML中的EditText之前添加LinearLayout。
EditText
LinearLayout
<LinearLayout android:focusable="true" android:focusableInTouchMode="true" android:clickable="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" />
你也可以在你的manifest action部分中包含android:windowSoftInputMode="stateAlwaysHidden"。
android:windowSoftInputMode="stateAlwaysHidden"
editText.setFocusableInTouchMode(false); editText.setFocusable(false); editText.setFocusableInTouchMode(true); editText.setFocusable(true);
EditText将失去焦点,但可以在新的触摸事件中再次获得焦点。
你可以通过设置父元素的属性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”是阻止对子元素的关注。
你可以找到更多信息在这里。
这是我对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>
这里我需要一些东西。我需要有一个占位符为我的EditText -这是-
android:提示= "提示"
同时,
android:descendantFocusability="beforeDescendants" android:focusableInTouchMode="true"
使它发生在EditText不被关注进入活动和稍后在活动本身设置时,这个设置帮助,所以你可以在它上设置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; } }
我在这个问题页上找到的几个比特的答案,以及我在这个博客上找到的活动解决方案的部分。剩下的我错过了,我必须自己弄清楚的是,我在setOnEditorActionListener和父视图的onTouchLister中添加的EditText上的焦点。
希望这能帮助到一些人,节省他们的时间。:)
editText.setFocusableInTouchMode(true)
你必须删除<requestFocus/>
<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"/>
我也有同样的问题。这简直让我疯了。
我有一个扩展的对话框与一个ScrollView,它有一个表布局与扩展的线性布局,其中包含一个搜索栏和一个编辑文本。
第一个EditText在显示对话框后总是自动对焦,在完成键盘上的文本编辑后,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; } });
顺便说一下,我没有使用以下任何片段来解决它:
//setFocusableInTouchMode( true ) //setFocusable( true ) //setDescendantFocusability( ViewGroup.FOCUS_BEFORE_DESCENDANTS )
并且我没有使用了一个间隔项,比如一个宽度和高度为1dp的视图。
希望它能帮助到某人:D
添加到你的父布局,你把你的EditText这个android:focusableInTouchMode="true"
android:focusableInTouchMode="true"
当活动开始时隐藏键盘。在onCreate()中编写以下代码..
InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
清除焦点并从edittext.....中删除光标
editText.clearFocus(); editText.setCursorVisible(false);