Android Studio 如何在代码中动态添加GridView?

Android Studio 如何在代码中动态添加GridView?,第1张

DecorView 是android 界面的顶级View ,当前界面的整个即为DecorView。DecorView为FrameLayout,而DecorView 一般会包含一个竖直方向的LinearLayout。这个竖直方向的LinearLayout 一般分为两个部分(具体Android版本和主题有所不同),上部分为标题栏,下部分为内容栏,而内容栏的id 为 android.R.id.content, 内容栏也是FrameLayout,我们使用setContentView(),的布局加入的就是内容栏。

动态添加View 一般是添加在我们自己的布局文件里,而setContentView时加入的我们的布局是内容栏的第一个子View,所以我们需要获取到我们的布局对应的View。

####如何获取DecorView?

在Activity 中直接调用 getWindow().getDecorView()

####如何获取ContentView?

在Activity中调用

FrameLayout contentView = (FrameLayout)getWindow().getDecorView().findViewById(android.R.id.content)

或直接:

FrameLayout contentView = (FrameLayout)activity.findViewById(android.R.id.content)

####获取我们填充的布局

ViewGroup viewGroup = (ViewGroup)contentView.getChildAt(0)

####添加View

Drawable变成bitmap 再变成一个文件到sd卡,这个时候用一个有规律的名字命名,比如图片名的hashcode,然后每次取得时候,先从内存取,内存取不到,就用文件名从sd卡去取

在调用addview之后, 将view添加到ViewGroup的数组, 将该ViewGroup设置为该view的parent。从AddView方法, 到addViewInner方法结束之前, 所有流程都是同步的。

其中在addViewInner之前,会通过调用requestLayout()和invalidate(true)为该view设置标记。

在调用addview之后, 系统底层会通过发送一条消息, 该消息是由Choreographer类的一个内部类 FrameDisplayEventReceiver来处理,最终会走到ViewRootImpl的performTraversals(),然后内部就是经典的三大流程 measure,layout,draw。

对应的相关处理是measureHierarchy(),performLayout,performDraw()。在这些内部, 会通过前面设置的标记来区分哪些view需要测量绘制等(每个ViewGroup不止一个view,因此有些需要测绘,有些不需要,就是通过flag来区分的)。执行完以后, 通知系统底层绘制view。大概就是这样


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11553285.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存