Android应用开发—LayoutParams的用法

Android应用开发—TextView的动态创建 这篇文章讲到了“TextView控件布局位置的控制”,主要依赖于RelativeLayout.LayoutParams的使用,本文简单介绍下LayoutParams的用法

注:本文大部分内容参考android,利用layoutParams代码动态布局空间位置总结:代码中添加LinearLayout和RelativeLayout布局 或者是一份copy,之所以这里重新“写”一遍,主要是那篇文章的样式布局,实在有点不太好看。

LayoutParams介绍:

LayoutParams继承于Android.View.ViewGroup.LayoutParams。LayoutParams相当于一个Layout的信息包,它封装了Layout的位置、高、宽等信息。假设在屏幕上一块区域是由一个Layout占领的,如果将一个View添加到一个Layout中,最好告诉Layout用户期望的布局方式,也就是将一个认可的layoutParams传递进去。

可以这样去形容LayoutParams,在象棋的棋盘上,每个棋子都占据一个位置,也就是每个棋子都有一个位置的信息,如这个棋子在4行4列,这里的“4行4列”就是棋子的LayoutParams。

但LayoutParams类也只是简单的描述了宽高,宽和高都可以设置成三种值:

  • 一个确定的值。
  • MATCH_PARENT,即填满(和父容器一样大小)。
  • WRAP_CONTENT,即包裹住组件就好。
setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
                    LayoutParams.FILL_PARENT));

上面的代码其实是子对父的,也就是说,父布局下的子控件要设置这句话。
因为布局很多,虽然都继承至ViewGroup但是各个布局还是有很大的不同。
很显然上面这句应该这样写才算准确:

setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT,
                    TableRow.LayoutParams.FILL_PARENT));

这表示这个子控件的父布局是一个TableRow, 这样的LayoutParams 太多,所以应明确指明。

下面分别说下两个常用到布局:

  • FrameLayout下动态设置子控件居中,动态用JAVA代码要这样实现:
FrameLayout.LayoutParams lytp = new FrameLayout.LayoutParams(80,LayoutParams.WRAP_CONTENT);
lytp.gravity = Gravity.CENTER;
btn.setLayoutParams(lytp);
  • RelativeLayout下动态设置子控件居中:
RelativeLayout.LayoutParams lp=new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
                            LayoutParams.WRAP_CONTENT); 
lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE); 
lp.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE); 
btn1.setLayoutParams(lp);

在ANDROID 开发中,有时候我们需要在后台动态添加布局文件,这里我们来说一下后台添加LinerLayout布局和RelativeLayout文件的方式:

LinearLayout 布局:

线性布局,组件以垂直或水平方向线性排列。 android.widget.LinearLayout有个继承自android.view.ViewGroup.LayoutParams 的内嵌类LayoutParams,使用这个类的实例调用 LinearLayout.addView 就可以实现“线性布局”。

首先我们需要定义一个LinearLayout的布局参数params,如下:

  • 方式一:指定高、宽
LinearLayout.LayoutParams params = new LinearLayout.LayoutParam(LayoutParams.FILL_PARENT,
                                    LayoutParams.WRAP_CONTENT)
  • 方式二:指定高、宽、权重,其中LayoutParams中的两个参数分别为:子控件的高、宽。
LinearLayout.LayoutParams params = new LinearLayout.LayoutParam(LayoutParams.FILL_PARENT,
                                    LayoutParams.WRAP_CONTENT, weight)

设置控件相对于容器本身的位置:

LinearLayout.LayoutParams.gravity = 
Gravity.NO_GRAVITY/Gravity.TOP/Gravity.BOTTOM/Gravity.LEFT/Gravity.RIGHT

RelativeLayout布局:

RelativeLayout布局,是以“相对”位置/对齐为基础的布局方式。android.widget.RelativeLayout 有个继承自android.view.ViewGroup.LayoutParams 的内嵌类 LayoutParams,使用这个类的实例调用 RelativeLayout.addView 就可以实现“相对布局”。

首先我们需要定义一个 RelativeLayout的布局参数relLayoutParams,如下:

RelativeLayout.LayoutParams relLayoutParams=new RelativeLayout.LayoutParam(LayoutParams.FILL_PARENT,
                            LayoutParams.WRAP_CONTENT)

其中LayoutParams中两个参数分别为:子控件的宽(width),子控件的高(height),除了可以为LayoutParams.FILL_PARENT(android.view.ViewGroup.LayoutParams)等系统常量外还可以是数值,比如400。

  • 通过LayoutParams的 addRule方法来额外的添加别的规则:
