Java 如何修复您需要在Android上的对话框中使用Theme.AppCompat主题的问题

Java 如何修复您需要在Android上的对话框中使用Theme.AppCompat主题的问题,java,android,android-service,android-dialog,Java,Android,Android Service,Android Dialog,在我的应用程序中,我想使用dialog进入服务,为此,我编写了下面的代码,但在我单击按钮显示dialog之后,我得到了一个强制关闭错误 我的服务代码: public class FloatingLayoutService extends Service implements StepperFormListener { @Override public int onStartCommand(Intent intent, int flags, int startId) {

在我的应用程序中,我想使用dialog进入服务,为此,我编写了下面的代码,但在我单击按钮显示dialog之后,我得到了一个强制关闭错误

我的服务代码:

public class FloatingLayoutService extends Service implements StepperFormListener {

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        //Inflate the layout using LayoutInflater
        layoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
        floatingLayout = (ConstraintLayout) layoutInflater.inflate(R.layout.service_floating_layout, null);

        floatingLay_root = floatingLayout.findViewById(R.id.floatingLay_root);
        floatingLay_main = floatingLayout.findViewById(R.id.floatingLay_main);
        floatingLay_emptyImg = floatingLayout.findViewById(R.id.floatingLay_emptyImg);
        ...

        //Set layout params to display the controls over any screen.
        int LAYOUT_FLAG;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
        } else {
            LAYOUT_FLAG = WindowManager.LayoutParams.TYPE_PHONE;
        }
        final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.MATCH_PARENT,
                LAYOUT_FLAG,
                0,
                PixelFormat.TRANSLUCENT);
        // From API26, TYPE_PHONE deprecated. Use TYPE_APPLICATION_OVERLAY for O
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O)
            params.type = WindowManager.LayoutParams.TYPE_PHONE;
        //Initial position of the floating controls
        params.gravity = Gravity.BOTTOM | Gravity.START;
        params.x = 0;
        params.y = 0;
        //Add the controls view to windowManager
        windowManager.addView(floatingLayout, params);

        //Task page btn
        floatingLay_infoContentNextPage.setOnClickListener(v -> {
            AlertDialog alertDialog = new AlertDialog.Builder(this)
                    .setTitle("Title")
                    .setMessage("Are you sure?")
                    .create();

            alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
            alertDialog.show();

        });

        return START_STICKY;
    }
Process: com.app, PID: 32088
java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
    at android.support.v7.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:555)
    at android.support.v7.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:518)
    at android.support.v7.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:466)
    at android.support.v7.app.AppCompatDialog.setContentView(AppCompatDialog.java:94)
    at android.support.v7.app.AlertController.installContent(AlertController.java:232)
    at android.support.v7.app.AlertDialog.onCreate(AlertDialog.java:279)
    at android.app.Dialog.dispatchOnCreate(Dialog.java:475)
    at android.app.Dialog.show(Dialog.java:374)
    at com.app.tester.tests_steps.FloatingLayoutService$1.onAnimationEnd(FloatingLayoutService.java:326)
    at android.animation.Animator$AnimatorListener.onAnimationEnd(Animator.java:552)
    at android.animation.AnimatorSet.endAnimation(AnimatorSet.java:1293)
    at android.animation.AnimatorSet.doAnimationFrame(AnimatorSet.java:1079)
    at android.animation.AnimationHandler.doAnimationFrame(AnimationHandler.java:146)
    at android.animation.AnimationHandler.-wrap2(Unknown Source:0)
    at android.animation.AnimationHandler$1.doFrame(AnimationHandler.java:54)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:977)
    at android.view.Choreographer.doCallbacks(Choreographer.java:791)
    at android.view.Choreographer.doFrame(Choreographer.java:723)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:965)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6710)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770)
显示此行的错误:
alertDialog.Show()


如何修复它?

您不能在服务中显示对话框。您需要对话框的活动上下文


使用服务上下文,您可以启动新活动并在其中显示对话框。

转到res/values/styles.xml

在“AppTheme”样式的结束括号下方,添加以下内容:

<style name="MyDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="android:colorAccent">#ff0000</item>
    <item name="colorAccent">#ff0000</item>
    <item name="android:background">#00FFFFFF</item>
</style>

希望有帮助

在alertDialog.Builder()方法中,传递一个从AppDialog扩展而来的主题,谢谢我的朋友,但我如何显示对话框?!你能把我上面的代码寄给我吗?请我的朋友谢谢我的朋友,添加代码后显示以下错误:
android.view.WindowManager$BadTokenException:无法添加窗口android.view.ViewRootImpl$WEx@a9c2c6a--窗口类型2003的权限被拒绝
此错误表示您试图在锁定屏幕上方或在应用程序之外的其他上下文中启动对话框,对吗?
AlertDialog.Builder alertdialogobuilder = new AlertDialog.Builder(this, R.style.MyDialogTheme);