android edittext单击按钮后删除焦点

时间:2013-08-24 04:02:58

标签: android android-edittext

我有一个带有EditText和Button的Activity。 当用户点击EditText时,会显示键盘,他可以输入一些Text - fine。 但是当用户点击按钮时,我希望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>

最好的问候

11 个答案:

答案 0 :(得分:40)

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

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.

答案 1 :(得分:9)

一种解决方法是创建虚假视图,将焦点转移到clearFocus中的edittext

<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);
}

答案 2 :(得分:8)

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

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

比其他方法复杂得多......

答案 3 :(得分:5)

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

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

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();

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

答案 4 :(得分: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

答案 5 :(得分:0)

mTextView.setEnabled(!mTextView.isEnabled());
mTextView.setEnabled(!mTextView.isEnabled());

答案 6 :(得分: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);

在点击按钮时写下以下代码段。

答案 7 :(得分:0)

我是怎么解决的

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

            }
        });

希望对您有所帮助:)

答案 8 :(得分:0)

最佳答案肯定有效,但在我的用例中会添加很多不必要的代码,因为那里有许多按钮,每个按钮都需要一个setOnClickListener代码块才能将焦点从EditText移开。

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

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中(现在可以使用数据绑定,而不是通过编程方式设置每个点击侦听器):

<!-- 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)
}

希望这对您有所帮助!

答案 9 :(得分:-1)

为什么不禁用Button代码中的EditText?这应该摆脱键盘和焦点。

edt_SearchDest.setEnabled(假);

答案 10 :(得分:-1)

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

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

这会像按钮一样打勾(隐藏键盘并删除光标)。