Android 代码动态修改RelativeLayout布局

浪人 等级 353 0 0

Android 代码动态修改RelativeLayout布局

前言

有时我们会遇到在xml布局文件中设置好界面后,但是又需要从代码中进行动态布局修改。
之前从网上寻找了好多资料,看到的都是新建一个布局文件
但是我的需求又是从当前布局文件的基础上进行修改。
下面用一个示例大家介绍一个比较简单的办法。

演示

该例子主要是使用RelativeLayout布局,放置两个TextView,点击切换按钮进行切换,永远有一个TextView保持屏幕中间。

Android 代码动态修改RelativeLayout布局

例子.gif

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/background_dark"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <RelativeLayout
        android:id="@+id/relativeLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/text_small"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:layout_marginEnd="6dp"
            android:text="主页面"
            android:textColor="@color/deeppink"
            android:textSize="22sp" />
        <TextView
            android:id="@+id/text_big"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginStart="6dp"
            android:layout_toEndOf="@id/text_small"
            android:text="子页面"
            android:textColor="@color/white"
            android:textSize="12sp" />
    </RelativeLayout>
    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="切换" />
</LinearLayout> 

MainActivity.java

 public class MainActivity extends AppCompatActivity {
    //    TextView
    private TextView text_small;
    private TextView text_big;
    //    布局参数
    private RelativeLayout.LayoutParams params_small;
    private RelativeLayout.LayoutParams params_big;
    //    切换按钮
    private Button btn;
    //    切换标识
    private boolean check = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text_small = findViewById(R.id.text_small);
        text_big = findViewById(R.id.text_big);
        btn = findViewById(R.id.btn);
//        获取TextView的布局参数
        params_small = (RelativeLayout.LayoutParams) text_small.getLayoutParams();
        params_big = (RelativeLayout.LayoutParams) text_big.getLayoutParams();
//          按钮切换
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (check) {
//                    切换子页面
                    smallModeSwitch();
                    check = false;
                } else {
//                    切换主页面
                    bigModeSwitch();
                    check = true;
                }
            }
        });
    }

    /**
     * 修改布局
     *
     * @date: 2021/1/28 16:07
     * @author: SiYuan Jiao
     */
    private void bigModeSwitch() {
//        设置字体及颜色
        text_big.setTextSize(22);
        text_big.setTextColor(Color.parseColor("#ff1493"));
        text_small.setTextSize(12);
        text_small.setTextColor(Color.WHITE);
//        删除主页面居中效果
        params_small.removeRule(RelativeLayout.CENTER_HORIZONTAL);
//        添加主页面对于子页面的相对位置
        params_small.addRule(RelativeLayout.START_OF, R.id.text_big);
//        设置主页面应用此效果
        text_small.setLayoutParams(params_small);
//        添加子页面居中效果
        params_big.addRule(RelativeLayout.CENTER_HORIZONTAL);
//        删除原有相对主页面的位置
        params_big.removeRule(RelativeLayout.END_OF);
//        子页面应用此效果
        text_big.setLayoutParams(params_big);
    }

    private void smallModeSwitch() {
        text_small.setTextSize(22);
        text_small.setTextColor(Color.parseColor("#ff1493"));
        text_big.setTextSize(12);
        text_big.setTextColor(Color.WHITE);


        params_big.removeRule(RelativeLayout.CENTER_HORIZONTAL);
        params_big.addRule(RelativeLayout.END_OF, R.id.text_small);
        text_big.setLayoutParams(params_big);
        params_small.addRule(RelativeLayout.CENTER_HORIZONTAL);
        params_small.removeRule(RelativeLayout.START_OF);
        text_small.setLayoutParams(params_small);
    }

} 

结束

其中主要是通过getLayoutParams()方法获取当前布局信息,使用removeRule()删除不要的属性,使用addRule()添加需要的属性值,最后使用setLayoutParams进行应用配置。
通过以上的例子,应该能解决动态代码修改RelativeLayout布局的问题。

收藏
评论区

相关推荐

