如何在自定义键盘可见时隐藏默认 Android 键盘?
How to hide default Android keyboard when custom keyboard is visible?
我有一个 Android 应用 Activity 包含如下所示的 TextView。
<EditText
android:id="@+id/textEdit1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="8dip"
android:paddingRight="8dip"
android:lines="4"
android:hint="My hint"
android:layout_gravity="center_horizontal|center_vertical"
android:gravity="left"
android:selectAllOnFocus="true"
android:textAppearance="?android:attr/textAppearanceSmall"/>
当用户在此 TextView 中单击(并且仅在此 TextView 中)时,我想显示一个自定义键盘。我阅读了优秀的文章 here 并使用了其中开发的 CustomKeyboard class。 class 包含以下 "hack" 以隐藏默认键盘并显示我们的自定义键盘。
// edittext is the TextView on which we want to show custom keyboard
// Rest of the code below from CustomKeyboard class
// Disable standard keyboard hard way
edittext.setOnTouchListener(new OnTouchListener() {
@Override public boolean onTouch(View v, MotionEvent event) {
EditText edittext = (EditText) v;
int inType = edittext.getInputType(); // Backup the input type
edittext.setInputType(InputType.TYPE_NULL); // Disable standard keyboard
edittext.onTouchEvent(event); // Call native handler
edittext.setInputType(inType); // Restore input type
return true; // Consume touch event
}
});
这显示自定义键盘,不显示默认键盘。然而,这有一个棘手的问题。它会导致光标停留在 TextView 中的第一个字符上。无论我在 TextView 中单击什么位置,光标仍然在第一个字符处。
根据 Whosebug 上的一些其他建议,我尝试重写代码如下:
// edittext is the TextView on which we want to show custom keyboard
edittext.setOnTouchListener(new OnTouchListener() {
@Override public boolean onTouch(View v, MotionEvent event) {
EditText edittext = (EditText) v;
int inType = edittext.getInputType(); // Backup the input type
edittext.setInputType(InputType.TYPE_NULL); // Disable standard keyboard
edittext.onTouchEvent(event); // Call native handler
float x = event.getX();
float y = event.getY();
int touchPosition = edittext.getOffsetForPosition(x, y);
if (touchPosition>0){
edittext.setSelection(touchPosition);
}
edittext.setInputType(inType); // Restore input type
return true; // Consume touch event
}
});
这没有任何效果。当我记录 touchPosition 变量的值时,它始终显示 -1,但我确实看到 x 和 y 以合理的值变化。
我现在一头雾水。我已经尝试了其他地方建议的其他几种解决方案,但无法让它仅显示具有正确光标处理的自定义键盘。
非常感谢任何帮助。
使用此方法即时隐藏键盘
void hideSoftKeyboard(Activity activity) {
InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
经过大量的反复试验,我找到了如何做到这一点。
早些时候,我将键盘隐藏代码放置在 EditText 的 onTouch(...) 处理程序中。无论出于何种原因,这都行不通。它仍然显示两个键盘(默认和自定义)。
我将该代码移至 activity,如下所示:
private OnTouchListener m_onTouchListenerEditText = new OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
if (v != m_myEditText)
{
// This is the function which hides the custom keyboard by hiding the keyboard view in the custom keyboard class (download link for this class is in the original question)
m_customKeyboard.hideCustomKeyboard();
((EditText) v).onTouchEvent(event);
}
return true;
}
};
private void hideDefaultKeyboard()
{
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
我遇到了同样的问题。解决方法是把setInputType放在onTouchEvent之后。
EditText edittext = (EditText) v;
int inType = edittext.getInputType(); // Backup the input type
edittext.setInputType(InputType.TYPE_NULL); // Disable standard keyboard
edittext.onTouchEvent(event); // Call native handler
edittext.setInputType(inType); // Restore input type
float x = event.getX();
float y = event.getY();
int touchPosition = edittext.getOffsetForPosition(x, y);
if (touchPosition > 0){
edittext.setSelection(touchPosition);
}
return true; // Consume touch event
如果你的目标api >= 21,你可以试试
editText.setShowSoftInputOnFocus(false);
这些代码在 LOLLIPOP (v21) 或更高版本中完美运行:
edittext.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
EditText editText = (EditText) v;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
editText.setShowSoftInputOnFocus(false); // disable android keyboard
return false;
} else {
// IMPORTANT NOTE : EditText touching disorder
int inType = editText.getInputType(); // backup the input type
editText.setInputType(InputType.TYPE_NULL); // disable soft input
editText.onTouchEvent(event); // call native handler
editText.setInputType(inType); // restore input type
return true; // Consume touch event
}
}
});
如果您想永久隐藏默认键盘并使用自定义键盘:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.fragment_payment)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
editText.showSoftInputOnFocus = false
}
}
我有一个 Android 应用 Activity 包含如下所示的 TextView。
<EditText
android:id="@+id/textEdit1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="8dip"
android:paddingRight="8dip"
android:lines="4"
android:hint="My hint"
android:layout_gravity="center_horizontal|center_vertical"
android:gravity="left"
android:selectAllOnFocus="true"
android:textAppearance="?android:attr/textAppearanceSmall"/>
当用户在此 TextView 中单击(并且仅在此 TextView 中)时,我想显示一个自定义键盘。我阅读了优秀的文章 here 并使用了其中开发的 CustomKeyboard class。 class 包含以下 "hack" 以隐藏默认键盘并显示我们的自定义键盘。
// edittext is the TextView on which we want to show custom keyboard
// Rest of the code below from CustomKeyboard class
// Disable standard keyboard hard way
edittext.setOnTouchListener(new OnTouchListener() {
@Override public boolean onTouch(View v, MotionEvent event) {
EditText edittext = (EditText) v;
int inType = edittext.getInputType(); // Backup the input type
edittext.setInputType(InputType.TYPE_NULL); // Disable standard keyboard
edittext.onTouchEvent(event); // Call native handler
edittext.setInputType(inType); // Restore input type
return true; // Consume touch event
}
});
这显示自定义键盘,不显示默认键盘。然而,这有一个棘手的问题。它会导致光标停留在 TextView 中的第一个字符上。无论我在 TextView 中单击什么位置,光标仍然在第一个字符处。
根据 Whosebug 上的一些其他建议,我尝试重写代码如下:
// edittext is the TextView on which we want to show custom keyboard
edittext.setOnTouchListener(new OnTouchListener() {
@Override public boolean onTouch(View v, MotionEvent event) {
EditText edittext = (EditText) v;
int inType = edittext.getInputType(); // Backup the input type
edittext.setInputType(InputType.TYPE_NULL); // Disable standard keyboard
edittext.onTouchEvent(event); // Call native handler
float x = event.getX();
float y = event.getY();
int touchPosition = edittext.getOffsetForPosition(x, y);
if (touchPosition>0){
edittext.setSelection(touchPosition);
}
edittext.setInputType(inType); // Restore input type
return true; // Consume touch event
}
});
这没有任何效果。当我记录 touchPosition 变量的值时,它始终显示 -1,但我确实看到 x 和 y 以合理的值变化。
我现在一头雾水。我已经尝试了其他地方建议的其他几种解决方案,但无法让它仅显示具有正确光标处理的自定义键盘。
非常感谢任何帮助。
使用此方法即时隐藏键盘
void hideSoftKeyboard(Activity activity) {
InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
经过大量的反复试验,我找到了如何做到这一点。
早些时候,我将键盘隐藏代码放置在 EditText 的 onTouch(...) 处理程序中。无论出于何种原因,这都行不通。它仍然显示两个键盘(默认和自定义)。
我将该代码移至 activity,如下所示:
private OnTouchListener m_onTouchListenerEditText = new OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
if (v != m_myEditText)
{
// This is the function which hides the custom keyboard by hiding the keyboard view in the custom keyboard class (download link for this class is in the original question)
m_customKeyboard.hideCustomKeyboard();
((EditText) v).onTouchEvent(event);
}
return true;
}
};
private void hideDefaultKeyboard()
{
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
我遇到了同样的问题。解决方法是把setInputType放在onTouchEvent之后。
EditText edittext = (EditText) v;
int inType = edittext.getInputType(); // Backup the input type
edittext.setInputType(InputType.TYPE_NULL); // Disable standard keyboard
edittext.onTouchEvent(event); // Call native handler
edittext.setInputType(inType); // Restore input type
float x = event.getX();
float y = event.getY();
int touchPosition = edittext.getOffsetForPosition(x, y);
if (touchPosition > 0){
edittext.setSelection(touchPosition);
}
return true; // Consume touch event
如果你的目标api >= 21,你可以试试
editText.setShowSoftInputOnFocus(false);
这些代码在 LOLLIPOP (v21) 或更高版本中完美运行:
edittext.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
EditText editText = (EditText) v;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
editText.setShowSoftInputOnFocus(false); // disable android keyboard
return false;
} else {
// IMPORTANT NOTE : EditText touching disorder
int inType = editText.getInputType(); // backup the input type
editText.setInputType(InputType.TYPE_NULL); // disable soft input
editText.onTouchEvent(event); // call native handler
editText.setInputType(inType); // restore input type
return true; // Consume touch event
}
}
});
如果您想永久隐藏默认键盘并使用自定义键盘:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.fragment_payment)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
editText.showSoftInputOnFocus = false
}
}