自定义 dialog设置大小(全屏、其他) 虚拟按键的影响

1.背景:alertdialog的弹出,想设置成全屏,而且不想用popuwindow,还有就是在布局里设置好了之后,就是不行。

解决:
查找资料,发现都是先show,在动态设计大小,在生成的时候,就是可以设置主题。

2.来上代码:

2.1view的代码

public class CustomProgressDialog extends ProgressDialog {
    private Context mContext;
    private ImageView mImageView;
    private String mLoadingTip;
    private TextView mLoadingTv;
    private int count = 0;
    private String oldLoadingTip;
    private int mResid;
    private AnimationDrawable mAnimation;

//    public CustomProgressDialog(Context context) {
//        super(context);
//        this.mContext=context;
//        setCanceledOnTouchOutside(true);
//    }

    public CustomProgressDialog(Context context, String content,int theme, int id) {
        super(context,theme);
        this.mContext = context;
        this.mResid = id;
        this.mLoadingTip = content;
        this.setCanceledOnTouchOutside(false);

    }

    public CustomProgressDialog(Context context, String content, int id) {
        super(context);
        this.mContext = context;
        this.mResid = id;
        this.mLoadingTip = content;
        this.setCanceledOnTouchOutside(false);

    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog_custom_dialog);
        initView();
        initData();
    }

    private void initData() {
        mImageView.setBackgroundResource(mResid);
        mLoadingTv.setText(mLoadingTip);
        // 通过ImageView对象拿到背景显示的AnimationDrawable
        mAnimation = (AnimationDrawable) mImageView.getBackground();
        // 为了防止在onCreate方法中只显示第一帧的解决方案之一
        mImageView.post(new Runnable() {
            @Override
            public void run() {
                mAnimation.start();

            }
        });
    }

    private void initView() {
        mLoadingTv = (TextView) findViewById(R.id.loadingTv);
        mImageView = (ImageView) findViewById(R.id.loadingIv);

    }
}

2.2主题代码,写到style

<!--加载进度对话框样式-->
    <style name="Dialog_Fullscreen">
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsFloating">true</item><!--是否浮现在activity之上-->
        <!--<item name="android:windowIsTranslucent">false</item>&lt;!&ndash;半透明&ndash;&gt;-->
        <!--<item name="android:windowBackground">@android:color/transparent</item>&lt;!&ndash;背景透明&ndash;&gt;-->
        <!--<item name="android:backgroundDimEnabled">true</item>&lt;!&ndash;模糊&ndash;&gt;-->
    </style>

2.3布局代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#e7e7e7">
    <ImageView
        android:id="@+id/loadingIv"
        android:layout_alignParentTop="true"
        android:layout_marginTop="180dp"
        android:layout_width="90dp"
        android:layout_centerHorizontal="true"
        android:layout_height="90dp" />

    <TextView
        android:id="@+id/loadingTv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/loadingIv"
        android:layout_marginTop="15dp"
        android:layout_centerHorizontal="true"
        android:textSize="20sp"
        android:text="加载中..." />
</RelativeLayout>

2.4在activity中使用

使用时,发现在,部分带虚拟按键的手机,效果不佳,当虚拟按键弹出时,和消失后,弹出的dialog大小不一样,这种情况不能使用。
必须获取真正屏幕的高宽,
就查了一下,api,发现17之后,有新方法。
getHeight,getWidth在api 13之后过期
这里写图片描述
获得真正的屏幕大小
这里写图片描述

 在oncreat中使用:
  //正在加载的dialog
        dialogLoading = new CustomProgressDialog(this,"加载中...",R.style.Dialog_Fullscreen, R.drawable.dialog_loading);


/**控制dialog的显示和隐藏
     * @param dialog
     * @param isDisplay true 展示,false 显示
     */
    public void showDialog(Dialog dialog,boolean isDisplay){
        if(isDisplay){
            dialog.show();
            //获取对话框当前的参数值
            android.view.WindowManager.LayoutParams p = dialog.getWindow().getAttributes();
            // 动态设置自定义Dialog的显示内容的宽和高
            if(Build.VERSION.SDK_INT<17){
                //自动减去虚拟按键的高度
                Display display = getWindowManager().getDefaultDisplay();
                DisplayMetrics dm = new DisplayMetrics();
                @SuppressWarnings("rawtypes")
                Class c;
                try {
                    c = Class.forName("Android.view.Display");
                    @SuppressWarnings("unchecked")
                    Method method = c.getMethod("getRealMetrics",DisplayMetrics.class);
                    method.invoke(display, dm);
                }catch(Exception e){
                    e.printStackTrace();
                }
                p. width = dm.widthPixels;
                p.height = dm.heightPixels;

            } else if (Build.VERSION.SDK_INT >= 17) {

                DisplayMetrics dm = new DisplayMetrics();
                getWindowManager().getDefaultDisplay().getRealMetrics(dm);
              p.width = dm.widthPixels;  // 屏幕宽
               p.height = dm.heightPixels;  // 屏幕高

            }
            dialog.getWindow().setAttributes(p);     //设置生效
        }else if(dialog.isShowing()){
            dialog.dismiss();
        }

    }

写的这么清晰,demo就不发了;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不对法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值