当前位置: 首页 > 知识库问答 >
问题:

从EditText禁用软键盘,但仍允许复制/粘贴?

公孙和怡
2023-03-14

嗨,我正在制作自定义拨号器,因此我创建了自己的输入板。

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

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

我还尝试通过编程禁用inputType,这将禁用所有三个命令:

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

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

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

有解决办法吗?谢谢

共有3个答案

微生欣怡
2023-03-14

由于当前的热门答案使用了已弃用的方法,并且对我来说没有粘贴方法,因此这里有另一种不使用旧方法的方法。但是,它确实尝试通过反射和回退使用隐藏方法。=)

我将EditText分为一个名为keyboardlesseditext的新小部件,它仍然保留了所有很酷的编辑功能,而没有显示键盘。把文件放进去就行了。

对于这篇文章来说,完整的代码有点长,但只要GitHub不宕机,那么这就可以工作:https://github.com/danialgoodwin/android-widget-keyboardless-edittext/blob/master/KeyboardlessEditText2.java

羊光辉
2023-03-14

要禁用软键盘显示,保留复制/粘贴和光标功能,只需在您的活动中添加以下行:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
    WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
车胤运
2023-03-14

经过数小时的研究,我终于找到了一个适用于所有API版本的解决方案。希望这能节省别人的时间。

如果您正在为API开发

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

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

2) 按程序执行以下操作

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

你完了。

如果你想迎合API

解决这个问题的一个丑陋的方法就是。。

首先,在EditText的xml文件中添加此属性

android:editable="false"

是的,这是不推荐的,但对于使EditText在API版本中不可编辑是必需的

接下来,我们需要在键盘出现时立即隐藏它,这样我们就可以继续选择文本而不会被键盘挡住去路。

使用下面的代码检测键盘显示(从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);
            }
            }
         }
        });
}

这对我的案子有效。虽然你可以在一瞬间看到键盘的出现(这是最难看的部分),但我想不出任何其他方法来让它在写作时发挥作用。如果你有更好的解决方案,请留言!

如果这能节省某人的时间,也请告诉我:)

 类似资料:
  • 我正在为用户编写一个选择国家的过程。我有一个edittext链接到适配器,显示所有可用选项。 在我的清单中,我将活动设置为 android: windowSoftInputMode="stateAlwaysHidden" 我需要完全禁用软键盘。 除了一种情况外,它工作正常。如果用户长时间点击/按下编辑文本,键盘就会弹出。 有没有办法通过使用代码或在清单中永久禁用特定活动中的键盘? 我的代码: 我的

  • 我有带有edittext字段的自定义模板。当我点击软键盘上的“下一步”按钮时,它只移动了两次焦点--比按钮变成了“确定”。清单有12项。有没有办法导航到所有的项目,而不仅仅是2?你能帮帮我吗? 公共视图getView(int position,View convertView,ViewGroup parent){ }

  • 问题内容: 有人知道键盘快捷键可以将行复制/粘贴到中的新行中,而不必突出显示整个行吗? - - 原来我的整个屏幕倒挂(我在Windows上)。有趣的是,这是在windows-> preferences中指定的。 问题答案: - - :拷贝当前行或选择线,以下面 - - ::拷贝当前行或所选择的线以上 - - :带来了快捷键列表 请参阅Windows /首选项->常规->键。

  • 问题内容: 我汇总了一个简单的测试项目,该项目显示了一个包含EditText的PopupWindow(在Android 2.2上)。如我所料,当我点击EditText时,将显示软键盘。但是,软键盘覆盖了EditText,因此无法平移屏幕以使EditText保持应有的状态。我的代码: TestAdjustPanActivity.java: main.xml: popup.xml: …并且我的Andr

  • 为了简化JavaFx应用程序的使用,我希望允许用户定义一个键盘组合/快捷键来触发应用程序最重要的操作。 我知道如何在代码中定义并将其设置为或在KeyEvent侦听器中使用它,但我希望允许用户只需在键盘上的某个设置对话框中按下它,就可以定义自己的KeyCodeCombination。 基本上沿着这个伪代码:

  • 问题内容: 是否可以使用键盘扩展名将文本/图像复制到UIPasteboard?类似于popkey.co对动画图像所做的操作。 我测试了以下代码,但似乎无法正常工作。 它总是显示此错误消息: UIPasteboard-无法启动粘贴纸板。确保已将其安装在UIKit.framework / Support中 您是否知道通过键盘扩展名使用复制粘贴的其他方法? 问题答案: 如果我在“设置”->“常规”->“