android edittext在单击按钮后删除焦点

android edittext在单击按钮后删除焦点,android,android-edittext,Android,Android Edittext,我有一个带有编辑文本和按钮的活动。 当用户点击编辑文本时,键盘会显示出来,他可以输入一些文本-很好。 但当用户单击按钮时,我希望EditText不再处于焦点位置,即键盘隐藏,直到用户再次单击EditText 单击按钮后,如何“隐藏编辑文本的焦点”。 我可以在按钮的OnClick方法中添加一些代码来实现这一点吗 编辑: 致以最诚挚的问候私人void hideDefaultKeyboard(){ activity.getWindow().setSoftInputMode(WindowManage

我有一个带有编辑文本和按钮的活动。 当用户点击编辑文本时,键盘会显示出来,他可以输入一些文本-很好。 但当用户单击按钮时,我希望EditText不再处于焦点位置,即键盘隐藏,直到用户再次单击EditText

单击按钮后,如何“隐藏编辑文本的焦点”。 我可以在按钮的OnClick方法中添加一些代码来实现这一点吗

编辑:


致以最诚挚的问候

私人void hideDefaultKeyboard(){
activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT\u INPUT\u STATE\u HIDDEN);//这里有很多方法
}
编辑:

LayoutParams.SOFT\u输入\u状态\u始终\u隐藏

将其放入按钮侦听器:

InputMethodManager inputManager=(InputMethodManager)getSystemService(Context.INPUT\u方法\u服务);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),InputMethodManager.HIDE_不总是);
编辑

如果没有关注
EditText
,上述解决方案将中断您的应用程序。按如下方式修改代码:

<View
    android:id="@+id/dummy"
    android:layout_width="1dp"
    android:layout_height="1dp"
    android:focusable="true"
    android:focusableInTouchMode="true" />
将此方法添加到类:

publicstaticvoid隐藏键盘(活动、视图)
{
InputMethodManager imm=(InputMethodManager)activity.getSystemService(Context.INPUT\u方法\u服务);
imm.hideSoftInputFromWindow(view.getApplicationWindowToken(),0);
}
然后,在按钮侦听器中,调用如下方法:

<View
    android:id="@+id/dummy"
    android:layout_width="1dp"
    android:layout_height="1dp"
    android:focusable="true"
    android:focusableInTouchMode="true" />
隐藏键盘(main activity.this,v);//MainActivity是类的名称,v是按钮侦听器方法onClick中使用的视图参数。

为什么不禁用按钮代码中的编辑文本?这应该可以摆脱键盘和焦点


edt_SearchDest.setEnabled(假)

我已成功地在onClick按钮代码中使用了以下内容:

editText.setEnabled(false);
editText.setEnabled(true);

比其他方法稍微简单一些…

一种解决方法是在
编辑文本中创建一个假视图,以便在
clearFocus
时将焦点转移到该视图:

mTextView.setEnabled(!mTextView.isEnabled());
mTextView.setEnabled(!mTextView.isEnabled());
<EditText
        android:id="@+id/edt_thief"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:focusable="true"
        android:focusableInTouchMode="true"
然后,您可以在
edt
有焦点时最小化键盘:

 public static void hideKeyboard(final View view) {
    InputMethodManager imm = (InputMethodManager) view.getContext()
            .getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

很抱歉回答晚了,但我希望这将是正确的答案,因为我使用

try {
InputMethodManager imm = (InputMethodManager) context
                    .getSystemService(Context.INPUT_METHOD_SERVICE);
if (v != null) {
imm.hideSoftInputFromWindow(v.getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
}
} catch (Exception ignored) {
}
mEditText.setSelected(false);
mEditText.setFocusable(false);
mEditText.setFocusableInTouchMode(true);

在您的按钮点击上写下以下代码片段。

我能找到的最优雅的解决方案是:

可以在实用程序类中保存此方法:

public static void hideSoftKeyboard(Activity activity) {
   if (activity == null) return;
   if (activity.getCurrentFocus() == null) return;

   InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
   inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
通过简单地调用hideSoftKeyboad()方法,它将隐藏键盘,但正如您所看到的,焦点仍然存在

为了消除焦点,我们将使用一个简单的技巧。在输入控件的正上方,添加一个虚拟视图,如下所示:

<View
    android:id="@+id/dummy"
    android:layout_width="1dp"
    android:layout_height="1dp"
    android:focusable="true"
    android:focusableInTouchMode="true" />
由于应用程序需要将焦点传递给下一个控件,因此它将传递给我们的不可见视图。

我是如何解决的

// xml file
<LinearLayout
...
android:id="@+id/linear_layout"
android:focusableInTouchMode="true"> // 1. make this focusableInTouchMode...
</LinearLayout>

// Activity file
private LinearLayout mLinearLayout; // 2. parent layout element
private Button mButton;

mLinearLayout = findViewById(R.id.linear_layout);
mButton = findViewById(R.id.button);

  mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mLinearLayout.requestFocus(); // 3. request focus

            }
        });
