安卓实战开发Day03 2020.7.31

内容

1.在Activity中使用线性布局
2.在Activity中使用相对布局
3.在Activity中使用约束布局
4.结论

一.在Activity中使用线性布局

1.层级关系 1

2

2.具体代码
package com.example.yongdaimagoujianyemian

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import androidx.core.view.marginTop

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //setContentView(R.layout.activity_main)

        addLinearLayoutKotlin()
    }

    //添加线性布局(Kotlin)
    fun addLinearLayoutKotlin(){
        val container = LinearLayout(this).apply {
            //设置宽高
            layoutParams = LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.MATCH_PARENT
            )

            //设置布局方向
            orientation = LinearLayout.VERTICAL

            //为方便观察,设置背景颜色
            background = getDrawable(R.color.colorPrimary)
        }.also {
            setContentView(it)
        }

        //创建第一个子控件,为横向布局的LinearLayout
        LinearLayout(this).apply {
            //设置宽高
            //默认情况下,在代码中写的尺寸都是pix,也就是像素,当代码中写 100时就相当于100px
            //但是运行起来在手机上显示的也是100px,但是手机有不同的分辨率Density
            //密度/分辨率就是 1个dp有多少个px
            //比如某个手机分辨率/密度为1,则对应的像素就是100dp = 100px
            //如果某个手机分辨率为2,则对应的值就是50dp        = 100px/2
            //若密度为4,则对应的值就是25dp,也就是分辨率*dp = px
            layoutParams = LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.MATCH_PARENT,
                    dpTopx(100)
            )

            //设置布局方向
            orientation = LinearLayout.HORIZONTAL

            //为方便观察,设置背景颜色
            background = getDrawable(R.color.colorPrimaryDark)
        }.also {
            //将当前子控件添加到父容器中
            container.addView(it)
        }.apply {
            //添加图片
            ImageView(this@MainActivity).apply {
                layoutParams = LinearLayout.LayoutParams(
                        dpTopx(100),
                        LinearLayout.LayoutParams.MATCH_PARENT
                )

                //设置是哪一张图片
                setImageResource(R.drawable.ic_launcher_foreground)

                //将图片添加到控件中
                addView(this)
            }

            //添加标题
            TextView(this@MainActivity).apply {

                layoutParams = LinearLayout.LayoutParams(
                        0,
                        LinearLayout.LayoutParams.MATCH_PARENT
                ).apply {
                    weight = 1f
                    setMargins(dpTopx(30),dpTopx(20),dpTopx(30),dpTopx(20))
                }

                text = "what are you 弄啥嘞"

                //设置字体颜色
                setTextColor(getColor(R.color.colorWhite))
                textSize = 20f
                addView(this)
            }
        }

        //创建第二个子控件TextView
        TextView(this).apply {

            layoutParams = LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.MATCH_PARENT
            ).apply {
                setMargins(dpTopx(30),dpTopx(20),dpTopx(30),dpTopx(20))
            }

            text = "这里是文件的内容"

            //设置字体颜色
            setTextColor(getColor(R.color.colorWhite))
            textSize = 20f

            background = getDrawable(R.color.colorPrimary)

            container.addView(this)
        }



    }
    //添加线性布局(Java)
    fun addLinearLayoutJava(){
        //1.创建线性布局
        val linearlayout = LinearLayout(this)//上下文写this即可

        //2.给布局设置长和宽
        linearlayout.layoutParams = LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT)

        //3.设置布局方向
        linearlayout.orientation = LinearLayout.VERTICAL

        //为方便观察,添加一个背景颜色
        linearlayout.background = getDrawable(R.color.colorAccent)

        //4.将布局添加到Activity中
        setContentView(linearlayout)

    }

    //写一个能将dp转换为px的方法
    fun dpTopx(dp: Int): Int{
        return (resources.displayMetrics.density).toInt() * dp
    }
}
3.效果

3

二.在Activity中使用相对布局

1.总览图

4

2.效果图

6

3.具体代码

