我有一个带有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>
最好的问候
答案 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);
这会像按钮一样打勾(隐藏键盘并删除光标)。