感谢大佬:https://www.jianshu.com/p/7aedea560f16

在Android中用纯Java代码布局

本文的完成了参考了一篇国外的教程,在此表示感谢。

Android中的界面布局主要有两种方式,一种是xml文件和Java代码结合的布局方式,一种是完全依靠Java代码布局。

两种布局方式的比较

对于第一种方式,大多数人都比较熟悉,在这里就不细说了。这种方式的好处包括代码的解耦,图形化的布局界面,清晰明了,布局完后可以立马得到反馈,还有xml格式自身带来的优点。

对于第二种方式它最大的好处就是可以在运行的过程中动态地改变界面,用xml的布局是静态的。并且对于xml布局中的大部分属性都有相对应的Java方法来进行设置。

好,下面开始看怎么用Java代码布局

关于Layout Parameters

Layout Parameters决定了你的view相对于父view和兄弟view的位置,我们通常通过ViewGroup.LayoutParams来进行设置

关于ID

我们在用xml布局的时候有时候需要设置好ID,比如相对布局设置位置的时候要根据ID来设置,同样,在Java布局方式中有setId方法和getId方法来进行设置和获取。

关于dp和px

为了达到更好的显示效果,我们在xml布局的时候通常会采用dp作为单位,来设置控件的大小,但是在Java代码中,我们的方法接收传入参数是按照px来设置的,所以如果你想设置某控件的宽度为200dp,那么,你需要提前把它转化为px单位下的宽度,然后再进行设置。

更加详细的内容在代码中进行了展示,配合有详细的注解说明。

import android.app.Activity;
import android.content.res.Resources;
import android.graphics.Color;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RelativeLayout; public class OnlyJavaLayoutActivity extends Activity {
private boolean clicked = false;
private Button myButton;
private EditText myEditText; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); //定义两个控件,button和edittext
myButton = new Button(this);
myButton.setText("Press me"); myEditText = new EditText(this);
myEditText.setHint("See me"); //为空间设置ID
myButton.setId(1);
myEditText.setId(2); //定义好父容器并设置相关属性
RelativeLayout myLayout = new RelativeLayout(this);
myLayout.setBackgroundColor(Color.BLUE); //设置Button的布局参数
RelativeLayout.LayoutParams buttonParams =
new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT); buttonParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
buttonParams.addRule(RelativeLayout.CENTER_VERTICAL); //设置EditText的布局参数
RelativeLayout.LayoutParams textParams =
new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT); textParams.addRule(RelativeLayout.ABOVE, myButton.getId());
textParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
textParams.setMargins(0, 0, 0, 80);//这里的80是px //设置EditText的宽度为指定大小宽度,要相应的dp转化为px
Resources r = getResources();
int px = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 200, r.getDisplayMetrics()); myEditText.setWidth(px);
//将布局添加到父容器中
myLayout.addView(myButton, buttonParams);
myLayout.addView(myEditText, textParams); //设置显示父容器
setContentView(myLayout); //为Button设置点击事件,点击使其变宽
final int wrapWidth = myButton.getLayoutParams().width;
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//点击Button之后使其宽度变宽,再次点击恢复之前的wrap_content状态,可以配合属性动画使其变化更加自然
if (!clicked) {
myButton.getLayoutParams().width = 800;
} else {
myButton.getLayoutParams().width = wrapWidth;
}
clicked = !clicked;
myButton.requestLayout();
}
});
}
}

效果如下图:

在Android中用纯Java代码布局的更多相关文章

  1. Android 使用纯Java代码布局

    java布局 java代码布局和xml布局的区别 1.Java纯布局更加的灵活,比如自定义控件或一些特殊要求时,使用java代码布局 2.常用的xml布局是所见即所得的编写方式,以及xml本身拥有一些 ...

  2. 基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置

    经过<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1) - 数据源与事务管理>和<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - ...

  3. android中在java代码中设置Button按钮的背景颜色

    android中在java代码中设置Button按钮的背景颜色 1.设置背景图片,图片来源于drawable: flightInfoPanel.setBackgroundDrawable(getRes ...

  4. DataX通过纯Java代码启动

    DataX是阿里巴巴团队开发的一个很好开源项目,但是他们对如何使用只提供了python命令启动方式,这种方式对于只是想简单的用下DataX的人来说很是友好,仅仅需要几行代码就可以运行,但是如果你需要在 ...

  5. 帧动画的创建方式 - 纯Java代码方式

    废话不多说,先看东西 帧动画的创建方式主要以下2种: * 用xml创建动画: * 纯Java代码创建动画:   本文内容主要关注 纯java代码创建帧动画 的方式: 用xml创建帧动画:http:// ...

  6. Android Studio编写运行测试纯java代码可带main()函数

    问题 小伙伴们在做安卓项目的时候,是不是有时候会忘记某些api的使用方法,不太确定他们的结果是怎样的,需要写一些测试代码,验证看看我们的写法是否正确.刚开始的时候我是在页面上写一个Button,添加点 ...

  7. 转--Android如何在java代码中设置margin

    ========  3 在Java代码里设置button的margin(外边距)? 1.获取按钮的LayoutParams LinearLayout.LayoutParams layoutParams ...

  8. Android如何在java代码中设置margin

    习惯了直接在xml里设置margin(距离上下左右都是10dip),如: <ImageView android:layout_margin="10dip" android:s ...

  9. 【Android】通过Java代码替换TabHost中的drawableTop资源

    在博客 http://blog.csdn.net/jueblog/article/details/11837445 中的Tab选项卡中, 点击相应的Tab选项,图标没有发生改变. 这些资源图片也没有尽 ...

随机推荐

  1. docker学习:docker容器数据卷

    是什么 docker的理念 将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的 容器之间希望有可能共享数据 docker容器产生的数据,如果不通过docker ...

  2. Drools集成SpringBoot

    1.说明 为了更好的在项目中使用Drools, 需要把Drools集成到Spring Boot, 下面介绍集成的方法, 并且开发简单的Demo和测试用例. 2.创建Maven工程 pom.xml工程信 ...

  3. .net core系列源码地址介绍

    很早就想写.net core相关教程内容了,但是一方面感觉东西太多了,一方面是太懒了,最近才下定决心,一定要写点东西出来,希望能支持一下国内.net 的尴尬处境 好了,先从.net core开源开始吧 ...

  4. Django在使用logging日志模块时报错无法操作文件 logging error Permission Error [WinError 32]

    产生原因: 这个问题只会在开发的时候遇到,而且配置是写入到setting.py配置文件,我们定义了日志文件大小,当日志满了的时候,这时候就会遇到这个问题, 因为在使用Pycharm运行django的时 ...

  5. 初识python: 回调函数

    回调函数 简单理解就是:将一个函数通过参数的形式传递给另一个函数 #!/user/bin env python # author:Simple-Sir # time:2019/8/9 10:49 # ...

  6. SSM实现支付宝支付

    学习支付宝支付 一.支付宝测试环境代码测试 1.下载电脑网站的官方demo: 下载地址:https://docs.open.alipay.com/270/106291/ 2.下载解压导入eclipse ...

  7. Anaconda3+CUDA10.1+CUDNN7.6+TensorFlow2.6安装(Ubuntu16)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. Java的JDBC

    第一个JDBC程序 创建测试数据库 CREATE DATABASE jdbcStudy CHARACTER SET utf8 COLLATE utf8_general_ci; USE jdbcStud ...

  9. ADD software version display

    ADD software version display ADD software version display1. Problem Description2. Analysis3. Solutio ...

  10. css3中transition属性详解

    css3中通过transition属性可以实现一些简单的动画过渡效果~ 1.语法 transition: property duration timing-function delay; transi ...