Android——UI(1) (activity window decor)

1. activity window decor 之间的关系

android里:
1个app里面有一个或多个window
1个activity里有1个decor
1个window有1个decor
1个decor有多个viewgroup/layout
viewgroup/layout中有多个view.

activity就是一组相对独立的功能,每个activity有个显示界面,界面显示在窗口上,所以有个窗口。

installDecor() //PhoneWindow.java
  mContentParent = generateLayout(mDecor);

Decor是个树状结构,DecorView是这个树的根节点。

2. Framelayout也是一个ViewGroup的派生类。

3. Decor的样式就是通过AndroidManifest.xml中“android:theme”域来指定的。

3. Decor的样式就是通过AndroidManifest.xml中“android:theme”域来指定的。
<application
    android:theme="@style/AppTheme"    通过它来指定的,可以选择其它的,eg:@android:style/XXXX 会自动有提示。可以逐个试验一下。
 ......
>

4 .打印Decor的树状关系Demo代码

public void printViewHierarchy(View parent, int level, int childidx){
    /*
     *   * DecorView child -1 (x, y), (w, h)
     *   ** FrameLayout child 0 (x, y), (w, h)
     *   *** TextView  child 0  (x, y), (w, h)
     *   ** FrameLayout child 1 (x, y), (w, h)
     *   *** Button   child 0   (x, y), (w, h)
     *   *** TextView  child 1  (x, y), (w, h)
     *   *** FrameLayout  child 2 (x, y), (w, h)
     */
    int i;
    String levelStr = "*";
    for (i = 0; i < level; i++)
        levelStr += "*";

    int[] positons = new int[2];
    parent.getLocationOnScreen(positons);

    Log.d(TAG, levelStr + " " + parent.getClass().getName() + " child " + childidx
            + " (" + positons[0] + ", " + positons[1] + "), ("+parent.getWidth()+", "
            +parent.getHeight()+")");

    if (parent instanceof ViewGroup){
        View child;
        ViewGroup root = (ViewGroup)parent;
        i = 0;
        while ((child = root.getChildAt(i)) != null){
            printViewHierarchy(child, level+1, i);
            i++;
        }
    }
}

class MyButtonListener implements View.OnClickListener {
    @Override
    public void onClick(View v) {
        View decorView = getWindow().getDecorView();
        printViewHierarchy(decorView, 0, -1);
    }
}

原文地址:https://www.cnblogs.com/hellokitty2/p/10884194.html

时间: 2024-08-01 19:23:18

Android——UI(1) (activity window decor)的相关文章

【Android开发经验】This Activity already has an action bar supplied by the window decor

问题描述:继承自AppCompatActivity,使用Toolbar替代ActionBar的时候,出现错误 错误信息: 2.Caused by: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_ACTION_BAR and set windowActionBar to false

java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme t

异常信息: Caused by: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead. 问题原因: 当在

Android GUI之Activity、Window、View

相信大家在接触Android之初就已经知道了Activity中的setContentView方法的作用了,很明显此方法是用于为Activity填充相应的布局的.那么,Activity是如何将填充的布局绘制出来的呢?实际上Activity将View的绘制与显示交给了Window对象来处理,下面我们通过源码来进行跟踪分析. Activity的源码如下,只给出我们关注的部分: public class Activity extends ContextThemeWrapper implements La

Android UI效果实现——Activity滑动退出效果

更新说明: 1.在QQ网友北京-旭的提醒下,在SlideFrame的initilize方法中添加了focusable.focusableInTouch.clickable的状态设置,否则会导致部分情况下无法滑动,感谢! 一.使用说明 使用方法很简单,只有一个类HorizontalActivity,继承自FragmentActivity类,实现了contentView的滑动事件触发和动画效果,要在自己的代码里实现,方法两种: 1.如果对Activity没特殊要求,直接继承HorizontalAct

android.view.WindowLeaked: Activity com.xty.activity.ActivityMainPage has leaked window com.android.

android.view.WindowLeaked: Activity com.xty.activity.ActivityMainPage has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{41331978 V.E..... R.....I. 0,0-480,226} that was originally added here 在通过dialog上的按钮跳转到另外一个activity时要关闭dial

(10 Android)实验项目_Android UI与Activity组件(上)

(10 Android)实验项目_Android UI与Activity组件(上) 一.实验目的 (1) 掌握常用的布局方法. (2) 掌握Activity组件的生命周期. 二.实验内容及步骤 在Android Studio中,新建名为Example3的项目,然后在此项目中完成如下几个模块的设计: 1.掌握各种布局的特点.Android常用控件的使用 (1) 在项目里,新建名为example3_1的模块. (2) 在默认的约束布局里,添加垂直线性布局并内嵌水平线性布局,然后依次添加文本框.下拉列

activity window view 关系

1.Activity , Window和View的关系是什么? 跟踪Activity的源码就会发现:Activity.attch() -> PolicyManager -> Policy -> PhoneWindow -> mLayoutInflater.inflate()&mContentParent.addView()这只是一个简单的跟踪过程描述.通过跟踪源代码,就可以很清晰的看出他们三者的关系. Activity像一个工匠(控制单元),Window像窗户(承载模型),

java.lang.IllegalStateException: ActionBarImpl can only be used with a compatible window decor layou

于Activity调用它们的定义dialog事件ActionBarImpl can only be used with a compatible window decor layout异常, 解决方法: 在自定dialog的style加入 parent="@android:style/Theme.Dialog" 版权声明:本文博主原创文章.博客,未经同意不得转载.

Android UI设计之&lt;十一&gt;自定义ViewGroup,打造通用的关闭键盘小控件ImeObserverLayout

转载请注明出处:http://blog.csdn.net/llew2011/article/details/51598682 我们平时开发中总会遇见一些奇葩的需求,为了实现这些需求我们往往绞尽脑汁有时候还茶不思饭不香的,有点夸张了(*^__^*)--我印象最深的一个需求是在一段文字中对部分词语进行加粗显示.当时费了不少劲,不过还好,这个问题最终解决了,有兴趣的童靴可以看一下:Android UI设计之<六>使用HTML标签,实现在TextView中对部分文字进行加粗显示. 之前产品那边提了这样