Android:强制EditText删除焦点?

我希望能够从EditText删除焦点。例如,如果键盘出现,用户用后退按钮隐藏它,我希望焦点和光标消失。怎样才能做到呢?

445247 次浏览

你可以将它添加到onCreate中,它会在每次Activity启动时隐藏键盘。

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

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

您可以使光标和焦点消失

edittext.clearFocus();

但检测时隐藏键盘是一项艰苦的工作。

你也可以在你的manifest action部分中包含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);

在评论中,你问是否可以聚焦另一个视图而不是EditText。是的,它可以。在onCreate()方法中,使用.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()将工作。

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

<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"

这相当于:

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

移除焦点但保持可聚焦:

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上的焦点。

希望这能帮助到一些人,节省他们的时间。:)

< p >欢呼, z . < / p >
editText.setFocusableInTouchMode(true)
EditText将能够在用户触摸它时获得焦点。 当主布局(活动、对话框等)变得可见时,EditText不会自动获得焦点,即使它是布局中的第一个视图。< / p >

你必须删除<requestFocus/>

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

用户LinearLayout作为父用户并设置

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

希望对你有所帮助。

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

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"

当活动开始时隐藏键盘。在onCreate()中编写以下代码..

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

清除焦点并从edittext.....中删除光标

editText.clearFocus();


editText.setCursorVisible(false);