有时候,可能觉得系统提供的控件太丑,就会需要自定义控件来实现自己想要的效果。

以下主要参考《第一行代码》

1.自定义一个标题栏:

系统自带的标题栏很丑,且没什么大的作用,所以我们之前会在onCreate()中调用requestWindowFeature(Window.FEATURE_NO_TITLE);设置不显示标题栏。

下面自定义一个标题栏,中间显示标题,左右各有一个按钮:

title.xml:

 <?xml version="1.0" encoding="utf-8"?>

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

     android:layout_width="match_parent"

     android:layout_height="wrap_content"

     android:orientation="horizontal"

     android:background="#bbbbbb" >

     <Button

         android:id="@+id/btn_back"

         android:text="@string/back"

         android:layout_width="wrap_content"

         android:layout_height="wrap_content"

         android:layout_margin="5dp"

         android:layout_gravity="left|center_vertical"

         android:textColor="#0099cc"

         android:layout_weight="1"/>

     <TextView

         android:id="@+id/title"

         android:layout_width="wrap_content"

         android:layout_height="wrap_content"

         android:textSize="20sp"

         android:textColor="#0099cc"

         android:text="@string/this_is_title"

         android:layout_gravity="center"

         android:gravity="center"

         android:layout_weight="2"/>

     <Button

         android:id="@+id/btn_edit"

         android:layout_width="wrap_content"

         android:layout_height="wrap_content"

         android:text="@string/edit"

         android:layout_margin="5dp"

         android:layout_gravity="right|center_vertical"

         android:textColor="#0099cc"

         android:layout_weight="1"/>

 </LinearLayout>

Activity代码:

 protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);     

            requestWindowFeature(Window.FEATURE_NO_TITLE);

            setContentView(R.layout.title);

 }

运行结果:

(⊙o⊙)…有点丑哈,不过仔细看,还是有点像标题栏的。

2.复用布局代码:

想让这个标题栏应用在以后的每个布局文件,要怎么做呢?

总不能每次都把这些xml代码重写一遍吧。

android布局中提供了类似于c预处理指令#include的<include>标签,可以实现布局代码的复用。

下面新建一个first_layout.xml:

 <?xml version="1.0" encoding="utf-8"?>

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

     android:layout_width="match_parent"

     android:layout_height="match_parent"

     android:orientation="vertical" >

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

     <Button android:id="@+id/btn"

         android:text="@string/i_m_a_button"

         android:layout_width="wrap_content"

         android:layout_height="wrap_content"

         android:layout_gravity="center_horizontal"/>

 </LinearLayout>

修改setContentView(R.layout.first_layout);

显示结果:

现在Back和Edit按钮都没有任何事件处理的,怎样实现点击Back按钮就结束当前Activity呢?方法跟之前的做法完全一样,使用findViewById()根据id找到Back按钮,然后设置click事件监听即可。

代码如下:

 public class FirstActivity extends Activity {

       @Override

       protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);     

            requestWindowFeature(Window.FEATURE_NO_TITLE);

            setContentView(R.layout.first_layout);

            Button btn = (Button) findViewById(R.id.btn_back);

            btn.setOnClickListener(new OnClickListener() {

                  @Override

                  public void onClick(View v) {

                       // TODO Auto-generated method stub

                       FirstActivity.this.finish();

                  }

            });

       }

 }

布局文件的复用已然通过<include>实现了,但是每次都要重新写事件监听,还是觉得麻烦……到这里一般就会想到抽象出一个自定义类,每次需要的时候,直接使用该自定义类不就行了,其实就是自定义控件的做法了。

3.自定义控件,复用功能代码

TitleLinearLayout.java代码:

 public class TitleLinearLayout extends LinearLayout {

       public TitleLinearLayout(Context context, AttributeSet attrs) {

            super(context, attrs);

            LayoutInflater.from(context).inflate(R.layout.title, this);

            Button btn_back = (Button) findViewById(R.id.btn_back);

            btn_back.setOnClickListener(new OnClickListener() {

                  @Override

                  public void onClick(View v) {

                       // TODO Auto-generated method stub

                       Log.i("clicked","back");

                       ((Activity)getContext()).finish();

                  }

            });

       }

 }

继承自LinearLayout,实现带两个参数的构造方法。在构造方法中,加载布局文件,并对其中的Back按钮进行事件监听设置。

LayoutInflater.from(context).inflate(R.layout.title, this);用于动态加载布局文件。

注意到,Activity中有一个获取LayoutInflater的方法,所以,也可以使用下面一行代码加载布局文件:

((Activity)context).getLayoutInflater().inflate(R.layout.title, this);这种方法,在Activity代码中比较常用,而这里需要进行类型强转,反倒麻烦点,而且不如第一个方法安全。

如何使用自定义的控件呢?

first_layout代码如下:

 <?xml version="1.0" encoding="utf-8"?>

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

     android:layout_width="match_parent"

     android:layout_height="match_parent"

     android:orientation="vertical" >

     <cn.csc.custom_ui.TitleLinearLayout

         android:layout_width="match_parent"

         android:layout_height="wrap_content">

     </cn.csc.custom_ui.TitleLinearLayout>

     <Button android:id="@+id/btn"

         android:text="@string/i_m_a_button"

         android:layout_width="wrap_content"

         android:layout_height="wrap_content"

         android:layout_gravity="center_horizontal"/>

 </LinearLayout>

说明:

