美文网首页
记录自定义Dialog的一个天坑和启动Dialog的小流程

记录自定义Dialog的一个天坑和启动Dialog的小流程

作者: HWilliamgo | 来源:发表于2018-07-17 18:24 被阅读24次

记录自定义Dialog的一个天坑。

/**
 * Created by 黄伟杰 on 2018/7/17.
 */
public class MyDialog extends Dialog {
    private Context context;

    public MyDialog(@NonNull Context context) {
        super(context);
        this.context=context;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        setContentView(R.layout.dialog);//放在onCreate里去调用,文档里就是这么写的。
        locateWindow(Gravity.TOP|Gravity.CENTER_HORIZONTAL);
    }
    
    //如果这个方法不在setContentView后面调用,params.width和params.height的设置将会失效
    private void locateWindow(int gravity){
        Window window = getWindow();
        Objects.requireNonNull(window).setGravity(gravity);
        WindowManager.LayoutParams params = Objects.requireNonNull(window).getAttributes();
        params.y = DensityUtil.dip2px(context, 49);
        params.width = WindowManager.LayoutParams.MATCH_PARENT;
        params.height = WindowManager.LayoutParams.WRAP_CONTENT;
        window.setAttributes(params);
    }
}

附带一个Dialog的由创建到展现给用户的流程:

贴出的源码都是浓缩版代码


构造方法:

    Dialog( Context context, int themeResId, boolean createContextThemeWrapper) {
        ...
        //获取单例类WindowManager。
        mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        //创建PhoneWindow对象
        final Window w = new PhoneWindow(mContext);
        mWindow = w;
      ...
    }

创建完后,我们代码里调用Dialog#show

public void show(){
    dispatchOnCreate(null);//  ==>调用onCreate();
    onStart();
    mDecor=mWindow.getDecorView();//获取我们Dialog所在的Window上的DecorView。
    mWindowManager.addView(mDecor, l);//把顶级DecorView放到Window上。
  //至此,Dialog显示出来了。准确地说,是刚才创建的PhoneWindow上的View显示出来了。
}

在onCreate()中,按照谷歌文档的推荐,在此处调用setContentView();


要深入去看Window的一些东西,看这个大神的文章:
Android Window 机制探索 - 凶残的程序员

相关文章

网友评论

      本文标题:记录自定义Dialog的一个天坑和启动Dialog的小流程

      本文链接:https://www.haomeiwen.com/subject/jupgpftx.html