24

我有一个带有 EditText 和 Button 的 Activity。当用户单击 EditText 时,会显示键盘,他可以输入一些文本 - 很好。但是当用户单击按钮时,我希望 EditText 不再成为焦点,即键盘隐藏直到用户再次单击 EditText。

单击按钮后,我该怎么做才能“隐藏 EditText 的焦点”。我可以在按钮的 OnClick 方法中添加一些代码来做到这一点?

编辑:

<LinearLayout 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <EditText 
        android:id="@+id/edt_SearchDest"
        android:layout_width="0dip"
        android:layout_height="wrap_content"
        android:layout_weight="0.8"
        android:textSize="18sp"
        android:hint="Enter your look-up here.." />

    <Button
        android:id="@+id/btn_SearchDest"
        android:layout_width="0dip"
        android:layout_height="wrap_content"
        android:layout_weight="0.2"
        android:text="Search" />

</LinearLayout>

此致

4

12 回答 12

45

把它放在你的按钮监听器中:

InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 

inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);

编辑

如果没有EditText重点,上面的解决方案将破坏您的应用程序。像这样修改你的代码:

将此方法添加到您的课程中:

public static void hideSoftKeyboard (Activity activity, View view) 
{
    InputMethodManager imm = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getApplicationWindowToken(), 0);
}

然后,在您的按钮侦听器中,调用如下方法:

hideSoftKeyboard(MainActivity.this, v); // MainActivity is the name of the class and v is the View parameter used in the button listener method onClick.
于 2013-08-24T05:25:08.860 回答
15

一种解决方法是创建一个假视图以将焦点转移到您clearFocusedittext:

<EditText
        android:id="@+id/edt_thief"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:focusable="true"
        android:focusableInTouchMode="true"

请注意,此视图是不可见的,因此它不需要布局中的任何空间。

在控件类中,您可以添加如下方法来触发此焦点转移:

public void clearFocus(){
        yourEdittext.clearFocus();
        edtThief.requestFocus();
    }

然后,您可以在edtThief获得焦点后最小化键盘:

 public static void hideKeyboard(final View view) {
    InputMethodManager imm = (InputMethodManager) view.getContext()
            .getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
于 2016-03-10T02:45:21.383 回答
11

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

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

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

于 2013-11-10T13:15:33.037 回答
8

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

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

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

然后,在调用焦点隐藏方法的地方写下这行代码:

 theTextView.clearFocus();

由于应用程序需要将焦点传递给下一个控件,因此它将传递给我们的不可见视图。

于 2017-03-03T17:21:21.137 回答
1

我是如何解决的。

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

            }
        });

我希望这可以帮助你 :)

于 2019-07-28T09:23:34.500 回答
1

最佳答案肯定有效,但会在我的用例中添加很多不必要的代码,其中有很多按钮,每个按钮都需要一个 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):

<!-- parentview of the EditText -->
<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:focusable="true"
    android:focusableInTouchMode="true">

    <ImageButton
    ...
    onClickWithFocusChange="@{() -> viewModel.buttonClicked()}"
    ... />

在活动/片段中:

editText.setOnFocusChangeListener { v, hasFocus ->
    if (!hasFocus) {
        requireContext().hideKeyboard(v)
        v.clearFocus()
    }
}

最后是扩展功能:

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

希望这对某人有所帮助!

于 2020-06-23T01:15:35.350 回答
0
private void hideDefaultKeyboard() {
    activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);//u have got lot of methods here
}

编辑:

LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
于 2013-08-24T04:13:04.637 回答
0
mTextView.setEnabled(!mTextView.isEnabled());
mTextView.setEnabled(!mTextView.isEnabled());
于 2014-07-29T14:07:42.023 回答
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);

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

于 2017-01-31T08:08:30.613 回答
0
<LinearLayout 
    android:id="@+id/parent"
    android:focusableInTouchMode="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <EditText 
        android:id="@+id/edt"
        android:layout_width="0dip"
        android:layout_height="wrap_content"
        android:layout_weight="0.8"
        android:textSize="18sp"
        android:hint="Enter your look-up here.." />

    <Button
        android:id="@+id/btn"
        android:layout_width="0dip"
        android:layout_height="wrap_content"
        android:layout_weight="0.2"
        android:text="Search" />

</LinearLayout>
  1. 设置android:focusableInTouchMode="true"为父布局。
  2. 在按钮上单击将焦点转移到父级。
    binding.btn.setOnClickListener {
            binding.parent.requestFocus()
            // your stuff here
        }
于 2021-12-15T09:13:11.667 回答
-1

为什么不直接在 Button 代码中禁用 EditText?那应该摆脱键盘和焦点。

edt_SearchDest.setEnabled(false);

于 2013-08-29T03:26:53.580 回答
-1

如果您尝试在笔记应用程序中创建按钮,只需执行以下操作:

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

这将制作一种类似按钮的复选标记(隐藏键盘并删除光标)。

于 2020-06-25T00:14:00.457 回答