我希望能够从EditText中删除焦点。例如,如果键盘出现,并且用户使用后退按钮隐藏它,我希望焦点和光标消失。怎么办呢?
答案 0 :(得分:298)
您可以通过
使光标和焦点消失edittext.clearFocus();
但是检测键盘隐藏是一项艰苦的工作。
答案 1 :(得分:235)
您可以将其添加到onCreate
,每次激活时都会隐藏键盘。
您还可以以编程方式将焦点更改为其他项目。
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
答案 2 :(得分:137)
在XML LinearLayout
之前添加EditText
。
<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" />
答案 3 :(得分:83)
editText.setFocusableInTouchMode(false);
editText.setFocusable(false);
editText.setFocusableInTouchMode(true);
editText.setFocusable(true);
EditText将失去焦点,但可以在新的触摸事件中再次获得它。
答案 4 :(得分:65)
remove 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" />
然后,如果这个“小偷”被放置在布局的顶部(成为第一个可聚焦的项目),对clearFocus()
的调用将起作用。
答案 5 :(得分:47)
将这两个属性添加到父布局(例如:线性布局,相对布局)
android:focusable="true"
android:focusableInTouchMode="true"
它会起作用:)
答案 6 :(得分:30)
您还可以在清单操作部分中包含 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);
答案 7 :(得分:18)
您必须删除<requestFocus/>
如果你不使用它仍然是同样的问题
用户LinearLayout
作为父级并设置
android:focusable="true"
android:focusableInTouchMode="true"
希望它能为你提供帮助。
答案 8 :(得分:17)
尝试在您的视图中使用此视图 它对我有用:
<View
android:id="@+id/fucused"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true"/>
答案 9 :(得分:16)
添加到您的父级布局,您将EditText
这个android:focusableInTouchMode="true"
答案 10 :(得分:13)
在活动开始时隐藏键盘..在onCreate()中编写以下代码。
InputMethodManager imm = (InputMethodManager)
getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
清除焦点并从编辑文本中删除光标.....
editText.clearFocus();
editText.setCursorVisible(false);
答案 11 :(得分:9)
这是我关于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设置一个占位符 - 就是那个 -
机器人:提示=&#34;提示&#34;
此外,
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;
}
}
我在这个问题页面找到的位的答案很少,而且我在blog找到了包含活动解决方案的部分。其余的我错过了我必须弄明白自己正在清除 EditText ,我在 setOnEditorActionListener 和onTouchLister中添加父视图 EM>
希望这可以帮助某人并节省他们的时间。 :)
干杯, ž。
答案 12 :(得分:6)
在评论中,您询问是否可以关注其他视图而不是EditText。是的,它可以。使用.requestFocus()
方法查看要在开头聚焦的视图(在onCreate()方法中)
同时关注其他视图将削减一些代码。 (例如隐藏键盘的代码)
答案 13 :(得分:3)
您还可以在清单操作部分中添加android:windowSoftInputMode="stateAlwaysHidden"
。
这相当于:
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
答案 14 :(得分:3)
我遇到了同样的问题。这让我更加疯狂。
我有一个带有ScrollView的扩展Dialog,它有一个带有扩展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;
}
});
顺便说一下,我没有使用以下任何代码片段来解决它:
//setFocusableInTouchMode( true )
//setFocusable( true )
//setDescendantFocusability( ViewGroup.FOCUS_BEFORE_DESCENDANTS )
我没有使用像宽度和高度为1dp的视图这样的间隔项。
希望它有助于某人:D
答案 15 :(得分:2)
editText.setFocusableInTouchMode(true)
当用户触摸时,EditText
将能够获得焦点。
当主要布局(活动,对话框等)变得可见时,即使EditText
是布局中的第一个视图,{{1}}也不会自动获得焦点。
答案 16 :(得分:2)
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;
}
}
});
答案 17 :(得分:0)
您可以通过设置父元素的 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>
这里,设置为“blocksDescendants”的属性android:descendantFocusability阻止了对子元素的关注。
您可以找到更多信息here。
答案 18 :(得分:-4)
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