在系统窗口上面弹出dialog,用于SystemUI,可参考SystemuI里面的SystemUIDialog.java


import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.WindowInsets.Type;
import com.android.systemui.R;
import com.android.systemui.broadcast.BroadcastDispatcher;
import android.os.UserHandle;
import android.content.BroadcastReceiver;
import android.content.Intent;
import com.android.systemui.Dependency;

import android.content.IntentFilter;
import androidx.annotation.NonNull;

public class MyResetDialog extends AlertDialog {
    private Context mContext;
    private onDialogClickListener listener;
    private DismissReceiver mDismissReceiver;
    public MyResetDialog(@NonNull Context context) {
        super(context);
        mContext = context;
    }
    public MyResetDialog(@NonNull Context context, int themeResId) {
        super(context, themeResId);
        mContext = context;
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        Window window = getWindow();
        window.setGravity(Gravity.BOTTOM);
        window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        window.setType(WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL);
        window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);

        WindowManager.LayoutParams layoutParams = window.getAttributes();
        layoutParams.setFitInsetsTypes(window.getAttributes().getFitInsetsTypes() & ~Type.statusBars());
        layoutParams.y=mContext.getResources().getDimensionPixelSize(R.dimen.reset_dialog_magin_bottom);
        layoutParams.format = PixelFormat.TRANSLUCENT;
        layoutParams.width=mContext.getResources().getDimensionPixelSize(R.dimen.reset_dialog_width);;
        layoutParams.height=mContext.getResources().getDimensionPixelSize(R.dimen.reset_dialog_heigth);;

        window.setAttributes(layoutParams);
        setContentView(R.layout.dialog_test);

        findViewById(R.id.ok).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.onPositiveClick();
            }
        });
        findViewById(R.id.cancle).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.onCancelCLick();
            }
        });
        mDismissReceiver=new DismissReceiver();
    }

    public void show() {
        super.show();
    }


    public void setOnDialogClickListener(onDialogClickListener listener) {
        this.listener = listener;
    }

    public interface onDialogClickListener {
        void onPositiveClick();
        void onCancelCLick();
    }

    @Override
    protected void onStart() {
        super.onStart();
        if (mDismissReceiver != null) {
            mDismissReceiver.register();
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (mDismissReceiver != null) {
            mDismissReceiver.unregister();
        }
    }

    private  class DismissReceiver extends BroadcastReceiver {
        private final IntentFilter INTENT_FILTER = new IntentFilter();
        {
            INTENT_FILTER.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
            INTENT_FILTER.addAction(Intent.ACTION_SCREEN_OFF);
        }

        private boolean mRegistered;
        private final BroadcastDispatcher mBroadcastDispatcher;

        DismissReceiver() {
            mBroadcastDispatcher = Dependency.get(BroadcastDispatcher.class);
        }

        void register() {
            mBroadcastDispatcher.registerReceiver(this, INTENT_FILTER, null, UserHandle.CURRENT);
            mRegistered = true;
        }

        void unregister() {
            if (mRegistered) {
                mBroadcastDispatcher.unregisterReceiver(this);
                mRegistered = false;
            }
        }

        @Override
        public void onReceive(Context context, Intent intent) {
            dismiss();
        }
    }


}

dialog调用显示

    public final void showResetDialog() {
            MyResetDialog myResetDialog=new MyResetDialog(((QSCustomizer) this.mView).getContext());
            myResetDialog.setOnDialogClickListener(new MyResetDialog.onDialogClickListener() {
                    @Override
                    public void onPositiveClick() {
                        myResetDialog.dismiss();
                        reset();
                    }

                    @Override
                    public void onCancelCLick() {
                        myResetDialog.dismiss();
                    }
                });

        myResetDialog.show();
    }

注意点 :
1.AlertDialog 宽度,由于添加圆角,dialog背景需要透明,AlertDialog 有固定宽度,导致显示异常(建议在未设置透明时调整)。在加载layout时指定容器宽高。
2.注意实例dialog时,传入的context对象

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