从EditText上禁用软键盘,但仍然允许复制/粘贴?(Disable soft-keyboard

2019-07-20 19:52发布

嗨,我是做定制的拨号程序 ,所以我创造我自己的输入垫。

问题是我如何禁用的EditText,但仍允许剪切/复制/粘贴? 股票拨号器可以做到这一点。

我曾尝试android:focusable="false" ,但它禁用剪切/复制(仍然可以粘贴虽然)。

我也试图禁用inputType编程它禁用所有三个命令:

myEditText.setInputType(InputType.TYPE_NULL); //Can't cut/copy/paste

从清单禁用它也不起作用:

android:configChanges="orientation|keyboardHidden" //Keyboard still popped up

任何解决方案? 谢谢

Answer 1:

经过几个小时和研究时间,我终于发现,所有版本的API有效的解决方案。 希望这样可以节省别人的时间。

如果您是API开发> = 11,解决方法很简单,无论是:

1)添加下面的两个属性中的EditText的xml文件

android:inputType="none"
android:textIsSelectable="true"

要么

2)通过编程执行如下

myEditText.setInputType(InputType.TYPE_NULL);
myEditText.setTextIsSelectable(true);

就大功告成了。

如果要满足API <11为好,我发现,有没有办法从弹出,如果你想选择复制粘贴目的的字符串禁用键盘。 可调焦设置为false将禁用键盘,但它并没有帮助,因为它禁止你的选择文本太能力。 任何其他解决方案,我发现计算器所有要么不工作或在同一时间禁用文本选择了。

一种丑陋的方式来解决,这是因为这样的..

首先,在EditText上的xml文件添加该属性

android:editable="false"

是的,这是过时了,但必要使EditText上的API版本<11不可编辑。

下一步,我们将需要尽快隐藏键盘,因为它显示出来,这样我们就能够继续进行键盘挡住了路选择文本。

使用低于该代码来检测键盘显示出来(从获得的溶液https://stackoverflow.com/a/9108219/1241783 ),并立即将其隐藏。

if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB)
{
    final View activityRootView = findViewById(R.id.activityRoot);
    activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
        public void onGlobalLayout() {
            Rect r = new Rect();
            //r will be populated with the coordinates of your view that area still visible.
            activityRootView.getWindowVisibleDisplayFrame(r);

            int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
            if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...

            //Hide the keyboard instantly!
            if (getCurrentFocus() != null) 
            {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
            }
            }
         }
        });
}

它适用于我的情况。 虽然你可以看到键盘上显示的是一秒钟(这是丑陋的部分),但我想不出任何其他方式得到这个在写作的时候工作。 如果你有更好的解决方案,请发表评论!

让我也知道,如果这样可以节省别人的时间:)



Answer 2:

要禁用软键盘显示,保持复制/粘贴和光标的功能,只需添加这条线在你的活动:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
    WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);


Answer 3:

由于目前最顶级的答案使用过时的方法,并没有粘贴方法对我来说,这里不使用老方法的另一种方式。 但是,它并尝试通过反射使用隐藏的方法有后备。 =)

我子类EditText到一个名为新的widget KeyboardlessEditText仍然保留了所有的酷编辑功能没有键盘的表现。 刚落,在文件中去。

完整的代码是这个帖子有点长,但只要GitHub上不下去,那么这将工作: https://github.com/danialgoodwin/android-widget-keyboardless-edittext/blob/master/KeyboardlessEditText2的.java



Answer 4:

要禁用系统键盘自动弹出EditTextTextView执行以下操作:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    editTextView.setShowSoftInputOnFocus(false);
} else {
    editTextView.setTextIsSelectable(true);
    //N.B. Accepting the case when non editable text will be selectable
}


Answer 5:

试试这个

 EditText et = ... // your EditText

et.setKeyListener(null) //makes the EditText non-editable so, it acts like a TextView.

无需子类。 这,使您的EditText不可聚焦之间的主要区别,在于EditText上仍然有它自己的光标 - 你可以选择文本等,所有它的作用是抑制从弹出了自己的软键盘输入法。



文章来源: Disable soft-keyboard from EditText but still allow copy/paste?