如何在编辑文本之外轻轻一键隐藏键盘?

时间:2016-11-06 17:29:54

标签: android android-edittext keyboard

我想通过点击edittext外部来隐藏键盘。这是我的xml代码:

<RelativeLayout
android:clickable="true"
android:focusable="true"
android:focusableInTouchMode="true"
android:onClick="rl_main_onClick">
<RelativeLayout
  //Here there are some widgets including some edittext.
</RelativeLayout>

这是我的java代码(MainActivity):

public void rl_main_onClick(View view) {
    InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}

但我必须点击两次以隐藏键盘。第一次点按即可更改&#34; next&#34; (对于最后一个edittext,它已经完成了#34;)进入&#34;进入&#34;图标,然后第二次点击隐藏键盘。 这就是第一次点击时发生的事情:

What the first tap does.

现在我有两个问题:

  1. 如何通过一次点击来修复它并隐藏键盘?

  2. 是否可以为我的所有edittext(所有代码都有一个代码)执行此操作?

8 个答案:

答案 0 :(得分:9)

尝试将onClick替换为onTouch。为此,您需要更改布局属性,如下所示:

<RelativeLayout
    android:id="@+id/relativeLayout"
    android:clickable="true"
    android:focusable="true"
    android:focusableInTouchMode="true">

    <RelativeLayout>

        // widgets here

    </RelativeLayout>

</RelativeLayout>

然后删除rl_main_onClick(View view) {...}方法并在onTouch内插入onCreate()侦听器方法:

findViewById(R.id.relativeLayout).setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        return true;
    }
});

答案 1 :(得分:0)

我在下面的过程中使用。完美地为我工作。在活动类中添加以下函数。

    $arrEmpSupervisiorIDs = [];
    foreach ( $arrEmployeeDetails as $arrEmployeeDetail ) {
        $arrEmpSupervisiorIDs[$arrEmployeeDetail->employeeSupervisiorID][] = $arrEmployeeDetail;
    }

    $arrOrganizationChart = [];
    // Building Tree By admin user ID
    foreach ( $arrEmpSupervisiorIDs[$intAdminUserID] as $key => $objEmpSupervisiorID ) {
        $arrOrganizationChart[$intAdminUserID][$key] = (array) $objEmpSupervisiorID;
        $arrOrganizationChart[$intAdminUserID][$key]['childern'] = $arrEmpSupervisiorIDs[$objEmpSupervisiorID['userID']];
    }

您可以使用以下代码检查焦点状态。活动和片段

local print = print
local _ENV = {}

function test()
  print("Hello")
end

function setup()
  test()
end

setup()

return _ENV

答案 2 :(得分:0)

扩展名为Kotlin的版本

fun View.hideKeyboard() {
    val inputMethodManager = context!!.getSystemService(android.content.Context.INPUT_METHOD_SERVICE) as? InputMethodManager
    inputMethodManager?.hideSoftInputFromWindow(this.windowToken, 0)
}

然后从片段中这样称呼它

view.setOnClickListener {
    it.hideKeyboard()
}

或者像这样来自活动,contentView是我的根视图的ID

val contentView: View = findViewById(R.id.contentView)
    contentView.setOnClickListener {
    it.hideKeyboard()
}

答案 3 :(得分:0)

@Override public boolean dispatchTouchEvent(MotionEvent ev) { if (getCurrentFocus() != null) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); } return super.dispatchTouchEvent(ev); }

答案 4 :(得分:0)

而不是遍历所有视图或覆盖dispatchTouchEvent。

为什么不仅要覆盖Activity的onUserInteraction(),还可以确保每当用户在Editext之外点击时,键盘都会关闭。

即使在scrollView中包含编辑文本也可以使用。

@Override
public void onUserInteraction() {
    if (getCurrentFocus() != null) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    }
}

答案 5 :(得分:0)

不确定它是否会有所帮助,我做了类似的事情,但对于片段。它们位于 activity_main xml 中的容器(FrameLayouts)内。

首先我将其添加到父片段布局中:

android:id="@+id/fragment_layout"
android:clickable="true"
android:focusableInTouchMode="true"
android:focusable="true"

然后我声明并初始化布局:

ConstraintLayout constraintLayout;

在 onCreateView 中:

constraintLayout = ppm.findViewById(R.id.fragment_layout);
constraintLayout.setOnFocusChangeListener(onFocusChangeListener);

这里是 onFocusChangeListener:

View.OnFocusChangeListener onFocusChangeListener = new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {

        if (hasFocus) {
            InputMethodManager imm = (InputMethodManager) Objects.requireNonNull(Objects.requireNonNull(getContext()).getSystemService(Context.INPUT_METHOD_SERVICE));
            imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
        }

    }
};

答案 6 :(得分:0)

override fun onUserInteraction() {
    if (currentFocus != null) {
        val imm: InputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(currentFocus!!.windowToken, 0)

这有效,但当我按下键盘输入时,它也被隐藏了。

答案 7 :(得分:0)

完美运行且干净的解决方案:

override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
    currentFocus?.let {
        val imm: InputMethodManager = getSystemService(
            Context.INPUT_METHOD_SERVICE
        ) as (InputMethodManager)
        imm.hideSoftInputFromWindow(it.windowToken, 0)
    }
    return super.dispatchTouchEvent(ev)
}