android edittext单击按钮后删除焦点

问题描述 投票:17回答:8

我有一个带有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>

最好的祝福

android android-edittext
8个回答
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.

9
投票

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

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

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


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

7
投票

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

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

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

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


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

0
投票
mTextView.setEnabled(!mTextView.isEnabled());
mTextView.setEnabled(!mTextView.isEnabled());

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

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


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

            }
        });

我希望这可以帮助你 :)


-1
投票

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

edt_SearchDest.setEnabled(假);

© www.soinside.com 2019 - 2024. All rights reserved.