android在类中将布局文件指定为,Android中将布局文件View添加至窗口过程...
2023年7月15日发(作者:)
android在类中将布局⽂件指定为,Android中将布局⽂件View添加⾄窗⼝过程分析本⽂主要内容是讲解⼀个视图View或者⼀个ViewGroup对象是如何添加⾄应⽤程序窗⼝中的。下⽂中提到的窗⼝可泛指我们能看到的界⾯,包括⼀个Activity呈现的界⾯(我们可以将之理解为应⽤程序窗⼝),⼀个Dialog,⼀个Toast,⼀个Menu菜单等。⾸先对相关类的作⽤进⾏⼀下简单介绍:Window 类 位于 /frameworks/base/core/java/android/view/说明:该类是⼀个抽象类,提供了绘制窗⼝的⼀组通⽤API。可以将之理解为⼀个载体,各种View在这个载体上显⽰。源⽂件(部分)如下:publicabstractclassWindow {//...//指定Activity窗⼝的风格类型publicstaticfinalintFEATURE_NO_TITLE =1;publicstaticfinalintFEATURE_INDETERMINATE_PROGRESS =5;//设置布局⽂件publicabstractvoidsetContentView(intlayoutResID);publicabstractvoidsetContentView(View view);//请求指定Activity窗⼝的风格类型publicbooleanrequestFeature(intfeatureId) {finalintflag =1android:layout_width="match_parent"android:layout_height="?android:attr/windowTitleSize"style="?android:attr/windowTitleBackgroundStyle">style="?android:attr/windowTitleStyle"android:background="@null"android:fadingEdge="horizontal"android:gravity="center_vertical"android:layout_width="match_parent"android:layout_height="match_parent"/>android:layout_width="match_parent"android:layout_height="0dip"android:layout_weight="1"android:foregroundGravity="fill_horizontal|top"android:foreground="?android:attr/windowContentOverlay"/>该布局⽂件很简单,⼀个LinearLayout下包含了两个⼦FrameLayout视图,第⼀个FrameLayout⽤来显⽰标题栏(TitleBar),该TextView 视图id为title(android:id="@android:id/title");第⼆个FrameLayout⽤来显⽰我们Activity的布局⽂件的⽗视图,该FrameLayoutid为content(android:id="@android:id/content") 。全屏的窗⼝布局⽂件 _simple:enabled.-->android:id="@android:id/content"android:fitsSystemWindows="true"android:foregroundInsidePadding="false"android:foregroundGravity="fill_horizontal|top"android:foreground="?android:attr/windowContentOverlay"/>该布局⽂件只有⼀个FrameLayout,⽤来显⽰我们Activity的布局⽂件,该FrameLayoutid为android:id="@android:id/content"2、前⾯⼀步我们确定窗⼝修饰布局⽂件后,mDecor做为根视图将该窗⼝布局对应的视图添加进去,并且获取id为content的View,将其赋值给mContentParent对象,即我们前⾯中提到的第⼆个FrameLayout。At Last、产⽣了mDecor和mContentParent对象后,就将我们的Activity布局⽂件直接添加⾄mContentParent⽗视图中即可。我们再次回到 Step 2 中tentView() 该⽅法在PhoneWindow类中@OverridepublicvoidsetContentView(intlayoutResID) {if(mContentParent ==null) {installDecor();} else{AllViews();}e(layoutResID, mContentParent);finalCallback cb = getCallback();if(cb !=null) {entChanged();}}整个过程主要是如何把Activity的布局⽂件添加⾄窗⼝⾥,上⾯的过程可以概括为:1、创建⼀个DecorView对象,该对象将作为整个应⽤窗⼝的根视图2、创建不同的窗⼝修饰布局⽂件,并且获取Activity的布局⽂件该存放的地⽅,由该窗⼝修饰布局⽂件内id为content的FrameLayout指定 。3、将Activity的布局⽂件添加⾄id为content的FrameLayout内。最后,当AMS(ActivityManagerService)准备resume⼀个Activity时,会回调该Activity的handleResumeActivity()⽅法,该⽅法会调⽤Activity的makeVisible⽅法 ,显⽰我们刚才创建的mDecor 视图族。//系统resume⼀个Activity时,调⽤此⽅法finalvoidhandleResumeActivity(IBinder token,booleanclearHide,booleanisForward) {ActivityRecord r = performResumeActivity(token, clearHide);//...if(leFromClient) {sible();}}handleResumeActivity()⽅法原型如下: 位于ActivityThread类中voidmakeVisible() {if(!mWindowAdded) {ViewManager wm = getWindowManager(); // 获取WindowManager对象w(mDecor, getWindow().getAttributes());mWindowAdded = true;}ibility(E); //使其处于显⽰状况}接下来就是,如何把我们已经创建好的窗⼝通知给WindowManagerService ,以便它能够把这个窗⼝显⽰在屏幕上。关于这⽅⾯内容⼤家可以去看邓凡平⽼师的这篇博客《Android深⼊浅出之Surface[1]》
发布者:admin,转转请注明出处:http://www.yc00.com/web/1689428818a246674.html
评论列表(0条)