自定义控件

电玩女神 2021-09-28 06:56 751阅读 0赞

目录

  • 引入布局
  • 创建自定义控件

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjcxNzkyOA_size_16_color_FFFFFF_t_70

所有的控件都是直接或间接继承自View,所用的所有的布局都是直接或间接继承自ViewGroup的。

一:引入布局

一般我们的程序可能有很多活动都需要这样的标题栏,但每个布局都编写一遍同样的标题栏代码,就会导致代码大量重复,可以使用引用布局解决这问题。

20190310222336830.png

创建一个布局,名字自己取

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="wrap_content">
  5. <Button
  6. android:layout_width="wrap_content"
  7. android:layout_height="wrap_content"
  8. android:layout_gravity="center"
  9. android:layout_margin="5dp"
  10. android:text="back" />
  11. <!--layout_gravity控件的对齐方式-->
  12. <!--layout_margin可以指定控件在上下左右方向上偏移的距离-->
  13. <TextView
  14. android:layout_width="0dp"
  15. android:layout_height="wrap_content"
  16. android:layout_gravity="center"
  17. android:layout_weight="1"
  18. android:gravity="center"
  19. android:text="好友列表"
  20. android:textSize="24sp"
  21. android:background="#454"/>
  22. <!--gravity文字对齐方式-->
  23. <Button
  24. android:layout_width="wrap_content"
  25. android:layout_height="wrap_content"
  26. android:layout_gravity="center"
  27. android:layout_margin="5dp"
  28. android:text="Edit" />
  29. <!--layout_gravity控件的对齐方式-->
  30. </LinearLayout>

在这里添加一句代码

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <include layout="@layout/title"/>
  6. </LinearLayout>

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjcxNzkyOA_size_16_color_FFFFFF_t_70 1

最后在MainActivity加上代码将系统自带的标题栏隐藏掉

  1. //调用getSupportActionBar方法获得ActionBar的实例
  2. ActionBar actionBar = getSupportActionBar();
  3. if (actionBar != null){
  4. actionBar.hide(); //将标题栏隐藏
  5. }

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjcxNzkyOA_size_16_color_FFFFFF_t_70 2

二:创建自定义控件

还是同理引用布局,要每个控件都编写一次事件会麻烦,可以使用自定义控件的方式来解决。

20190310231904365.png

  1. package com.example.testone;
  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.util.AttributeSet;
  5. import android.util.Log;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.widget.Button;
  9. import android.widget.LinearLayout;
  10. public class TitleLayout extends LinearLayout{
  11. //重写TitleLayout构造函数
  12. public TitleLayout(Context context, AttributeSet attrs){
  13. super(context,attrs);
  14. //对布局进行动态加载
  15. //通过LayoutInflater的from方法构建一个LayoutInflater对象,然后调用inflate方法动态加载一个布局文件
  16. //第一个参数是要加载的布局文件的id,第二个是给加载好的布局再添加一个父布局,这里我们指定为TitleLayout,于是直接传入this
  17. LayoutInflater.from(context).inflate(R.layout.title,this);
  18. }
  19. }

自定义控件创建好了,还要在布局文件中添加这个自定义控件,修改这里的代码

20190310232203472.png

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <!--要指明控件的完整类名,包名在这里是不可以省略的-->
  6. <com.example.testone.TitleLayout
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"/>
  9. </LinearLayout>

为标题栏添加点击事件

  1. package com.example.testone;
  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.util.AttributeSet;
  5. import android.util.Log;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.widget.Button;
  9. import android.widget.LinearLayout;
  10. /**
  11. * Created by AUSU on 2019/3/10.
  12. */
  13. public class TitleLayout extends LinearLayout{
  14. //重写TitleLayout构造函数
  15. public TitleLayout(Context context, AttributeSet attrs){
  16. super(context,attrs);
  17. //对布局进行动态加载
  18. //通过LayoutInflater的from方法构建一个LayoutInflater对象,然后调用inflate方法动态加载一个布局文件
  19. //第一个参数是要加载的布局文件的id,第二个是给加载好的布局再添加一个父布局,这里我们指定为TitleLayout,于是直接传入this
  20. LayoutInflater.from(context).inflate(R.layout.title,this);
  21. Button titleBack = (Button) findViewById(R.id.back);
  22. Button titleEdit = (Button) findViewById(R.id.edit);
  23. titleBack.setOnClickListener(new OnClickListener() {
  24. @Override
  25. public void onClick(View v) {
  26. ((Activity)getContext()).finish();
  27. }
  28. });
  29. titleEdit.setOnClickListener(new OnClickListener() {
  30. @Override
  31. public void onClick(View v) {
  32. Log.d("MainActivity","这里执行成功");
  33. }
  34. });
  35. }
  36. }

点击back是退出,点击edit 在控制台显示这个消息

20190310232549989.png

发表评论

表情:
评论列表 (有 0 条评论,751人围观)

还没有评论,来说两句吧...

相关阅读

    相关 定义编程

    摘要 本文分析了Visaul C++中自定义控件DLL的编程方法,以交通灯为例编 制一个自定义控件DLL,并介绍了客户应用程序中使用自定义控件的方法。 关健字 自