安卓自定义布局

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

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

仅布局

这个其实比较简单且好理解,只需要写好一个xml并且在另一个xml中引入就好了
* 示例:自定义的xml “title.xml”

<?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>
  • 在其他布局中引入
<include layout="@layout/title"/>

非常简单

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

通过代码新建自定义布局

  1. 通过代码新建自定义布局依然需要我们自己实现一个xml布局
  2. 然后编写一个普通的类(不是Acticity)继承各个基础Layout布局(取决于你xml中使用的布局)
  3. 重写其中的一个构造方法,在该方法中使用LayoutInflater进行动态渲染
  4. 看下代码中的注释吧
  • xml就是上面的title.xml
  • 通过代码新建,可以直接实现里面的方法
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中引入
<com.example.ckxgo.listview.TitleactLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
</com.example.ckxgo.listview.TitleactLayout>

发表评论

电子邮件地址不会被公开。 必填项已用*标注