在Android中用纯Java代码布局
感谢大佬: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代码布局的更多相关文章
- Android 使用纯Java代码布局
java布局 java代码布局和xml布局的区别 1.Java纯布局更加的灵活,比如自定义控件或一些特殊要求时,使用java代码布局 2.常用的xml布局是所见即所得的编写方式,以及xml本身拥有一些 ...
- 基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置
经过<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1) - 数据源与事务管理>和<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - ...
- android中在java代码中设置Button按钮的背景颜色
android中在java代码中设置Button按钮的背景颜色 1.设置背景图片,图片来源于drawable: flightInfoPanel.setBackgroundDrawable(getRes ...
- DataX通过纯Java代码启动
DataX是阿里巴巴团队开发的一个很好开源项目,但是他们对如何使用只提供了python命令启动方式,这种方式对于只是想简单的用下DataX的人来说很是友好,仅仅需要几行代码就可以运行,但是如果你需要在 ...
- 帧动画的创建方式 - 纯Java代码方式
废话不多说,先看东西 帧动画的创建方式主要以下2种: * 用xml创建动画: * 纯Java代码创建动画: 本文内容主要关注 纯java代码创建帧动画 的方式: 用xml创建帧动画:http:// ...
- Android Studio编写运行测试纯java代码可带main()函数
问题 小伙伴们在做安卓项目的时候,是不是有时候会忘记某些api的使用方法,不太确定他们的结果是怎样的,需要写一些测试代码,验证看看我们的写法是否正确.刚开始的时候我是在页面上写一个Button,添加点 ...
- 转--Android如何在java代码中设置margin
======== 3 在Java代码里设置button的margin(外边距)? 1.获取按钮的LayoutParams LinearLayout.LayoutParams layoutParams ...
- Android如何在java代码中设置margin
习惯了直接在xml里设置margin(距离上下左右都是10dip),如: <ImageView android:layout_margin="10dip" android:s ...
- 【Android】通过Java代码替换TabHost中的drawableTop资源
在博客 http://blog.csdn.net/jueblog/article/details/11837445 中的Tab选项卡中, 点击相应的Tab选项,图标没有发生改变. 这些资源图片也没有尽 ...
随机推荐
- <数据结构>图的最小生成树
目录 最小生成树问题 Prim算法:点贪心 基本思想:类Dijstra 伪代码 代码实现 复杂度分析:O(VlogV + E) kruskal算法:边贪心 基本思想: 充分利用MST性质 伪代码 代码 ...
- Java的generator工具类,数据库生成实体类和映射文件
首先需要几个jar包: freemarker-2.3.23.jar log4j-1.2.16.jar mybatis-3.2.3.jar mybatis-generator-core-1.3.2.ja ...
- emqx的一个配置参数
这个参数尝试改为internal后,所有用户都可以匿名登录
- Qos 0/1/2的理解
Qos 0/1/2的理解 Qos 0 最多一次的传输 消息是基于TCP/IP网络传输的.没有回应,在协议中也没有定义重传的语义.消息可能到达服务器1次,也可能根本不会到达. Qos 1 至少一次的传输 ...
- SpringBoot 之 国际化
增加国际化i18n语言配置: # src/main/resources/i18n/login.properties login.btn=登录 # src/main/resources/i18n/log ...
- SpringBoot 之 Dao层模拟数据库操作
单表操作: # src/main/java/com/wu/dao/DepartmentDao .java @Repository public class DepartmentDao { privat ...
- linux分区(挂载)
主分区: 最多4个扩展分区: 最多一个: 扩展分区+主分区最多4个: 不能存放数据,只能划分逻辑分区逻辑分区: 可格式化.存放数据: 分区编号只能从5开始(1.2.3.4编号为主分区或扩展分区) 所有 ...
- NOSQL数据库之MongoDB
一.NoSQL概述 如今,大多数的计算机系统(包括服务器.PC.移动设备等)都会产生庞大的数据量.其实,早在2012年的时候,全世界每天产生的数据量就达到了2.5EB(艾字节,).这些数据有很大一部 ...
- Kube-OVN 1.2.0发布,携手社区成员打造高性能容器网络
Kube-OVN 1.2.0 新版本如期而至,支持 Vlan 和 OVS-DPDK 两种类型的高性能网络接口.本次发布得益于社区的壮大,感谢Intel爱尔兰开发团队与锐捷网络开发团队持续积极参与Kub ...
- RootersCTF2019 I ♥ Flask
最近也是一直在做ssti方面的题目,我发现了两款比较好用的工具,一个是arjun(用来探测参数),另一个是Tplmap(用来探测ssti漏洞),我们这里以一道题目为例来演示一下 题目 我们拿到题目 分 ...