掌握addRule

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //setContentView(R.layout.activity_main)

        addRelativeLayoutKotlin()
    }

    //添加相对布局
    fun addRelativeLayoutKotlin(){
         //创建RelativeLayout容器
        val relativeLayout = RelativeLayout(this).apply {
            //设置ID
            id = R.id.mContainer

            //设置宽高
            layoutParams = RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.MATCH_PARENT,
                    RelativeLayout.LayoutParams.MATCH_PARENT
            )

            //为方便观察,设置背景颜色
            background = getDrawable(R.color.colorPrimaryDark)

            //将此容器添加到Activity
            setContentView(this)
        }

        //添加图像
        ImageView(this).apply {
            //为了后面调整相对位置的方便,在这里加上ID
            id = R.id.mHeader

            //设置宽和高
            layoutParams = RelativeLayout.LayoutParams(dpTopx(120),dpTopx(100)).apply {
                //设置它与父容器的位置关系
                //这里只用了margin,并没有用到 “相对”
                setMargins(dpTopx(10),dpTopx(15),0,0)//右边和下边根本不用设置
            }

            //设置图片来源
            setImageResource(R.drawable.ic_launcher_background)

            //设置图片上下不会出现空白,而是占满整个控件区域的
            scaleType = ImageView.ScaleType.CENTER_CROP

            //添加到容器中,也就是那个相对布局中
            relativeLayout.addView(this)
        }

        //添加标题
        TextView(this).apply {
            //加上id
            id = R.id.mTitle

            layoutParams = RelativeLayout.LayoutParams(0,0).apply {
                //设置标题的相对布局
                //在图像的左边
                addRule(RelativeLayout.RIGHT_OF,R.id.mHeader)//第一个参数是如何对齐,第二个参数是和谁
                //和父容器的右边对齐
                addRule(RelativeLayout.ALIGN_PARENT_END,R.id.mContainer)
                //和图像的顶部对齐
                addRule(RelativeLayout.ALIGN_TOP,R.id.mHeader)
                //和图像的下边对齐
                addRule(RelativeLayout.ALIGN_BOTTOM,R.id.mHeader)

                //设置一下和左右的间距
                marginStart = dpTopx(20)
                marginEnd = dpTopx(20)
            }
            //为方便观察,设置背景颜色
            //background = getDrawable(R.color.colorPrimaryDark)

            text = "这里是标题"
            setTextColor(getColor(R.color.colorWhite))
            textSize = 30f
            //把此标题加入到容器中
            relativeLayout.addView(this)
        }

        //添加文本内容
        TextView(this).apply {
            layoutParams = RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.MATCH_PARENT,0
            ).apply {
                //顶部对齐图片的底部
                addRule(RelativeLayout.BELOW,R.id.mHeader)
                //底部对齐父容器的地步
                addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,R.id.mContainer)
                //左边对齐图片的左边
                addRule(RelativeLayout.ALIGN_START,R.id.mHeader)
                //右边对齐标题控件的右边
                addRule(RelativeLayout.ALIGN_END,R.id.mTitle)
            }

            text = "这里是内容"
            textSize = 50f
            setTextColor(getColor(R.color.colorPrimary))

            //为方便观察,换个背景颜色
            background = getDrawable(R.color.colorWhite)

            //把此标题加入到容器中
            relativeLayout.addView(this)
        }
    }


    //写一个能将dp转换为px的方法
    fun dpTopx(dp: Int): Int{
        return (resources.displayMetrics.density).toInt() * dp
    }
}

三.在Activity中使用约束布局

1.具体代码
package com.example.yongdaimagoujianyemian

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.RelativeLayout
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.marginBottom
import androidx.core.view.marginTop
import java.lang.invoke.ConstantCallSite

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //setContentView(R.layout.activity_main)

        addConstraintLayoutKotlin()
    }

    //添加约束布局
    fun addConstraintLayoutKotlin(){
        val constraintLayout = ConstraintLayout(this).apply {
            id = R.id.mContainer

            layoutParams = ConstraintLayout.LayoutParams(
                    ConstraintLayout.LayoutParams.MATCH_PARENT,
                    ConstraintLayout.LayoutParams.MATCH_PARENT
            )

            //设置背景颜色
            background = getDrawable(R.color.colorWhite)

            //添加到activity
            setContentView(this)
        }
        //创建图片
        ImageView(this).apply {
            id = R.id.mHeader

            layoutParams = ConstraintLayout.LayoutParams(
                    dpTopx(120),
                    dpTopx(90)
            ).apply {
                //设置约束
                topToTop = R.id.mContainer
                leftToLeft = R.id.mContainer

                setMargins(dpTopx(10),dpTopx(10),0,0)
            }

            //设置图片来源
            setImageResource(R.drawable.ic_launcher_background)

            //将此控件添加到容器中
            constraintLayout.addView(this)
        }

        //创建标题
        TextView(this).apply {
            id = R.id.mTitle

            layoutParams = ConstraintLayout.LayoutParams(
                  ConstraintLayout.LayoutParams.WRAP_CONTENT,
                  ConstraintLayout.LayoutParams.WRAP_CONTENT
            ).apply {
                //设置约束
                leftToRight = R.id.mHeader
                topToTop = R.id.mContainer
                rightToRight = R.id.mContainer
                bottomToBottom = R.id.mHeader

                //设置距离
                setMargins(dpTopx(10),0,dpTopx(10),0)
            }

            text = "这是标题"
            textSize = 30f

            constraintLayout.addView(this)
        }

        //创建内容
        TextView(this).apply {
            layoutParams = ConstraintLayout.LayoutParams(
                    ConstraintLayout.LayoutParams.MATCH_CONSTRAINT,
                    ConstraintLayout.LayoutParams.MATCH_CONSTRAINT
            ).apply {
                leftToLeft = R.id.mContainer
                rightToRight = R.id.mTitle
                topToBottom = R.id.mHeader
                bottomToBottom = R.id.mContainer

                setMargins(0,dpTopx(10),0,0)
            }

            text = "这里是内容"
            textSize = 50f

            constraintLayout.addView(this)
        }
    }

    //写一个能将dp转换为px的方法
    fun dpTopx(dp: Int): Int{
        return (resources.displayMetrics.density).toInt() * dp
    }
}
2.效果展示

7

四.结论

我们发现在Activity里面写布局非常的麻烦,所以以后尽量使用xml布局界面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值