js动态生成二维码
需求:项目需要根据链接实时生成二维码,当检测终端是PC时,将当前项目链接生成二维码供用户手机端使用 判断终端是否为mobile function isMobile () { let flag navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile
Android深入浅出之Binder机制
Android深入浅出之Binder机制 一 说明 Android系统最常见也是初学者最难搞明白的就是Binder了,很多很多的Service就是通过Binder机制来和客户端通讯交互的。所以搞明白Binder的话,在很大程度上就能理解程序运行的流程。 我们这里将以MediaService的例子来分析Binder的使用: ServiceMan
AT大牛带你深度剖析Android 10大开源框架
做了几年的Android开发,也面试过不少公司,被面试过,也面试过不少人,其实Android的技术真的是无边界,不管你做过多牛的项目,不管你多久的经验在Android开发中不可能是停滞不前的,需要不断的学习及总结,否则难以解公关技术问题,下面把我压箱底的视频资料贡献给大家; 一,android视频教程 Android视频教程: 1,Android入门
Android Service 流程分析
启动Service过程 Android Service启动时序图 (https://imghelloworld.osscnbeijing.aliyuncs.com/039313fdaaf1e7dea3bde222b3ec9934.png) Android Service启动时序图.png 上图就是Android
Android开发 常见异常和解决办法(一)
Android Studio是Android开发的理想工具,但是由于版本的更新和配置的差异,会出现很多问题,下面是以《第一行代码 第二版》为基础进行开发学习可能遇见的一些问题及其解决办法。 1.Android Studio 3.0及以上版本找不到Android Device Monitor: 解决办法: (1)在Android Studio中打开终端,如下
Android 自学必备网站
一,Android 自学网站给 Android 自学者朋友推荐几个自学网站:1. Android Developers作为一个Android开发者,官网的资料当然不可错过,从设计,培训,指南,文档,都不应该错过,在以后的学习过程中慢慢理解体会。网站:https://developer.android.com/2. Android专业中文社区Android专业
Android 代码动态修改RelativeLayout布局
Android 代码动态修改RelativeLayout布局前言有时我们会遇到在xml布局文件中设置好界面后,但是又需要从代码中进行动态布局修改。 之前从网上寻找了好多资料,看到的都是新建一个布局文件 但是我的需求又是从当前布局文件的基础上进行修改。 下面用一个示例大家介绍一个比较简单的办
理解Android.bp
介绍Android最新的编译系统 一、简介早期的Android系统都是采用Android.mk的配置来编译源码,从Android 7.0开始引入Android.bp。很明显Android.bp的出现就是为了替换掉Android.mk。再来说一说跟着Android版本相应的发展演变过程: Android 7.0引入ninja和kati
Android AOSP基础(一)VirtualBox 安装 Ubuntu
AOSP基础 Android框架层本文首发于微信公众号「刘望舒」 前言在Android进阶三部曲第二部《Android进阶解密》的第一章,我介绍了两种阅读源码的方式,其中一种是从百度网盘:https://pan.baidu.com/s/1ngsZs 将源码下载下来,然后用SouceInsight来查看,这种方式很便捷,适合去阅读源码,但是有两个弊端,一个是无
Android AOSP基础(三)Android系统源码的整编和单编
AOSP基础 Android框架层本文首发于微信公众号「刘望舒」 前言在上一篇文章中,我们顺利的将AOSP下载了下来,很多时候我们不仅仅需要去查看源码,还有以下的几个需求: 动态调试Android系统源码 定制Android系统 将最新版本的Android系统刷入到自己的Android设备中 将系统源码导入到Android Studio中为了实现这些需求,就
Android深入理解JNI(一)JNI原理与静态、动态注册
Android框架层 Android深入理解JNI Android框架层本文首发于微信公众号「刘望舒」 前言JNI不仅仅在NDK开发中应用,它更是Android系统中Java与Native交互的桥梁,不理解JNI的话,你就只能停留在Java Framework层。这一个系列我们来一起深入学习JNI。<!more 1.JNI概述Android系统按语言来划分的
Android深入四大组件(一)应用程序启动过程(前篇)
Android框架层 Android深入四大组件categories: Android框架层本文首发于微信公众号「后厂技术官」 前言在此前的文章中,我讲过了Android系统启动流程和Android应用进程启动过程,这一篇顺理成章来学习Android 7.0的应用程序的启动过程。分析应用程序的启动过程其实就是分析根Activity的启动过程。<!more 1
Android深入四大组件(六)Android8.0 根Activity启动过程(前篇)
Android框架层 Android深入四大组件categories: Android框架层本文首发于微信公众号「刘望舒」 前言在几个月前我写了和这两篇文章,它们都是基于Android 7.0,当我开始阅读Android 8.0源码时发现应用程序(根Activity)启动过程照Android 7.0有了一些变化,因此又写下了本篇文章,本篇文章照此前的文章不仅
Android深入四大组件(七)Android8.0 根Activity启动过程(后篇)
Android框架层 Android深入四大组件categories: Android框架层本文首发于微信公众号「刘望舒」 前言在几个月前我写了和这两篇文章,它们都是基于Android 7.0,当我开始阅读Android 8.0源码时发现应用程序(根Activity)启动过程照Android 7.0有了一些变化,因此又写下了本篇文章,本篇文章照此前的文章不仅
Android解析WindowManagerService(一)WMS的诞生
Android框架层 Android系统服务 WindowManagerService Android框架层本文首发于微信公众号「后厂技术官」 前言此前我用多篇文章介绍了WindowManager,这个系列我们来介绍WindowManager的管理者WMS,首先我们先来学习WMS是如何产生的。本文源码基于Android 8.0,与Android 7.1.2