最近搞一个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时回复默认了,具体原因就没有继续探索下去。
写这个呢主要是记录自己的一次学习过程,以后遇到类似的情况可以借鉴一下,因为自己的记性实在太差了,免得之后再重新研究一遍。。。。