android.widget.RelativeLayout.LayoutParams.addRule(int verb, int anchor)

其中 anchor 参数指定可以是 View 的 id(“相对于谁”)。RelativeLayout.TRUE(启用某种对齐方式)或者是-1(应用于某些不需要 anchor 的 verb)[因为 RelativeLayout.TRUE的值为 -1 ,所以-1或者RelativeLayout.TRUE都是可以是 0 (不启用这个规则)

其中 verb 参数指定相对的“动作”:
1. 如果是相对于父控件的相对布局的话 anchor 参数可以不用或者设置为-1或者RelativeLayout.TRUE。
2. 如果是相对于级别和自己同一级的控件的话参数设置应该是 view 的id。
3. 如果参数设置为 0 的话,则表示这个规则不会运用到该控件的布局中,当是相对于本身的父控件的时候这个参数可以省略。
eg:

relLayoutParams.addRule(RelativeLayout.ABOVE,imageViewId.getId())    
// 子控件相对于控件:imageViewId在其的上面
relLayoutParams.addRule(RelativeLayout.BELOW ,imageViewId.getId())  
// 子控件相对于控件:imageViewId在其的下面
relLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, -1) 与
relLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE) 与
relLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT )  
// 表示的是一样的表示子控件在父控件的右边
// 离某元素的左、上、右、下的距离单位
relLayoutParams.setMargins(arg0, arg1, arg2, arg3) relLayoutParams.topMargin=5

RelativeLayout的相关变量:

relLayoutParams.alignWithParent=true   如果对应的兄弟元素找不到的话就以父元素做参照物
RelativeLayout.CENTER_HORIZONTAL   在父控件中水平居中
RelativeLayout.CENTER_VERTICAL   在父控件中垂直居中
RelativeLayout.CENTER_IN_PARENT  相对于父控件完全居中
RelativeLayout.ALIGN_PARENT_BOTTOM  紧贴父控件的下边缘
RelativeLayout.ALIGN_PARENT_TOP  紧贴父控件的上边缘
RelativeLayout.ALIGN_PARENT_LEFT 紧贴父控件的左边边缘
RelativeLayout.ALIGN_PARENT_RIGHT  紧贴父控件的右边缘

RelativeLayout.ABOVE  在某元素的上方  需要第二个参数为某元素的ID
RelativeLayout.BELOW 在某元素的下方  需要第二个参数为 某元素的ID
RelativeLayout.LEFT_OF  在某元素的左边  需要第二个参数为某元素的ID
RelativeLayout.RIGHT_OF  在某元素的右边  需要第二个参数为 某元素的ID
RelativeLayout.ALIGN_TOP 本元素的上边缘和某元素的的上边缘对齐 需要第二个参数为某元素的ID
RelativeLayout.ALIGN_BOTTOM  本元素的上边缘和某元素的的下边缘对齐 需要第二个参数为某元素的ID
RelativeLayout.ALIGN_LEFT  本元素的上边缘和某元素的的左边缘对齐 需要第二个参数为某元素的ID
RelativeLayout.ALIGN_RIGHT  本元素的上边缘和某元素的的右边缘对齐 需要第二个参数为某元素的ID
RelativeLayout.ALIGN_BASELINE    本元素的基线和某元素的的基线对齐 需要第二个参数为某元素的ID
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Java开发中,你可以通过设置Activity的Window属性来实现应用层面的状态栏屏蔽。具体来说,你可以使用`Window`类的`setFlags`方法来控制Window的标志位,从而实现隐藏状态栏。 以下是一个示例代码,演示如何隐藏状态栏: ```java import android.os.Build; import android.os.Bundle; import android.view.View; import android.view.WindowManager; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 隐藏状态栏 hideStatusBar(); // 设置布局 setContentView(R.layout.activity_main); } private void hideStatusBar() { // 检查Android版本是否大于等于API 16(Android 4.1) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { // 隐藏状态栏(全屏模式) getWindow().setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN ); } } } ``` 在这个示例中,我们在`onCreate`方法中调用了`hideStatusBar`函数来隐藏状态栏。在`hideStatusBar`函数中,我们首先检查Android版本是否大于等于API 16(Android 4.1)。如果是,我们使用`setFlags`方法设置全屏模式,隐藏状态栏。 需要注意的是,隐藏状态栏会导致应用全屏显示,状态栏不可见。这样做可能会影响用户体验,因为状态栏通常包含一些重要的系统信息(如时间、电量、网络连接等)。因此,在决定隐藏状态栏时,建议考虑用户需求和应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值