Android创建自定义控件

下面我们来学习创建自定义控件的两种简单的方法,创建一个UICustomViews项目

1 引入布局

引入布局可以解决重复造轮子的问题,让我们来学习一下吧。虽然Android为我们提供了标题栏,但这里我们先不使用它,而是创建一个自定义的标题栏。

新建一个布局title.xml,代码如下所示




    

可以看到,LinearLayout中我们加入了两个Button和一个TextView,左边的Button用于返回,右边的Button用于编辑,中间的TextView则可以显示一段标题文本。android:background可以用来指定布局或控件的背景,可以用图片或颜色进行填充。这里准备了三张图片

image

分别用于返回按钮、标题栏、编辑按钮的背景图片。现在标题栏布局已经写完,接下来就是如何在程序中使用了,修改activity_main.xml中的代码,如下所示



    
    


这里我们只需要用include语句把标题栏引进来就可以了,最后别忘了在MainActivity中将系统自带的标题栏隐藏掉,代码如下所示:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar actionBar = getSupportActionBar();
        if (actionBar!=null)
            actionBar.hide();
    }
}

先通过getSupportActionBar()获取到ActionBar实例,然后调用其hide()方法将标题栏隐藏,运行程序,效果如下所示

image

2 创建自定义控件

新建TitleLayout继承自LinearLayout,让它成为我们标题栏的自定义控件,代码如下所示

public class TitleLayout extends LinearLayout {
    public TitleLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        LayoutInflater.from(context).inflate(R.layout.title, this);
        Button titleBack =(Button) findViewById(R.id.title_back);
        Button titleEdit = (Button) findViewById(R.id.title_edit);
        titleBack.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                ((Activity)getContext()).finish();
            }
        });
        titleEdit.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getContext(), "You clicked Edit Button",Toast.LENGTH_SHORT);
            }
        });
    }
}

首先我们重写了LinearLayout中带有两个参数的构造函数,在布局中引入这个控件时就会调用这个构造函数。然后构造函数中需要对这个自定义标题栏进行动态加载,通过 LayoutInflaterfrom() 就可以构建出一个 LayoutInflater 对象,然后调用 inflate() 方法就可以动态加载一个布局文件。inflate() 有接收两个参数,第一个是要加载的布局文件的id,这里我们传入R.layout.title,第二个参数是给这个布局文件再加一个父布局,这里我们想要指定为LinearLayout,于是直接填入this。

现在自定义控件已经创建好了,现在我们要在布局文件中添加这个自定义控件。修改activity_main.xml中的代码,如下所示



    


添加自定义控件的方式和添加普通控件的方式基本是一样的,只不过这里需要写自定义控件的完整类名,包名在这里是不可以活省略的。

重新运行程序,你会发现此时的效果和使用引入布局方式的效果是一样的。

下面我们尝试为标题栏中的按钮注册点击事件。修改TitleLayout中的代码,如下所示

public class TitleLayout extends LinearLayout {
    public TitleLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        LayoutInflater.from(context).inflate(R.layout.title, this);
        Button titleBack =(Button) findViewById(R.id.title_back);
        Button titleEdit = (Button) findViewById(R.id.title_edit);
        titleBack.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                ((Activity)getContext()).finish();
            }
        });
        titleEdit.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getContext(), "You clicked Edit Button",Toast.LENGTH_SHORT);
            }
        });
    }
}

上面的代码不需要再过多的解释了吧,相信大家都能看懂。重新运行程序,效果如下图所示

image

内容参考自《第一行代码》

github代码

码云代码

个人网站:www.panbingwen.cn

你可能感兴趣的:(Android创建自定义控件)