Android Windows:它们何时以及如何创建?

时间:2015-12-09 18:49:50

标签: android android-layout android-layoutparams

我已经阅读了标准的Windows相关文档并且已经完成了 一堆源代码,试图了解Android的方式和时间 Windows已创建。我相信我搂着它并且愿意 验证或更正。

据我所知,只有两种方法来获取Window对象的句柄。

1. Activity's getWindow.
2. Dialog's getWindow method.

在上述两种情况下,您都可以使用getWindow获取Window的句柄 然后使用句柄操作窗口。

Windows也可以通过使用WindowManager的addView方法创建,但是 无法获得此类Windows的句柄。这是一个非常混乱的领域 因为addView方法本身并不意味着创建一个Window甚至是 在View Manager源代码中对它进行评论只是说明如下。

Assign the passed LayoutParams to the passed View and add the view to
the window.

因此,该方法似乎意味着将View添加到您现有的视图中 窗口。但是,addView的第二个参数是a WindowManager.LayoutParams实例,除其他外,指定一个 窗口类型(例如,TYPE_SYSTEM_ALERT),暗示实际上是Window 得到创造。事实上,情况就是如此。这是一个非常简短的大纲 在源代码中发生的事情。 (对于新手:您可以浏览源代码 许多不同网站上的代码;我最喜欢的是http://grepcode.com。)

  1. WindowManager实现了ViewManager接口,它就在哪里  addView已定义。  网址:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/view/ViewManager.java#ViewManager.addView%28android.view.View%2Candroid.view.ViewGroup.LayoutParams%29

  2. 调用WindowManager类的实际实现  WindowManagerImpl。它的addView调用WindowManagerGlobal的addView。  网址:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/view/WindowManagerImpl.java#83

  3. WindowManagerGlobal的addView是真正完成工作的地方。  网址:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/view/WindowManagerGlobal.java#WindowManagerGlobal.addView%28android.view.View%2Candroid.view.ViewGroup.LayoutParams%2Candroid.view.Display%2Candroid.view.Window%29

    1. 验证传入的参数是否为WindowManager.LayoutParams。
    2. 如果View具有父级,则调整布局参数。
    3. 确定新视图(也称为窗口)是否为面板窗口 (或子窗口)或不处理。
    4. 创建一个新的ViewRootImpl。
    5. 添加View,ViewRootImpl和WindowManager.LayoutParams实例 分开ArrayLists。
    6. 通过以下命令将View和相关参数添加到ViewRootImpl 后者的setView方法。
  4. ViewRootImpl的setView方法然后做了一堆低级工作。  它会抛出“无法添加窗口......”的变体异常  各种错误情况下的消息。根据主要评论  ViewRootImpl,它是“视图层次结构的顶层,实现了  View和WindowManager之间需要的协议。这是最多的  部分是WindowManagerGlobal的内部实现细节。“

    网址:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/view/ViewRootImpl.java#ViewRootImpl.setView%28android.view.View%2Candroid.view.WindowManager.LayoutParams%2Candroid.view.View%29

  5. WindowManagerGlobal似乎通过三个阵列跟踪多个Windows。据我所知,ViewRootImpl实际上是新窗口,它由WindowManagerGlobal管理。

    基于以上所述,看来调用addView实际上是在创建 一个新窗口(尽管它被不同地称为视图和a 窗口)但没有提供相关的Window类来访问它,所以 开发人员无法掌握它。

    我的问题是:

    1. 是否有办法获取Window实例的句柄,而不是  上面提到的两个getWindow方法?
    2. 事实上,addView是否会创建一个Window,如果有的话,是否有任何方法  找到它的手柄?
    3. 以上是否有其他错误,如果是,则在哪些方面?
    4. 谢谢! 百里

0 个答案:

没有答案