Android 自定义组件

2
回复
18144
查看
[复制链接]

2

主题

433

帖子

2830

安币

Android大神

Rank: 6Rank: 6

QQ达人

发表于 2014-6-6 16:01:51 | 显示全部楼层 |阅读模式
Android api 给我们提供了丰富的控件供我们调用。但有时一个控件无法满足我们的需求,这就要求我们同时使用两个三个或者个更多的控件一起使用。有些常用的组合我就把他写成一个自定的的控件,这样就方便了以后自己的使用。本人新手。研究一天,写出来的组件,虽然实现了自己想要的效果,但代码应该还有很多不足的地方。希望大家指导一下。写本帖是为防止自己忘记。第一步我先写了一个布局文件my_title.xml里面放着我经常用到的几个控件。
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="50dip"
  5.     android:id="@+id/my_title_layout"
  6.     android:orientation="horizontal" >
  7.    
  8.     <Button
  9.         android:id="@+id/my_titlt_left_btn"
  10.         android:layout_width="60dip"
  11.         android:layout_height="fill_parent"
  12.         android:background="#00000000"
  13.         android:text="返回"
  14.         />
  15.     <TextView
  16.         android:id="@+id/my_title_middle_text"
  17.         android:layout_height="fill_parent"
  18.         android:layout_width="wrap_content"
  19.         android:layout_weight="1"
  20.         android:gravity="center"
  21.         android:textColor="#f00"
  22.         android:textSize="20sp"
  23.         android:text="我是标题栏"
  24.         />
  25.     <Button
  26.         android:id="@+id/my_title_right_btn"
  27.         android:layout_height="fill_parent"
  28.         android:layout_width="60dip"
  29.         android:background="#00ffffff"
  30.         android:text="删除"
  31.         />
  32. </LinearLayout>
复制代码

第二步,为了方便封装后设置某些属性,因此我们要为该组件添加一些自定义属性!在values文件夹下新建attrs.xml文件。
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3.     <declare-styleable name="myTitle">
  4.         <attr name="background" format="reference|color"/>
  5.         <attr name="middlebackground" format="reference|color"/>
  6.         <attr name="btnleftbackground" format="reference|color"/>
  7.         <attr name="btnrightbackground" format="reference|color"/>
  8.     </declare-styleable>
  9. </resources>
复制代码
第三步,我们新建一个类并继承于LinearLayout在这个类里面引用上面的布局文件my_title.xml。并在里面定义一些我们要用到的方法,和初始化我们自定义的属性。
  1. package com.Jett.mytitle;

  2. import android.content.Context;
  3. import android.content.res.TypedArray;
  4. import android.util.AttributeSet;
  5. import android.view.LayoutInflater;
  6. import android.widget.Button;
  7. import android.widget.LinearLayout;
  8. import android.widget.TextView;

  9. public class MyTitleView extends LinearLayout {

  10.         private LinearLayout ll;
  11.         private Button btnleft,btnright;
  12.         private TextView middletext;
  13.        
  14.         //构造函数
  15.         public MyTitleView(Context context) {
  16.                 this(context, null);
  17.                 // TODO Auto-generated constructor stub
  18.         }
  19.         public MyTitleView(Context context, AttributeSet attrs) {
  20.                 super(context, attrs);
  21.                 //初始化控件属性
  22.                 LayoutInflater.from(context).inflate(R.layout.my_title,this,true);
  23.                
  24.                 ll = (LinearLayout)this.findViewById(R.id.my_title_layout);
  25.                 btnleft = (Button)this.findViewById(R.id.my_titlt_left_btn);
  26.                 btnright = (Button)this.findViewById(R.id.my_title_right_btn);
  27.                 middletext = (TextView)this.findViewById(R.id.my_title_middle_text);
  28.                
  29. //初始化
  30.                 TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.myTitle);
  31.                 //设置标题栏颜色和中间颜色(默认没有颜色)
  32.                 setBackground(a.getColor(R.styleable.myTitle_background,0));        
  33.                 setMiddleTextBackgroundColoe(a.getColor(R.styleable.myTitle_middlebackground,0));
  34.                 //设置左右按钮的背景图片(默认没有背景图片)
  35.                 setBtnLeftBackground(a.getResourceId(R.styleable.myTitle_btnleftbackground,0));
  36.                 setBtnRightBackground(a.getResourceId(R.styleable.myTitle_btnrightbackground,0));
  37.                
  38.                 //同步一下属性
  39.                 a.recycle();
  40.         }
  41.         //设置显示的文字
  42.         public void setBtnLeftText(String text)
  43.         {
  44.                 btnleft.setText(text);
  45.         }
  46.         public void setBtnRightText(String text)
  47.         {
  48.                 btnright.setText(text);
  49.         }
  50.         public void setMiddleText(String text)
  51.         {
  52.                 middletext.setText(text);
  53.         }
  54.         //设置背景颜色
  55.         public void setBackground(int resId)
  56.         {
  57.                 ll.setBackgroundColor(resId);
  58.         }
  59.         public void setMiddleTextBackgroundColoe(int color)
  60.         {
  61.                 middletext.setBackgroundColor(color);
  62.         }
  63.         //设置左右按钮的背景图片
  64.         public void setBtnLeftBackground(int resId)
  65.         {
  66.                 btnleft.setBackgroundResource(resId);
  67.         }
  68.         public void setBtnRightBackground(int resId)
  69.         {
  70.                 btnright.setBackgroundResource(resId);
  71.         }
  72.        
  73.         //设置左右按钮的点击事件
  74.         public void setLeftOnClick(OnClickListener clickListener)
  75.         {
  76.                 btnleft.setOnClickListener(clickListener);
  77.         }
  78.         public void setRightOnClick(OnClickListener clickListener)
  79.         {
  80.                 btnright.setOnClickListener(clickListener);
  81.         }
  82. }
