我有一个带有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>
最好的祝福
把它放在你的按钮监听器中:
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.
我在onClick按钮代码中成功使用了以下内容:
editText.setEnabled(false);
editText.setEnabled(true);
比其他方法复杂得多......
一个解决方法是创建一个假视图,将焦点转移到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);
}
我能找到的最优雅的解决方案是:
您可以在实用程序类中保存此方法:
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();
由于应用程序需要将焦点传递给下一个控件,因此它将传递给我们的隐形视图。
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
mTextView.setEnabled(!mTextView.isEnabled());
mTextView.setEnabled(!mTextView.isEnabled());
很抱歉答案很晚,但我希望这是正确的答案,因为我使用它来修复它
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);
在按钮单击上写下以下代码段。
我是怎么解决的。
// 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
}
});
我希望这可以帮助你 :)
为什么不禁用Button代码中的EditText?这应该摆脱键盘和焦点。
edt_SearchDest.setEnabled(假);