我想通过点击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;图标,然后第二次点击隐藏键盘。 这就是第一次点击时发生的事情:
现在我有两个问题:
如何通过一次点击来修复它并隐藏键盘?
是否可以为我的所有edittext(所有代码都有一个代码)执行此操作?
答案 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)
}