复制代码
写到这我们自定义的组件其实已经写好了。下面就是如何使用了。
首先我们在布局文件里面引用。使用自定义属性需要加入xmlns:mytitle="http://schemas.android.com/apk/res/com.Jett.mytitle" 红色字体随便写,不过下面要用来调用自定义属性。蓝色字体是包名。
下面绿色代码是自定义的按钮点击样式。
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
复制代码
还有就是在Activity 里面设置一些组件方法
  1. package com.Jett.mytitle;

  2. import android.os.Bundle;
  3. import android.view.View;
  4. import android.widget.Toast;
  5. import android.app.Activity;
  6. import android.graphics.Color;

  7. public class MainActivity extends Activity {
  8.         private MyTitleView mytitle;
  9.         @Override
  10.         protected void onCreate(Bundle savedInstanceState) {
  11.                 super.onCreate(savedInstanceState);
  12.                 setContentView(R.layout.activity_main);
  13.                
  14.                 mytitle = (MyTitleView)this.findViewById(R.id.Mian_mytitle);

  15.                 mytitle.setMiddleText("标题");
  16.                 mytitle.setBtnRightText("右侧");
  17.                 mytitle.setLeftOnClick(new View.OnClickListener() {                       
  18.                         @Override
  19.                         public void onClick(View v) {
  20.                                 // TODO Auto-generated method stub
  21.                                 Toast.makeText(MainActivity.this, "你点击了左侧按钮!", 1).show();
  22.                         }
  23.                 });
  24.         }
  25. }
复制代码
这样就好了,对了把按钮样式也贴出来一下吧。
在res文件夹下新建文件夹drawable在给文件夹下新建文件mytitle_btn_style.xml。
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
  3.     <!-- 按钮按下 -->
  4.     <item android:state_pressed="true">
  5.         <shape>
  6.             <!-- 填充颜色 -->
  7.                     <solid
  8.                         android:color="#1a6d99"/>
  9.                     <!-- 间隔 -->
  10.                         <padding android:left="0dp" android:right="0dp"
  11.                                android:top="0dp" android:bottom="0dp"/>
  12.                        
  13.         </shape>
  14.     </item>
  15.    
  16.     <item android:state_enabled="true">
  17.             <shape>
  18.                         <!-- 间隔 -->
  19.                         <padding android:left="0dp" android:right="0dp"
  20.                                android:top="0dp" android:bottom="0dp"/>
  21.                         <!-- 填充 -->
  22.                     <solid
  23.                         android:color="#2aa9f4"/><!-- 填充的颜色 -->
  24.                 </shape>
  25.         </item>
  26. </selector>
复制代码
到此我们自定义的组件就完成了。可以方便以后我们项目中的使用。
效果如下:











本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

1

主题

120

帖子

1355

安币

Android大神

Rank: 6Rank: 6

发表于 2014-7-28 22:23:09 | 显示全部楼层
谢谢分享,奇怪了,下载的可以运行,按照上面的步骤新建的一运行就直接退出了,还没找出不同点

0

主题

5

帖子

12

安币

初级码农

Rank: 1

发表于 2014-8-25 17:08:22 | 显示全部楼层
不行,出不来效果
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )