代码之家  ›  专栏  ›  技术社区  ›  Sonu Kumar

如何在输入法服务中创建AlertDialog视图?

  •  2
  • Sonu Kumar  · 技术社区  · 10 年前

    我想做一个只用于软键盘的输入法。我如何在输入法中弹出按键事件。

    我正在创建Dialog,但有一个问题,您可以看到我的日志:

    09-14 11:16:54.349: E/MessageQueue-JNI(7172):   at android.inputmethodservice.KeyboardView.detectAndSendKey(KeyboardView.java:824)
    

    软键盘.java

    这里是java代码

    public void onKey(int primaryCode, int[] keyCodes) {
            if (primaryCode == -2) {
    
                // 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
                builder.show();
            }
    

    谢谢你提前。。

    1 回复  |  直到 10 年前
        1
  •  2
  •   Bhoomika Patel Isira Adithya    7 年前

    你需要 操作管理覆盖权限 在输入方法中打开/显示Alert onkey事件的权限。

    在设置自定义键盘覆盖权限之前。

     final boolean overlayEnabled = Settings.canDrawOverlays(MainActivity.this);
    
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !overlayEnabled) {
       openOverlaySettings();
     }
    
    
    
     @TargetApi(Build.VERSION_CODES.M)
        private void openOverlaySettings() {
            final Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:" + getPackageName()));
            try {
                startActivityForResult(intent, RC_OVERLAY);
            } catch (ActivityNotFoundException e) {
                Log.e("MainActivity", e.getMessage());
            }
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            switch (requestCode) {
                case RC_OVERLAY:
                    final boolean overlayEnabled = Settings.canDrawOverlays(this);
                    if (overlayEnabled) {
                        preferenceManager.setBooleanPref(IS_CYBER_BULLING_ON, true);
                        Intent intent = new Intent(MainActivity.this, ImePreferences.class);
                        startActivity(intent);
                        overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
                    } else {
    //                    switchCyberBulling.setChecked(false);
                    }
                    // Do something...
                    break;
            }
        }
    

    然后在你的 软键盘.java 类,放置警报对话框的代码&将警报类型设置为“type_APPLICATION_OVERLAY”。

    AlertDialog.Builder builder = new AlertDialog.Builder(this)
                        //set icon
                        .setIcon(android.R.drawable.ic_dialog_alert)
    
                        //set title
                        .setTitle("Warning!")
                        //set message
                        .setMessage("This is alert dialog!")
                        //set positive button
                        .setPositiveButton("Okay", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                //set what would happen when positive button is clicked
                                dialogInterface.dismiss();
                            }
                        })
                        //set negative button
                        .setNegativeButton("Dismiss", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                //set what should happen when negative button is clicked
                                dialogInterface.dismiss();
                            }
                        });
                AlertDialog alertDialog = builder.create();
    
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
                }else{
                    alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
                }
                alertDialog.show();
    

    不要忘记“绘制覆盖权限”。希望这对您有所帮助。:)

    推荐文章