安卓自定义布局

Android自定义布局相关的一些笔记

这个笔记主要记录自己关于Android中自定义布局的相关操作的理解

仅布局

这个其实比较简单且好理解,只需要写好一个xml并且在另一个xml中引入就好了

  • 示例:自定义的xml “title.xml”

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorAccent"
    android:orientation="horizontal">

    <Button
    android:id="@+id/titleback"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:layout_height="wrap_content"
    android:text="返回"
    android:layout_gravity="left"/>

    <TextView
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="3"
    android:gravity="center"
    android:text="自定义布局" />

    <Button
    android:id="@+id/titleedit"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:layout_height="wrap_content"
    android:layout_gravity="right"
    android:text="自定义"
    />

    </LinearLayout>
  • 在其他布局中引入

    1
    <include layout="@layout/title"/>

非常简单

但是这样会存在一个问题,每次在引入自定义布局之后,如果想要有动态实现,都必须要重写里面的监听器方法,而许多按钮的方法是相同的,会浪费大量的时间在重复的事情上
所以需要通过代码新建自定义布局

通过代码新建自定义布局

  1. 通过代码新建自定义布局依然需要我们自己实现一个xml布局
  2. 然后编写一个普通的类(不是Acticity)继承各个基础Layout布局(取决于你xml中使用的布局)
  3. 重写其中的一个构造方法,在该方法中使用LayoutInflater进行动态渲染
  4. 看下代码中的注释吧
  • xml就是上面的title.xml
  • 通过代码新建,可以直接实现里面的方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    package com.example.ckxgo.listview;

    import android.app.Activity;
    import android.content.Context;
    import android.support.annotation.Nullable;
    import android.util.AttributeSet;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.widget.Button;
    import android.widget.LinearLayout;

    /**
    * Created by ckxgo on 2018/10/15.
    */

    public class TitleactLayout extends LinearLayout {
    public TitleactLayout(Context context) {
    super(context);
    }

    public TitleactLayout(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    //使用LayoutInflater的from方法获取一个上下文
    //通过Context类的inflate()方法渲染一个layout
    //合起来就写成这个样子
    //还可以添加一些方法
    LayoutInflater.from(context).inflate(R.layout.title,this);
    Button goBack = (Button) findViewById(R.id.titleback);
    Button goEdit = (Button) findViewById(R.id.titleedit);
    goBack.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v) {
    ((Activity)getContext()).finish();
    }
    });
    }
    }
  • 在layout中引入

    1
    2
    3
    4
    <com.example.ckxgo.listview.TitleactLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    </com.example.ckxgo.listview.TitleactLayout>