简体   繁体   English

如何在输入法服务中制作AlertDialog视图?

[英]How to make AlertDialog view in Input method Service?

I would like to make an input method which is used only for SoftKeyboard. 我想制作一种仅用于SoftKeyboard的输入法。 My how to make popup onkey event in input method. 我如何在输入法中制作弹出onkey事件。

I am creating Dialog but here is problem you see my logcat: 我正在创建Dialog,但是这里的问题是您看到我的logcat:

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

Softkeyboard.java Softkeyboard.java

Here java code 这里的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();
        }

Thanks for advance.. 感谢前进。

You need to have ACTION_MANAGE_OVERLAY_PERMISSION permission to open/display Alert onkey event in input method. 您需要具有ACTION_MANAGE_OVERLAY_PERMISSION权限才能在输入法中打开/显示Alert onkey事件。

Before you set your custom Keyboard Check for Overlay Permission. 在设置自定义键盘之前,请检查“覆盖权限”。

 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;
        }
    }

Then inside your SoftKeyboard.java class, put code for alert dialog & set alert type of "TYPE_APPLICATION_OVERLAY". 然后,在您的SoftKeyboard.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();

Do not forget for Draw Overlay Permission. 不要忘记“绘制叠加层权限”。 Hope this helps you. 希望这对您有所帮助。 :) :)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM