android中layout、drawable及styles的xml文件加载探索

本文介绍了在Android SDK项目中如何通过XML解析实现布局、Drawable资源的加载及样式主题的应用。针对Theme中特定属性如android:backgroundDimEnabled无法在代码中设置的问题,提供了具体的解决方案,并探讨了在Activity的onCreate方法中设置Theme的有效性和限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        最近搞一个SDK项目,既然提供给用户那么就不能太复杂。而android如果不用xml就会很复杂,比如布局,那么怎么办?

        关于布局别人提供了一个方法,xml解析。具体做法将xml文件以数据文件的形式放在文件夹下,比如assets,用XmlPullParser解析xml文件,再用LayoutInterflater的inflate方法获取到layout,这样就可以在代码中利用了。

        后来又遇到了一个问题,其他的xml呢?自己的项目中要用到drawable和styles,这俩个怎么办?

        经过查找发现,drawable也是可以用解析的方式载入的,同样用XmlPullParser解析xml文件,然后用Drawable的createFromXml方法来得到drawable,这样就可以在代码中使用了。

        那么styles呢?样式主题中很多都有对应的方法,可以在代码中直接设置,但是有些还是不知道怎么解决的。(也许有方法,作为菜鸟的我不知道。。。)

        比如android:backgroundDimEnabled,窗口之外依然是半透明的,这样很多效果就不好看,就必须设置这个android:backgroundDimEnabled。但又不能使用xml文件,最终还是在网上找到了解决方法window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)和window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND),看来还要多研究下api,不过本人外语水平不咋地,所以看着头大。同时也有dimAmount的相关方法(设置背景透明度)

        WindowManager.LayoutParams lp=getWindow().getAttributes(); lp.alpha=1.0f; getWindow().setAttributes(lp); <br/>

        但是在自己研究的过程中发现了一个小问题,同时也深入的探索了一下,具体情况如下。

        在styles中写好了theme,在AndroidManifest.xml中载入没有问题。但是在Activity中的onCreate方法中用setTheme载入,即使在stayles中设置了android:backgroundDimEnabled一样没有显示效果。。。而且放在super.onCreate前后也是有差异的。

        个人觉得造成这样的原因是因为在AndroidManifest.xml中设置theme后,这个样式是在acticity的onCreate方法调用前就装载了。那么到底是不是?继续在源码中探索吧。

        Activity的onCreate方法其实并不是真正的入口,真正的入口是ActivityThread,这就是所谓的主线程,这里有个main方法。Acticity就是在这个类里创建出来的运行的,有关theme的代码如下:

        int theme = r.activityInfo.getThemeResource(); if (theme != 0) { activity.setTheme(theme); } activity.mCalled = false; mInstrumentation.callActivityOnCreate(activity, r.state);

        可以看的setTheme后有个callActivityOnCreate,这时才会调用Activity的onCreate方法。所以AndroidManifest.xml中载入没有问题,在代码中就出现了问题,个人认为是有些设置是在onCreate时回复默认了,具体原因就没有继续探索下去。

        写这个呢主要是记录自己的一次学习过程,以后遇到类似的情况可以借鉴一下,因为自己的记性实在太差了,免得之后再重新研究一遍。。。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BennuCTech

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

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

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

打赏作者

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

抵扣说明:

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

余额充值