如何在自定义键盘可见时隐藏默认的Android键盘?

时间:2015-12-01 11:59:40

标签: android keyboard android-edittext custom-keyboard

我有一个Android应用,其活动包含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类。该类包含以下“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中单击哪里,光标仍然是第一个字符。

根据StackOverflow的其他一些建议,我尝试重写代码如下:

// 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用合理的值改变。

我现在很无能为力。我已尝试过其他地方建议的其他一些解决方案,但无法让它只显示具有正确光标处理的自定义键盘。

感谢任何帮助。

6 个答案:

答案 0 :(得分:0)

将此方法用于即时隐藏键盘

void hideSoftKeyboard(Activity activity) {
    InputMethodManager inputMethodManager = (InputMethodManager)  activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}

答案 1 :(得分:0)

经过大量的反复试验后,我发现了如何做到这一点。

早些时候,我曾在EditText的onTouch(...)处理程序中安装了键盘隐藏代码。无论出于何种原因,这都行不通。它仍然显示两个键盘(默认和自定义)。

我将该代码移至活动,如下所示:

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

答案 2 :(得分:0)

我遇到了同样的问题。解决方案是在onTouchEvent之后放置setInputType。

pkill Chrome

答案 3 :(得分:0)

如果您的目标api> = 21,则可以尝试

editText.setShowSoftInputOnFocus(false);

答案 4 :(得分:0)

这些代码可以在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
        }
    }
});

答案 5 :(得分:0)

如果您想永久隐藏默认键盘并使用自定义键盘:

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