layoutparams(layoutparams可以设置背景图片吗)

http://www.itjxue.com  2023-01-28 05:34  来源:未知  点击次数: 

WindowManager.LayoutParams的type属性

这篇文章实际上是对官方文档中WindowManager.LayoutParams的type属性的翻译

实际上我只是生硬的翻译了一下,并不知道所有类型的真正意义

type这个成员变量表示了window的类型(是个int值)

通常有3中window类型

3.System windows

取值范围为从 FIRST_SYSTEM_WINDOW(Constant Value: 2000 (0x000007d0)) 到 LAST_SYSTEM_WINDOW(Constant Value: 2999 (0x00000bb7))

这种window是特殊的window类型,一般是系统用户特殊目的使用的

这种window不应该被普通程序使用,

想要使用他们必须拥有特别的权限

( 也就是说从api23开始不要想通过这种创建这种window的方式构造悬浮窗了,系统默认就不允许 )

总得来说有个原则,type值越大则显示的越靠上层,

上面的这些type常量都是系统中各种UI默认的使用的值

如果要达到你想要达到的效果甚至可以自己设置想要的int值

比如想要覆盖在状态栏之上,就设置个大于2001且小于2999的值就行

有一点要注意,api=23之后type要是=2000则需要一些权限才能使用,至于是什么权限我查了很多网页都没查出来,恐怕是ROOT权限吧

而且api=23之后,要正确设置token值才能使用,要注意哦

android 动态设置布局宽度

例如设置一个图片宽高 关键代码:

//取控件当前的布局参数

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) imageView.getLayoutParams();

//设置宽度值

params.width = dip2px(MainActivity.this, width);

//设置高度值

params.height = dip2px(MainActivity.this, height);

//使设置好的布局参数应用到控件

imageView.setLayoutParams(params);

1

2

3

4

5

6

7

8

1

2

3

4

5

6

7

8

高度除了可以设置成以上固定的值,也可以设置成wrap_content或match_content

ViewGroup.LayoutParams.WRAP_CONTENT

ViewGroup.LayoutParams.MATCH_PARENT

1

2

1

2

在这里插入图片描述

xml

其中一个view不显示控件,什么原因

原因

忘记在初始化内部元素之后进行 addView() 操作,这个问题是我经常犯的错误,因为没有将子控件添加到父控件上,所以导致自定义控件无法显示子控件

忘记设置子控件 LayoutParams 宽高,举个栗子:我们在new 一个 TextView 的时候,需要设置它的宽和高,我们可以通过以下方式来设置 TextView 的宽高:

RelativeLayout.LayoutParams lp = RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

这里需要注意一点,就是LayoutParams有很多种,每个布局类型都有一个,例如:RelativeLayout.LayoutParams, LinearLayout.LayoutParams…另外还有一个ViewGroup.LayoutParams,要使用哪一个LayoutParams要看你当前编写的子控件的父控件是什么,如果它(父控件)是一个LinearLayout,那么这个子空间就应该使用LinearLayout.LayoutParams,如果父控件不属于五大布局类型,那么就使用ViewGroup.LayoutParams。

子控件被其它控件所遮盖,如果我们在自定义组合控件的时候使用inflate引入外部layout布局,那么我们应该很少出现这种问题,但有时候我们需要使用代码初始化子控件,进行布局,这时候由于没有直观的显示,我们可能误操作将某些子控件的宽高设置不到位,进而影响它自身或周边控件的显示

子控件背景色和父控件背景色一样,这个时候其实我已经成功的编写好了自定义控件,但是我有一个自定义属性可以引入Drawable来设置我的自定义控件中的子控件,由于我引入的Drawable是一个白色图案,我的自定义控件背景色也是白色的,所以看起来会以为是自定义控件除了问题(没想到这种情况都让我遇到 -_-||)

以上就是我总结的一些可能导致自定义控件无法显示的原因,如果你有什么意见和建议,欢迎来留言讨论~

异常

在编写自定义控件的过程中,我也遇到过很多异常,这里谈一下还记得一些异常Exception:

