问题标签 [android-layoutparams]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - Android Windows:它们是何时以及如何创建的?
我已经阅读了标准的 Windows 相关文档并浏览了一堆源代码,试图了解 Android Windows 的创建方式和时间。我相信我已经拥护它,并希望对其进行验证或更正。
据我所知,只有两种方法可以获取 Window 对象的句柄。
在上述两种情况下,您都可以使用 getWindow 获取 Window 的句柄,然后使用该句柄操作 Window。
Windows 也可以通过使用 WindowManager 的 addView 方法来创建,但无法获得此类 Windows 的句柄。这是一个非常令人困惑的领域,因为 addView 方法本身并不意味着创建一个窗口,甚至视图管理器源代码中的注释也只是说明了以下内容。
因此,该方法似乎意味着将视图添加到现有窗口。然而, addView 的第二个参数是一个 WindowManager.LayoutParams 实例,除其他外,它指定了一个窗口类型(例如,TYPE_SYSTEM_ALERT),这意味着实际上正在创建一个窗口。事实上,情况就是这样。这是源代码中发生的事情的非常简短的概述。(对于新手:您可以在许多不同的网站上浏览源代码;我最喜欢的是http://grepcode.com。)
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。查看%2Candroid.view.ViewGroup.LayoutParams%29
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
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
- 验证传入的参数是 WindowManager.LayoutParams。
- 如果 View 有父级,则调整布局参数。
- 确定新视图(又名窗口)是否为面板窗口(即子窗口)并进行处理。
- 创建一个新的 ViewRootImpl。
- 将 View、ViewRootImpl 和 WindowManager.LayoutParams 实例添加到单独的 ArrayList 中。
- 通过后者的 setView 方法将 View 和相关参数添加到 ViewRootImpl。
ViewRootImpl 的 setView 方法然后做了一堆低级的工作。它会在各种错误情况下引发“无法添加窗口...”消息的变体异常。根据 ViewRootImpl 的主要评论,它是“视图层次结构的顶部,实现 View 和 WindowManager 之间所需的协议。这在很大程度上是 WindowManagerGlobal 的内部实现细节。”
WindowManagerGlobal 似乎通过三个数组跟踪多个窗口。据我所知,ViewRootImpl 实际上是新窗口,它由 WindowManagerGlobal 管理。
综上所述,调用 addView 似乎确实创建了一个新窗口(虽然它被称为视图和窗口)但没有提供关联的 Window 类来访问它,因此开发人员不能处理它。
我的问题是:
- 除了上面提到的两个 getWindow 方法之外,还有其他方法可以获取 Window 实例的句柄吗?
- 实际上,addView 是否创建了一个 Window,如果是,有没有办法获得它的句柄?
- 上面还有什么不正确的吗?如果是,在哪些方面?
谢谢!巴里
android - Android:ViewGroup.MarginLayoutParams 不起作用
我用它以编程方式设置边距,但它不起作用,边距未应用。在构造函数中:
android - FLAG_KEEP_SCREEN_ON 反向工作
这是一个奇怪的问题。
我之前使用的是:
android:keepScreenOn="true"
在我的布局文件中保持屏幕在活动中,这工作正常。
但是,我想改进,以便仅在 Web 应用程序处于特定状态时才保持屏幕亮起。(如果用户愿意,他们仍然应该能够关闭屏幕,我实际上只是想禁用超时 - 只要活动处于活动状态,布局文件中的上述内容就会实现。)
为此,我在其中添加了一个 JavaScript 接口,WebView
其中包含以下两种方法。
我已经注释掉了keepScreenOn
布局中的设置。
现在Toast
显示正确,但“保持屏幕打开”操作相反。
即当我听到Toast
说屏幕将保持在它上面时,它会超时并在几分钟后切换。但是当我得到Toast
允许屏幕关闭的说法时,屏幕实际上会一直亮着而不会超时。
我不明白这怎么可能。
好的,情节变厚了。
似乎它可能并不总是操作的逆转,但可能是随机的工作/不工作情况。
此外,查看 Android Studio 中的日志,我收到一条错误消息:
当方法被调用时。
但它有时确实有效。
上面显示的方法在 websiteViewActivity 类中,但不在 onCreate 方法中。恐怕我不知道这是否相关,或者如果相关,如何确保addFlags
andclearFlags
在正确的线程中运行。
[编辑:这个问题解释了如何让事情在 UI 线程上运行,并摆脱了“仅原始线程”错误。]
为什么它有时会起作用(我不能说当它起作用时错误是否出现在日志中,因为我只在离开我的电脑进行测试时才看到它起作用)?
android - 如何在不同的行和列中显示图像?
`我有三种类型的图像数组,如小、中和大。如果第一个图像类型是数组中的小图像,则意味着我必须在屏幕左侧显示图像,然后如果它是中等图像类型,则表示它将出现在小图像的右侧,然后是下一个图像,如果它大意味着它将低于中小型图像。方式2是如果第一个图像类型很大,则意味着它必须以宽度而不是高度来填充屏幕。高度必须像 200 一样恒定。同样,每一行都有不同的行和列。我正在尝试像 Windows 开始屏幕一样。如何解决这个问题?提前致谢。
android-layout - 视图动画到底部时自动增加布局高度和宽度
我有三个视图(A、B 和 C),它们相互堆叠。因此,当我单击一个按钮时,两个视图(B 和 C)从视图 A 后面动画并向下滚动到底部。现在我的动画工作正常,但视图 B 和 C 延伸到屏幕外,我的屏幕高度没有增加。这是我的 layout.xml
而我的动画是简单的平移Y动画。
关于如何在两个视图动画到底部时增加布局高度的任何建议?
android - 如何更改现有布局参数的宽度和高度
请考虑它ImageView
里面RelativeLayout
有一些特定的布局参数RelativeLayout
。ImageView
我需要根据屏幕尺寸以编程方式更改我的宽度和高度。
如何保存所有布局参数但只更改宽度和高度
以下代码创建空布局参数,但我需要保存旧参数并仅更改高度和宽度。
我怎样才能做到这一点?
android - 等价于 android:layout_above="@+id/foo"
在 XML 中,您可以执行以下操作:
使一个元素高于另一个元素foo
。
我如何以编程方式执行此操作?
虽然RelativeLayout.LayoutParams
可以添加RelativeLayout.ABOVE
不允许我指定我希望我的视图位于哪个元素上方的规则。