Android学习笔记-----详解3种常用布局

1、LinearLayout

(1)LinearLayout又称作线性布局,子对象水平排开或垂直排开;
android:orientation属性可以设置是水平方向线性排开还是垂直方向水平排开;
(2)android:layout_gravity属性用于指定控件在布局中的对齐方式;它的可选值和android:gravity(用于指定文字在控件中的对齐方式)差不多;需要注意的是,当LinearLayout排列方向是horizontal时,只有垂直方向的对齐方向才有效,因为此时水平方向上的长度是不固定的,每添加一个控件,水平方向上的长度都会改变,因而无法指定该方向上的对齐方式;反之,同;
(3)android:layout_weight比较有用的一个属性:比重
这个属性允许我们使用比例的方式来指定控件的大小,它在手机的适配性方面可以起到非常重要的作用;
比重:android:layout_weight =“1”,分割父级容器的比例,不写比重这个属性表示不参与父级容器的分割,会以内容为主;
在这里插入图片描述

简单小例子:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >
        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            />
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="前往"
            />
    </LinearLayout>
    <WebView
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />

</LinearLayout>

在这里插入图片描述

2、用代码控制子对象

用程序控制子对象的添加和删除
测试代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private LinearLayout root;
    private Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        root = new LinearLayout(this);//创建线性布局
        root.setOrientation(LinearLayout.VERTICAL);//设置布局方式为垂直布局
        setContentView(root);
        for(int i=0;i<10;i++) {
            btn = new Button(this);
            btn.setText("remove me");
            btn.setOnClickListener(this);
            //root.addView(btn);
            //root.addView(btn,300,200);//把子对象添加进来
            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            lp.weight = 1;//让其均匀分割父级容器
            root.addView(btn,lp);
        }

    }

    @Override
    public void onClick(View v) {
        root.removeView(v);
    }
}

3、RelativeLayout(相对布局)

后添加的控件会叠在上面,Button的优先级比较高;
它可以通过相对定位让控件出现在布局的任何位置,因此它的属性比较多;
控件可以相对于父布局来进行定位,也可以相对于控件来进行定位;
比如android:layout_alignParentLeft让控件和父布局的左上角对齐;
android:layout_above属性可以让一个控件在另一个控件的上方;
android:layout_alignLeft属性表示让一个控件的左边缘和另一个控件的左边缘对齐;

4、FrameLayout(作帧布局)

能调整的位置非常有限,它的功能用RelativeLayout是完全可以替代的,但相对于RelativeLayout比较轻量级,速度快;
android:layout_gravity可以来指定控件在属性中的对齐方式;由于定位方式的欠缺,FrameLayout应用场景相对少一些;

测试代码:
布局文件:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/root"
    tools:context=".FrameLayoutAty">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/img1"
        android:id="@+id/ivA"
        />
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/img2"
        android:visibility="invisible"
        android:id="@+id/ivB"
        />

java类文件:

public class FrameLayoutAty extends AppCompatActivity {
    private FrameLayout fl;
    private ImageView ivA,ivB;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_frame_layout_aty);

        fl = (FrameLayout) findViewById(R.id.root);
        ivA = findViewById(R.id.ivA);
        ivB = findViewById(R.id.ivB);

        showA();
        fl.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(ivA.getVisibility()==View.VISIBLE){
                    showB();
                }else {
                    showA();
                }

            }
        });
    }

    public void showA(){
        ivA.setVisibility(View.VISIBLE);
        ivB.setVisibility(View.INVISIBLE);
    }

    public void showB(){
        ivB.setVisibility(View.VISIBLE);
        ivA.setVisibility(View.INVISIBLE);
    }

}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值