at android.view.ViewGroup.resetResolvedLayoutDirection(ViewGroup.Java:6081)

出现这个异常其实是自定义控件在初始化过程中错误的添加了自身:addView(this), 我们需要将子控件进行addView添加操作,但是对自定义控件自身进行addView操作是错误的。

最后想起一件事情,那就是我们在 Android Studio 和 Eclipse 中的layout布局中使用自定义控件的时候,有的时候是可以预览layout布局的,正常显示自定义控件,但有的时候就不会显示或者显示旧版本的,这是因为,layout预览调用的时编译好的 Class 类,而我们刚刚编写或者修改的时候,其实并没有将自定义控件编译进去,这时候我们只要Build运行一下项目即可正常使用预览了。

android LayoutInflater产生view的LayoutParams属性为什么是null

android LayoutInflater产生view的LayoutParams属性是null

你给它指定的ParentView为null,

它当然有没有布局的信息了。

ViewGroup.MarginLayoutParams

layouts 的每个子 layout 信息都支持 margins。参考 ViewGroup Margin Layout Attributes 列举了该类支持的所有子 view 的属性。

android:layout_marginBotton

在该 view 的底边指定一个特定的空间。这个空间是在 view 边界的外部。margin 值应该是正数。

必须是一个具体的值,一个浮点数字加一个单位如『14.5sp』。可选的单位有:px(pixels 象素),dp(density-independent pixels 密度独立象素),sp(scaled pixels based on perferred font size 基于优选字体大小的缩放像素『一般用于设置字体大小』),mm(millimeters 毫米)。

也可能是对包含该类型值的资源或主题属性的引用。

这相当于全局属性资源符号 layout_marginBottom。

相关的方法:

setMargins(int,int,int,int)

android:layout_marginEnd

在该 view 的结束的一边指定一个特定的空间。这个空间是在 view 边界的外部。margin 的值应该是正数。

必须是一个具体的值,一个浮点数字加一个单位如『14.5sp』。可选的单位有:px(pixels 象素),dp(density-independent pixels 密度独立象素),sp(scaled pixels based on perferred font size 基于优选字体大小的缩放像素『一般用于设置字体大小』),mm(millimeters 毫米)。

也可能是对包含该类型值的资源或主题属性的引用。

这相当于全局属性资源符号 layout_marginEnd。

相关的方法:

setMarginEnd(int)

android_marginLeft

在该 view 的左边指定一个特定的空间。这个空间是在 view 边界的外部。margin 的值应该是正数。

必须是一个具体的值,一个浮点数字加一个单位如『14.5sp』。可选的单位有:px(pixels 象素),dp(density-independent pixels 密度独立象素),sp(scaled pixels based on perferred font size 基于优选字体大小的缩放像素『一般用于设置字体大小』),mm(millimeters 毫米)。

也可能是对包含该类型值的资源或主题属性的引用。

这相当于全局属性资源符号 layout_marginLeft。

相关的方法:

setMargins(int,int,int,int)

android:layout_marginRight

在该 view 的右边指定一个特定的空间。这个空间是在 view 边界的外部。margin 的值应该是正数。

必须是一个具体的值,一个浮点数字加一个单位如『14.5sp』。可选的单位有:px(pixels 象素),dp(density-independent pixels 密度独立象素),sp(scaled pixels based on perferred font size 基于优选字体大小的缩放像素『一般用于设置字体大小』),mm(millimeters 毫米)。

也可能是对包含该类型值的资源或主题属性的引用。

这相当于全局属性资源符号 layout_marginRight。

相关的方法:

setMargins(int,int,int,int)

android:layout_marginStart

在该 view 的开始的一边指定一个特定的空间。这个空间是在 view 边界的外部。margin 的值应该是正数。

必须是一个具体的值,一个浮点数字加一个单位如『14.5sp』。可选的单位有:px(pixels 象素),dp(density-independent pixels 密度独立象素),sp(scaled pixels based on perferred font size 基于优选字体大小的缩放像素『一般用于设置字体大小』),mm(millimeters 毫米)。

