installDecor()的流程 | windowSytle| Theme|Feature设置(笔记)

private void installDecor(){
    if(mDecor == null){
        mDecor = generateDecor();
        mDecor.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
        mDecor.setIsRootNamespace(true);
    }
    if(mContentParent == null){
        mContentParent = generateLayout(mDecor);

installDecor()是在 setContentView(int layoutResID)方法内被调用,为windows添加decorview页面

installDecor执行流程

  • 使用 generateDecor()创建一个DecorView对象,并赋值给mDecor变量。该变量并不完全等同于窗口修饰,窗口修饰是mDecor内部的唯一一个子视图。
  • 根据用户指定的参数选择不用的窗口修饰,并把该窗口修饰作为mDecor的子窗口,这是在generateLayout()中调用mDecor.addView()完成的.
  • 给mContentParent变量赋值,其值是通过调用ViewGroup.contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT)获得的,ID_ANDROID_CONTENT正是id = content 的 FrameLayout
窗口修饰的XML布局文件
  • R.layout.dialog_title_icons
  • R.layout.screen_title_icons
  • R.layout.screen_progress
  • R.layout.dialog_custom_title
  • R.layout.screen_custom_title
  • R.layout.dialog_title
  • R.layout.screen_title
  • R.layout.screen_simple
该xml用于添加到窗口修饰中的指定 xml 布局文件
这是在setConetentView()(方法内部)中调用inflate()方法完成的,该方法的第二个参数正是mContentParent,即 id = content 的 FrameLayout

Feature的指定
  • 在Activity的onCreate()方法中调用得到当前的Window,然后调用requestFeature()指定,generateLayout()方法中使用getLocalFeature()获取feature值,并根据这些值选择不同的窗口修饰
  • 在AndroidMainfest.xml中Activity元素内部使用android:theme="xxx"指定。generateLayout()方法中使用getWindowStyle()方法获取这些值,该方法的调用流程为:
  1. PhoneWindow: getWindowStyle() 中 generateLayout
  2. Window: obtainStyleAttributes() 中
  3. Context: getTheme().obtainStyleAttributes() 中

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值