【问题标题】:Android IME: showing a custom pop-up dialog (like Swype keyboard) which can enter text into the TextViewAndroid IME:显示一个自定义弹出对话框(如 Swype 键盘),可以在 TextView 中输入文本
【发布时间】:2011-03-31 16:10:07
【问题描述】:

我想知道如何创建一个自定义弹出窗口,如下面的屏幕截图中的那个(借自 Swype 键盘),其中我可以有几个按钮,每个按钮都将一个字符串提交给当前“已连接” “TextView(通过InputConnection)。

请注意:这是InputMethodService,而不是普通的Activity。我已经尝试使用Theme:Dialog 启动单独的Activity。但是,一旦打开,我就失去了对TextView 的关注,并且我的键盘消失了(我的InputConnection 也随之消失了)。

【问题讨论】:

    标签: android keyboard ime android-input-method


    【解决方案1】:

    您可以尝试使用PopupWindow。你必须做一些黑客攻击才能让它做你想做的事情,唯一好的文档就是源代码。

    【讨论】:

    • 酷。感谢您的提示。我已经在浏览 Android 的键盘源代码了,所以我已经习惯了 :-)
    • @znq,你真的做到了吗?你最终是使用PopupWindow 还是别的什么?能否指点一下?
    • 在您的 KeyboardView 子类中创建 PopupWindow 至关重要,而不是在 InputMethodService 或其他任何地方。如果您希望它显示在键盘上方,请使用负 Y 位置。
    • 我想通了;您只需要在使用弹出窗口之前调用 PopupWindow.setClippingEnabled(false),否则您的负 Y 坐标将不起作用。添加为下面的答案。
    【解决方案2】:

    愿那些遵循指导的人平安,

    解决方案:

    AlertDialog dialog;
    
    //add this to your code
    dialog = builder.create();
    Window window = dialog.getWindow(); 
    
    WindowManager.LayoutParams lp = window.getAttributes();
    lp.token = mInputView.getWindowToken();
    lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
    
    window.setAttributes(lp);
    window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    //end addons
    
    dialog.show();
    

    ===== 更新 30.09.2015 mInputView 它是你的键盘类的通用名称..see

    @Override
        public View onCreateInputView() {
            mInputView =(MyKeyboardView) getLayoutInflater().inflate( R.layout.input, null);
    ....
    }
    

    更多信息:http://developer.android.com/guide/topics/text/creating-input-method.html

    祝你好运。

    【讨论】:

      【解决方案3】:

      我也在努力解决这个问题,我终于弄明白了。上述解决方案是正确的,尽管正如您指出的那样,它们不能从 InputMethodService 中使用,因为它不是 Activity。诀窍是在 KeyboardView 的子类中创建 PopupWindow。通过使用负 Y 位置,PopupWindow 可以像 Swype 一样出现在键盘上方。

      祝你好运, 巴里

      【讨论】:

        【解决方案4】:

        正确答案:

        1. 创建一个PopupWindow 并将您的视图放入其中
        2. 致电popupWindow.setClippingEnabled(false)
        3. 使用负 Y 坐标调用 [popupWindow.showAtLocation()](http://developer.android.com/reference/android/widget/PopupWindow.html#showAtLocation(android.view.View, int, int, int))。

        这将在 IME 上方显示您的弹出窗口,如您的屏幕截图所示。

        【讨论】:

        • 在 Android P 中不工作,即使 Y 坐标为负。除非,我们将窗口布局类型设置为 TYPE_APPLICATION_OVERLAY,这需要 SYSTEM_ALERT 权限。
        • @elsennov 我有一个应用程序正在执行此操作。我的手机在 Android P 上,这对我有用:github.com/walles/exactype/blob/…
        • 对不起,之前没有提到。我的意思是,不是所有的 android P。我在我的设备三星 S9 上测试过,它可以工作。但是当我在模拟器(谷歌像素,android P)上测试它时它不起作用@JohanWalles
        • 我只在S9上测试过,没有在模拟器上测试过。如果它在那里不起作用,那么我不知道,对不起。
        猜你喜欢
        • 2011-03-30
        • 2012-10-21
        • 2012-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-15
        相关资源
        最近更新 更多