在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();
        }
    });
 }
}

效果如下图:
在这里插入图片描述

原文地址:https://www.cnblogs.com/tfxz/p/12621707.html