//xml文件
// 1. 将此焦点设置为触摸模式。。。
//活动文件
专用线路布局图;//2.父布局元素
私人按钮;
mLinearLayout=findviewbyd(R.id.linear\u布局);
mButton=findviewbyd(R.id.按钮);
mButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
mLinearLayout.requestFocus();//3.请求焦点
}
});

我希望这对您有所帮助:)

最上面的答案肯定有效,但会在我的用例中添加许多不必要的代码,其中有许多按钮,每一个按钮都需要一个setOnClickListener代码块来删除EditText中的焦点

相反,我的方法是编写一个BindingAdapter来执行焦点更改和预期的单击操作

绑定适配器

@BindingAdapter("onClickWithFocusChange")
fun View.setOnClickWithFocusChangeListener(clickListener: View.OnClickListener?) {
    clickListener?.also {
        setOnClickListener(OnClickWithFocusChangeListener(it))
    } ?: setOnClickListener(null)
}

class OnClickWithFocusChangeListener(
    private val clickListener: View.OnClickListener
) : View.OnClickListener {

    override fun onClick(v: View?) {
        v?.requestFocusFromTouch()
        clickListener.onClick(v)
        v?.clearFocus()
    }
}
在xml中(现在可以使用数据绑定,而不是以编程方式设置每个ClickListener):

最后是扩展函数:

fun Context.hideKeyboard(view: View) {
    val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
    inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
}

希望这能帮助一些人

如果您试图在notes应用程序中创建类似的按钮,只需执行以下操作:

note.setEnabled(false);
note.setEnabled(true);

这将生成一种类似于复选标记的按钮(隐藏键盘并移除光标)。

我无法导入WindowManager..?我建议将其添加到按钮侦听器方法:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT\u输入状态\u始终隐藏)但这不会移除键盘。当我的应用程序加载时,只要我用它来移除焦点,我刚才说的话就行了。。。WindowManager带有红色下划线,没有导入建议。代码现在可以工作,但不幸的是没有隐藏键盘。它仍然是重点。我不想在应用程序首次加载时删除焦点。我想在单击按钮后删除它。单击该按钮时调用该方法使用
m_Edittext.clearFocus()单击按钮时清除Edittext的焦点没有解决问题。那么你就永远不能专注于它;在这种情况下,您只需隐藏键盘,但光标仍将位于编辑文本处。此外,onFocusChangedListener将不会被调用。在尝试了许多方法之后,您的答案的底部部分解决了我遇到的问题。谢谢:)“虚拟视图…就在您的输入控件上方”。非常感谢。这是唯一一个对我有效的解决方案。我遇到了一个类似的问题,我最终得到了一个类似的解决方案,在我的情况下,我必须要求先关注隐藏视图,然后清除焦点,还有一件事在EditText布局上非常重要,别忘了android:imeOptions=“flagNoExtractUi”
因此,当您旋转手机时,不会提取编辑文本编辑屏幕。这对我有效,但上述公认的解决方案无效。我有多个edittext,我需要确保在单击按钮时失去焦点,因此在我的方法中,我清除所有edittext的焦点,然后在
fun Context.hideKeyboard(view: View) {
    val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
    inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
}
note.setEnabled(false);
note.setEnabled(true);