也可能是对包含该类型值的资源或主题属性的引用。

这相当于全局属性资源符号 layout_marginStart。

相关的方法:

setMarginStart(int)

android:layout_marginTop

在该 view 的上边指定一个特定的空间。这个空间是在 view 边界的外部。margin 的值应该是正数。

必须是一个具体的值,一个浮点数字加一个单位如『14.5sp』。可选的单位有:px(pixels 象素),dp(density-independent pixels 密度独立象素),sp(scaled pixels based on perferred font size 基于优选字体大小的缩放像素『一般用于设置字体大小』),mm(millimeters 毫米)。

也可能是对包含该类型值的资源或主题属性的引用。

这相当于全局属性资源符号 layout_marginTop。

相关的方法:

setMargins(int,int,int,int)

public int bottomMargin

以象素为单位的下边距。margin 值应该是正数。调用 setLayoutParams(LayoutParamsp) 方法后为这个值重新分配一个新的值。

public int leftMargin

以象素为单位的左边距。margin 值应该是正数。调用 setLayoutParams(LayoutParamsp) 方法后为这个值重新分配一个新的值。

public int rightMargin

以象素为单位的右边距。margin 值应该是正数。调用 setLayoutParams(LayoutParamsp) 方法后为这个值重新分配一个新的值。

public int topMargin

以象素为单位的上边距。margin 值应该是正数。调用 setLayoutParams(LayoutParamsp) 方法后为这个值重新分配一个新的值。

public ViewGroup.MarginLayoutParams(Context c,AttributeSet attrs)

创建一个新的布局参数集合。这些值是从提供的属性集合和 context 中提取的。

参数

c 应用的环境

attrs 来自于布局参数的属性集合

public ViewGroup.MarginLayoutParams(int width,int height)

public ViewGroup.MarginLayoutParams(ViewGroup.MarginLayoutParams source)

复制构造方法。克隆 source 的宽、高和 margin 值。

参数

source 克隆的对象

public int getLayoutDirection()

返回布局的方向。可以是 LAYOUT_DIRECTION_LTR 或是 LAYOUT_DIRECTION_RTL 。

返回值

int 布局的方向

public int getMarginEnd()

返回以象素为单位的结尾 margin 值。

相关的 XML 属性值

android:layout_marginEnd

返回值

int 以象素为单位的结尾 margin 值

public int getMarginStart()

返回以象素为单位的开始的 margin 值。

相关的 XML 属性值

android:layout_marginStart

返回值

int 以象素为单位的开始 margin 值

public boolean isMarginRelative()

检查 margin 是否相对。

相关的 XML 属性

android:layout_marginStart

android:layout_marginEnd

返回值

boolean marginStart 或 marginEnd 已经设定,返回 true

public void resolveLayoutDirection(int layoutDircetion)

由 requestLayout()方法调用。根据布局的方向可以重写左右 margin 的值。

参数

layoutDircetion 布局的方向值(int)

public void setLayoutDircetion(int layoutDirection)

设置布局的方向。

参数

layoutDirection 布局的方向。LAYOUT_DIRECTION_LTR 或是 LAYOUT_DIRECTION_RTL

public void setMarginEnd(int end)

设置相对结束 margin。margin 值应该是正数。

相关的 XML 属性

android:layout_marginEnd

参数

end 结束 margin 的值

public void setMarginStart(int start)

设置相对开始 margin。margin 值应该是正数。

相关的 XML 属性

android:layout_marginStart

参数

start 开始 margin 的值

public void setMargins(int left,int top,int right,int bottom)

设置 margin,以象素为单位。需要先调用 requestLayout() 方法,这样新的 margin 值才能被使用。根据布局的方向左右 margin 值可能会被重写。margin 值应该是正数。

相关的 XML 属性

android:layout_marginLeft

android:layout_marginTop

android:layout_marginRight

android:layout_marginBottom

参数

left 左 margin 值

top 上 margin 值

right 右 margin 值

bottom 下 margin 值

(责任编辑:IT教学网)

更多

推荐Dreamweaver教程文章