Android 代码动态修改RelativeLayout布局

浪人 等级 1029 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布局的问题。

收藏
评论区

相关推荐

Android开发 常见异常和解决办法(一)
Android Studio是Android开发的理想工具,但是由于版本的更新和配置的差异,会出现很多问题,下面是以《第一行代码 第二版》为基础进行开发学习可能遇见的一些问题及其解决办法。 1.Android Studio 3.0及以上版本找不到Android Device Monitor: 解决办法: (1)在Android Studio中打开终端,如下
Android 代码动态修改RelativeLayout布局
Android 代码动态修改RelativeLayout布局前言有时我们会遇到在xml布局文件中设置好界面后,但是又需要从代码中进行动态布局修改。 之前从网上寻找了好多资料,看到的都是新建一个布局文件 但是我的需求又是从当前布局文件的基础上进行修改。 下面用一个示例大家介绍一个比较简单的办
Java后端部署以及与Android通信注意事项
1 概述 ==== 本文列举了一些`Android`+后端`Java`通信/部署时的问题以及注意事项,覆盖的问题包括但不限于安全组、数据库、路径等,如果各位读者的`Android`端不能正常访问`Java`后端,希望这里的解决方案能帮助到您。 2 分类 ==== 这里将问题分为三类: * `Java`端问题 * `Android`端问题 *
java版本springcloud+springboot+mybatis 分布式 微服务 多租户 电子商务 直播带货 短视频带货 社交电商平台
涉及平台:平台管理(包含自营店面)、商家端(PC端、手机端)、买家平台(PC端、H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 核心架构:Spring Cloud、Spring Boot、Mybatis、Redis、SFTP 前端框架:VUE、Uniapp、Bootstrap/H5/CSS3、IOS、Android、小程
java编程中使用二进制进行权限或状态控制
直接看代码以及注释吧。 @Test public void main() { // PC WEB端 int pc = 1 << 0;// ...0001=1 // Android端 int android = 1 <<
2020年了,Android后台保活还有戏吗?看我如何优雅的实现!
1、引言 ======= 对于移动端IM应用和消息推送应用的开发者来说,Android后台保活这件事是再熟悉不过了。 自从Android P(即Android 8.0)出现以后,Android已经从系统层面将后台保活这条路给堵死了(详见:《[Android P正式版即将到来:后台应用保活、消息推送的真正噩梦](https://www.oschina
2020年了,Android后台保活还有戏吗?看我如何优雅的实现!
1、引言 ======= 对于移动端IM应用和消息推送应用的开发者来说,Android后台保活这件事是再熟悉不过了。 自从Android P(即Android 8.0)出现以后,Android已经从系统层面将后台保活这条路给堵死了(详见:《[Android P正式版即将到来:后台应用保活、消息推送的真正噩梦](https://www.oschina
Andriod SDK Manager国内无法更新的解决方案
由于GWF,使用android sdk manager无法更新了,另外android源码也下载不了,幸而国内有很多开源镜像,可以帮助我们解决这些问题 1\. 如何更新Android SDK Manager 设置代理host为mirrors.neusoft.edu.cn,端口为80,即可正常同步 ![](http://static.oschina.net
Android Wear来袭,极客学院全球首发破解可穿戴系统系列课程
![](http://static.oschina.net/uploads/space/2014/0403/141247_Qz6G_1582301.jpg) 3月18日谷歌公司正式宣布发布Android Wear,矛头直指可穿戴设备。 Android系统在手机、平板电脑端的统治地位已经毋庸置疑,它的延展性和易用性也一直都受业界好评,而Android We
Android 容器控件
### **1、SlidingDrawer:** 提供抽屉式效果,支持水平和竖直两种布局方式,继承自ViewGroup。由handle和content两个子视图组成,父控件必须是FrameLayout或者RelativeLayout。 事例如下: <?xml version="1.0" encoding="utf-8"?> <Fram
Android+Spring Boot 选择+上传+下载文件
2021.02.03更新 ============ 1 概述 ==== 前端`Android`,上传与下载文件,使用`OkHttp`处理请求,后端使用`Spring Boot`,处理`Android`发送来的上传与下载请求。这个其实不难,就是特别多奇奇怪怪的坑,因此,就一句话, 希望各位读者能少走弯路。 2 环境 ==== * `Win10` *
Android加载网络图片
AndroidManifest.xml文件中加入以下权限设置:     <uses-permission android:name="android.permission.INTERNET" />     <uses-permission android:name="android.permission.WRITE\_EXTERNAL\_STORAGE
Android学习系列笔记(五)
##Android基础网络第二天 1 post方式提交数据乱码的解决 ================= 一般在公司开发客户端和服务端的编码要保持一致。 android端的默认编码是utf-8; 做url请求时需要对参数进行URLEncode编码. URL url = new URL("http://1
Android音乐播放器开发(6)—歌曲播放列表
1\. 说明 ------ 本文很早就开始写了,不过中间把电脑借给小伙伴了,后来就忘了这件事了… 内容已同步到[Gitee仓库](https://gitee.com/Sjcun/android-MusicPlayer) 以往的文章 * 服务端:[Android音乐播放器开发–服务端](https://www.oschina.net/action/
Kotlin Hello World
1 Kotlin ======== Kotlin是一种在JVM上运行的静态类型编程语言,被称为Android界的Wsift,由JetBrains设计。Kotline可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行。Google宣布在Google I/O 2017上宣布Kotlin成为Android官方语言。 笔者不