android SystemUI 自定义dialog
android SystemUI 自定义dialog
·
在系统窗口上面弹出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对象
更多推荐
已为社区贡献1条内容
所有评论(0)