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

问题描述 投票:0回答:2

在我的应用程序中,我想将对话框用于服务,为此,我编写了以下代码,但是在单击显示对话框的按钮后,出现了强制关闭错误!

我的服务代码:

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();

我该如何解决?

java android android-service android-dialog
2个回答
0
投票

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

通过服务上下文,您可以启动一个新的活动并在其中显示您的对话框。


0
投票

转到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的方式:

AlertDialog.Builder alertdialogobuilder = new AlertDialog.Builder(this, R.style.MyDialogTheme);

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.