1)在布局文件中,引用自定义的控件,需要使用完整的类限定名,即包名.类名的方式;

2)在定义控件中,设置属性时,使用alt+/进行代码提示补全功能将经常不可用,标签名可以先设置为内置控件,然后进行属性的设置,之后再把标签名改回到自定义的控件的完整限定名即可。

android菜鸟学习笔记13----Android控件(二) 自定义控件简单示例的更多相关文章

  1. Android开发学习笔记-自定义组合控件的过程

    自定义组合控件的过程 1.自定义一个View 一般来说,继承相对布局,或者线性布局 ViewGroup:2.实现父类的构造方法.一般来说,需要在构造方法里初始化自定义的布局文件:3.根据一些需要或者需 ...

  2. Android开发学习笔记-自定义组合控件

    为了能让代码能够更多的复用,故使用组合控件.下面是我正在写的项目中用到的方法. 1.先写要组合的一些需要的控件,将其封装到一个布局xml布局文件中. <?xml version="1. ...

  3. WPF-学习笔记 动态修改控件Margin的值

    原文:WPF-学习笔记 动态修改控件Margin的值 举例说明:动态添加一个TextBox到Grid中,并设置它的Margin: TextBox text = new TextBox(); t_gri ...

  4. Android自动化学习笔记之MonkeyRunner:官方介绍和简单实例

    ---------------------------------------------------------------------------------------------------- ...

  5. android菜鸟学习笔记14----Android控件(三) ListView的简单使用

    MVC模式: MVC的基本原理就是通过Controller连接View和Model.当View中所显示的数据发生变化时,会通知Controller,然后由Controller调用Model中的相关方法 ...

  6. android菜鸟学习笔记12----Android控件(一) 几个常用的简单控件

    主要参考<第一行代码> 1.TextView: 功能与传统的桌面应用开发中的Label控件相似,用于显示文本信息 如: <TextView android:layout_width= ...

  7. Android学习笔记_30_常用控件使用

    一.状态栏通知(Notification): 如果需要查看消息,可以拖动状态栏到屏幕下方即可查看消息.发送消息的代码如下: public void sendNotice(View v){ int ic ...

  8. android 学习笔记四:控件

    1.android:gravity 指定控件的基本位置,比如居中.居右等位置 Top:顶部 bottom:底部 left:居左 right:居右 center_vertical:垂直居中 center ...

  9. android菜鸟学习笔记30----Android使用百度地图API(一)准备工作及在应用中显示地图

    1.准备工作: 百度地图API是免费开放的,但是需要申请API Key: 1)先注册一个百度开发者帐号 2)进入百度开放服务平台http://developer.baidu.com/ 3)进入LBS云 ...

随机推荐

  1. Ubuntu 16.04安装深度的Wine(deepin-wine 1.9.0)

    说明: 1.使用的Wine版本是深度出品(Deepin),已经精简了很多没用的配置,使启动能非常快,占用资源小. 2.提取自QQ和迅雷安装包,如果安装了这个Wine不成功,可能是依赖问题,再试多几次, ...

  2. EasyMvc入门教程-基本控件说明(12)栏目导航

    栏目导航一般用来显示当前页面所在的模块层级位置关系,如下图所示: 当然也有前端网站作为小栏目导航,凡是没有绝对,只要不违和就好:),下面上代码: @{ var data = new List<N ...

  3. 用户空间和内核空间通讯之【Netlink 中】

    原文地址:用户空间和内核空间通讯之[Netlink 中] 作者:wjlkoorey258 今天我们来动手演练一下Netlink的用法,看看它到底是如何实现用户-内核空间的数据通信的.我们依旧是在2.6 ...

  4. django中日志使用学习记录

    在setting中加入以下代码 LOGGING = { 'version': 1, 'disable_existing_loggers': True, 'formatters': { 'verbose ...

  5. python核心编程学习(第三版)之网络编程

    套接字 套接字是计算机网络数据结构.在任何类型的通信开始之前,网络应用程序必须创建套接字. 有两种类型的套接字,基于文件和面向网络的. unix套接字是第一个家族,AF_UNIX代表地址家族,缩写AF ...

  6. hdu 5381 The sum of gcd(线段树+gcd)

    题目链接:hdu 5381 The sum of gcd 将查询离线处理,依照r排序,然后从左向右处理每一个A[i],碰到查询时处理.用线段树维护.每一个节点表示从[l,i]中以l为起始的区间gcd总 ...

  7. 2017.2.15 开涛shiro教程-第二十一章-授予身份与切换身份(一) table、entity、service、dao

    原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第二十一章 授予身份与切换身份(一) 1.使用场景 某个领导因为某 ...

  8. 「工具」Dubbo可视化测试工具的设计和实现

    「工具」Dubbo可视化测试工具的设计和实现 学习了:https://blog.csdn.net/qq355667166/article/details/78914453

  9. WIFI NVRAM WARNING不同数字的含义

    1. NVRAM WARNING的意义 Wi-Fi Driver会去侦測手机上 MT6620 Wi-Fi NVRAM的状况,假设侦測结果有错误的话,会把 Error Code显示在SCAN Resul ...

  10. GEM演唱会

    周六去魔都看邓紫棋演唱会,各位看官可能要问.杭州不是也有嚒.为嘛去魔都-..由于po主是逗比哈哈(- ̄▽ ̄-) 早上睡到自然醒,然后開始做午饭.吃完躺沙发上看电视,看到一点多认为应该要出发了(演唱会7 ...