【问题标题】:Android IME: how to show a pop-up dialog?Android IME:如何显示弹出对话框?
【发布时间】:2011-03-30 11:57:15
【问题描述】:

我正在玩一些键盘开发,并尝试在按下某个键时显示一个弹出对话框

if (primaryCode == -301) {
            AlertDialog mDialog = new AlertDialog.Builder(CONTEXT)
            .setTitle("My dialog")
            .setMessage("Lets do it.")
            .setPositiveButton("ok", null).create();
             mDialog.show();
}

但是,问题出在CONTEXT 部分。在普通应用程序中,它只是this。我也尝试了getApplicationContext()getBaseContext(),但这些都不起作用-> 键盘崩溃。

android.view.WindowManager$BadTokenException: 无法添加窗口 - 令牌 null 是 不是为了申请

所以我想知道我是否必须对 InputConnection 做点什么:

InputConnection 接口是 从一个沟通渠道 InputMethod 返回应用程序 那就是接收它的输入。它是 用于执行诸如阅读之类的事情 光标周围的文本,提交 文本到文本框,并发送原始 应用程序的关键事件。

到目前为止,我无法弄清楚如何。我绝对知道这是可能的,因为我以前见过。我有人可以为我指出正确的方向,这肯定会受到赞赏。


更新:

为了更好地了解我尝试实现的目标,我上传了 Swype 键盘的屏幕截图,它的作用正是:当键盘上的特殊键被按下时会显示一个弹出对话框。

【问题讨论】:

    标签: android keyboard ime


    【解决方案1】:

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

    解决方案:

    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
    alert.show();
    

    祝你好运。

    【讨论】:

    • 如果软键盘打开并尝试打开警告对话框,警告对话框下的软键盘显示不允许在警告对话框的edittext中添加文本
    • 首先谢谢您!出于某种原因,有时在我按下肯定按钮后,会调用 onFinishInputView。你知道为什么吗?
    • 它不再适合我了。谁能帮我从 ime 服务打开对话框? @AmitKlein
    【解决方案2】:

    IME 不在应用程序上下文中运行,因此您不能使用正常的应用程序窗口。您可以使用 Dialog,但您需要修改它的窗口,以便窗口类型为这种类型:

    http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#TYPE_APPLICATION_PANEL

    并将 WindowManager.LayoutParams.token 设置为 IME 窗口的令牌(通过 View.getWindowToken())。

    请注意,对话框将无法显示弹出窗口,因为在这种情况下,它本身实际上是一个弹出窗口。除非您使用窗口标志来更改它,否则坐标空间将相对于您的 IME。

    【讨论】:

    • 感谢您为我指明正确的方向。此外,查看 Android 的默认键盘源代码回答了我所有的问题。
    • @hackbod 我已经尝试过你的建议,但它不适用于 Android 9。你能看看stackoverflow.com/questions/51906586/…吗?
    【解决方案3】:

    创建一个活动并在清单文件中为该活动指定属性

    android:theme="@android:style/Theme.Dialog"
    

    【讨论】:

      【解决方案4】:

      您必须获得对您​​的活动上下文的引用。 无论如何,你应该使用Activity的showDialog方法。

      【讨论】:

      • 两个问题:1)我正在开发一个 IME(键盘),因此它不是我的活动 2)我如何获得对当前活动的引用? (这实际上是我上面的问题)
      • 有一点是肯定的,你不能从 ApplicationContext 显示任何对话框。为什么不在视图的构造函数中获取上下文引用?
      • 因为它是与其他(不是我的)应用程序的任何文本输入字段对话的键盘服务:developer.android.com/reference/android/view/inputmethod/…
      • @znq 你能帮我从 ime 服务打开对话框吗?
      【解决方案5】:

      非常简单,只需像这里一样创建活动(没有任何视图),在其中编写对话框代码

      public class dialog extends Activity {
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
      
          AlertDialog.Builder builder = new AlertDialog.Builder(this);
          builder.setMessage("Are you sure you want to Delete All Contacts?");
          builder.setCancelable(false);
      
          builder.setPositiveButton("Yes",
                          new DialogInterface.OnClickListener() {
                              public void onClick(DialogInterface dialog, int id) {
                                  //deleteAllContacts();
                              }//
                          });
      
                  builder.setNegativeButton("No",
                          new DialogInterface.OnClickListener() {
                              public void onClick(DialogInterface dialog, int id) {
                                  dialog.cancel();
                              }
                          });
      
          AlertDialog alert = builder.create();
          alert.show();
      
      }
      }
      

      现在转到 Android 清单文件并添加类似的活动,

      <activity android:name=".dialog" android:theme="@android:style/Theme.NoDisplay">        </activity>
      

      一切尽在掌握

      【讨论】:

        【解决方案6】:
        // 1. CREATE THE DIALOG
        val builder: AlertDialog.Builder = AlertDialog.Builder(this, R.style.Theme_AppCompat_Light)
        builder.setTitle("Title").setMessage("This is the message for the user. ")
        val mDialog = builder.create()
        
        // 2. SET THE IME WINDOW TOKEN ATTRIBUTE WITH THE TOKEN OF THE KEYBOARD VIEW 
        mDialog.window?.attributes?.token = this.mTblView.windowToken
        
        // 3. SET THE TYPE OF THE DIALOG TO TYPE_APPLICATION_ATTACHED_DIALOG
        mDialog.window?.setType(WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG)
        
        // 4. SHOW THE DIALOG 
        mDialog.show()
        

        【讨论】:

          猜你喜欢
          • 2011-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-31
          • 1970-01-01
          • 2021-11-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多