- 浏览: 26814 次
- 性别:
- 来自: 北京
文章分类
最新评论
在开发中很多用到自定义控件,其中大部分是有几个控件组合到一起使用,这里就联系到组合控件,我对自定义控件也不是太熟悉,昨天看写资料,自己写了个小demo,先从简单的来,组合控件,复杂的学会了在分享给大家,话不多说了,上代码吧
我们先举个例子,比如我们需要一个控件,左边一个文本,右边一个文本,下面一个横线,
下面附上demo地址
https://github.com/wudongze/WidgetDemo
来上代码
首先要把那块的布局实现出来
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="45dp">
<TextView
android:id="@+id/tv_left"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:padding="5dp" />
<TextView
android:id="@+id/tv_right"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:gravity="center"
android:padding="5dp" />
<TextView
android:id="@+id/line"
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:layout_alignParentBottom="true"/>
</RelativeLayout>
然后定义自己需要的属性在attrs.xml文件中
<declare-styleable name="MyTextLayout">
<attr name="left_text" format="string"/><!--左文本-->
<attr name="right_text" format="string"/><!--右文本-->
<attr name="line_color" format="color"/><!--线的颜色-->
<attr name="left_text_size" format="dimension"/><!--左边文字的大小-->
<attr name="right_text_size" format="dimension"/><!--右边文字的大小-->
<attr name="left_text_color" format="color"/><!--左边文字的颜色-->
<attr name="right_text_color" format="color"/><!--右边文字的颜色-->
<attr name="is_show_line" format="boolean"/><!--是否显示横线-->
</declare-styleable>
这里name是属性名字 ,format是属性的类型,具体有什么类型会提示出来,根据自己的业务区选择
下面开始写代码了
public class MyTextLayout extends RelativeLayout {
private TextView tvLeft, tvRight;
private TextView line;
private RelativeLayout relativeLayout;
//这个构造函数用于代码中设置,也就是动态使用控件
public MyTextLayout(Context context) {
super(context);
}
//这个构造函数用于在布局文件中设置控件的属性
public MyTextLayout(Context context, AttributeSet attrs) {
super(context, attrs);
//获取view
inflate(getContext(), R.layout.text_layout, this);
tvLeft = (TextView) findViewById(R.id.tv_left);
tvRight = (TextView) findViewById(R.id.tv_right);
line = (TextView) findViewById(R.id.line);
relativeLayout = (RelativeLayout) findViewById(R.id.root);
//获取TypedArray,这里面有我们定义的各种属性,如下
TypedArray obtainStyledAttributes = context.obtainStyledAttributes(attrs, R.styleable.MyTextLayout);
String leftText = obtainStyledAttributes.getString(R.styleable.MyTextLayout_left_text);
String rightText = obtainStyledAttributes.getString(R.styleable.MyTextLayout_right_text);
int lineColor = obtainStyledAttributes.getColor(R.styleable.MyTextLayout_line_color, Color.parseColor("#ffffff"));
float leftTextSize = obtainStyledAttributes.getDimension(R.styleable.MyTextLayout_left_text_size,15.0f);
float rightTextSize = obtainStyledAttributes.getDimension(R.styleable.MyTextLayout_right_text_size,15.0f);
int leftTextColor = obtainStyledAttributes.getColor(R.styleable.MyTextLayout_left_text_color,Color.parseColor("#000000"));
int rightTextColor = obtainStyledAttributes.getColor(R.styleable.MyTextLayout_right_text_color,Color.parseColor("#000000"));
boolean isShowLine = obtainStyledAttributes.getBoolean(R.styleable.MyTextLayout_is_show_line,true);
//为view中的控件赋值
tvLeft.setText(leftText);
tvRight.setText(rightText);
tvLeft.setTextSize(leftTextSize);
tvRight.setTextSize(rightTextSize);
tvLeft.setTextColor(leftTextColor);
tvRight.setTextColor(rightTextColor);
line.setBackgroundColor(lineColor);
if (isShowLine) line.setVisibility(isShowLine ? VISIBLE : GONE);
}
//这个构造函数用于设置默认样式的控件
public MyTextLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
//下面是自己定义的一些方法,根据业务来 1、设置左边文本 2、获取左边的文本内容 3、设置右边的文本
//4、获取右边的文本 5、设置横线的显示和隐藏 6、设置点击监听
public void setLeftText(String leftText) {
tvLeft.setText(leftText);
}
public String getLeftText() {
return tvLeft.getText().toString();
}
public void setRightText(String rightText) {
tvRight.setText(rightText);
}
public String getRightText() {
return tvRight.getText().toString();
}
public void isShowLine(boolean flag) {
line.setVisibility(flag ? VISIBLE : GONE);
}
public void setOnClickLintener(OnClickListener onClickLintener) {
relativeLayout.setOnClickListener(onClickLintener);
}
}
在使用的时候和正常的控件一样
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.wudz.widgetdemo.MyTextLayout
android:id="@+id/my_text"
android:layout_width="match_parent"
android:layout_height="50dp"
app:is_show_line="false"
app:left_text="商品价格"
app:line_color="#000000"
app:right_text="20元"></com.example.wudz.widgetdemo.MyTextLayout>
</RelativeLayout>
在这里就能使用我们定义的属性了,一定要注意,在使用自定义控件一定要加上
xmlns:app="http://schemas.android.com/apk/res-auto"
这个是命名空间
在代码中设置
myTextLayout = (MyTextLayout) findViewById(R.id.my_text);
myTextLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"点击了控件",Toast.LENGTH_SHORT).show();
myTextLayout.setLeftText("商品价格2");
myTextLayout.setRightText("40元");
myTextLayout.isShowLine(true);
}
});
我们先举个例子,比如我们需要一个控件,左边一个文本,右边一个文本,下面一个横线,
下面附上demo地址
https://github.com/wudongze/WidgetDemo
来上代码
首先要把那块的布局实现出来
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="45dp">
<TextView
android:id="@+id/tv_left"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:padding="5dp" />
<TextView
android:id="@+id/tv_right"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:gravity="center"
android:padding="5dp" />
<TextView
android:id="@+id/line"
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:layout_alignParentBottom="true"/>
</RelativeLayout>
然后定义自己需要的属性在attrs.xml文件中
<declare-styleable name="MyTextLayout">
<attr name="left_text" format="string"/><!--左文本-->
<attr name="right_text" format="string"/><!--右文本-->
<attr name="line_color" format="color"/><!--线的颜色-->
<attr name="left_text_size" format="dimension"/><!--左边文字的大小-->
<attr name="right_text_size" format="dimension"/><!--右边文字的大小-->
<attr name="left_text_color" format="color"/><!--左边文字的颜色-->
<attr name="right_text_color" format="color"/><!--右边文字的颜色-->
<attr name="is_show_line" format="boolean"/><!--是否显示横线-->
</declare-styleable>
这里name是属性名字 ,format是属性的类型,具体有什么类型会提示出来,根据自己的业务区选择
下面开始写代码了
public class MyTextLayout extends RelativeLayout {
private TextView tvLeft, tvRight;
private TextView line;
private RelativeLayout relativeLayout;
//这个构造函数用于代码中设置,也就是动态使用控件
public MyTextLayout(Context context) {
super(context);
}
//这个构造函数用于在布局文件中设置控件的属性
public MyTextLayout(Context context, AttributeSet attrs) {
super(context, attrs);
//获取view
inflate(getContext(), R.layout.text_layout, this);
tvLeft = (TextView) findViewById(R.id.tv_left);
tvRight = (TextView) findViewById(R.id.tv_right);
line = (TextView) findViewById(R.id.line);
relativeLayout = (RelativeLayout) findViewById(R.id.root);
//获取TypedArray,这里面有我们定义的各种属性,如下
TypedArray obtainStyledAttributes = context.obtainStyledAttributes(attrs, R.styleable.MyTextLayout);
String leftText = obtainStyledAttributes.getString(R.styleable.MyTextLayout_left_text);
String rightText = obtainStyledAttributes.getString(R.styleable.MyTextLayout_right_text);
int lineColor = obtainStyledAttributes.getColor(R.styleable.MyTextLayout_line_color, Color.parseColor("#ffffff"));
float leftTextSize = obtainStyledAttributes.getDimension(R.styleable.MyTextLayout_left_text_size,15.0f);
float rightTextSize = obtainStyledAttributes.getDimension(R.styleable.MyTextLayout_right_text_size,15.0f);
int leftTextColor = obtainStyledAttributes.getColor(R.styleable.MyTextLayout_left_text_color,Color.parseColor("#000000"));
int rightTextColor = obtainStyledAttributes.getColor(R.styleable.MyTextLayout_right_text_color,Color.parseColor("#000000"));
boolean isShowLine = obtainStyledAttributes.getBoolean(R.styleable.MyTextLayout_is_show_line,true);
//为view中的控件赋值
tvLeft.setText(leftText);
tvRight.setText(rightText);
tvLeft.setTextSize(leftTextSize);
tvRight.setTextSize(rightTextSize);
tvLeft.setTextColor(leftTextColor);
tvRight.setTextColor(rightTextColor);
line.setBackgroundColor(lineColor);
if (isShowLine) line.setVisibility(isShowLine ? VISIBLE : GONE);
}
//这个构造函数用于设置默认样式的控件
public MyTextLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
//下面是自己定义的一些方法,根据业务来 1、设置左边文本 2、获取左边的文本内容 3、设置右边的文本
//4、获取右边的文本 5、设置横线的显示和隐藏 6、设置点击监听
public void setLeftText(String leftText) {
tvLeft.setText(leftText);
}
public String getLeftText() {
return tvLeft.getText().toString();
}
public void setRightText(String rightText) {
tvRight.setText(rightText);
}
public String getRightText() {
return tvRight.getText().toString();
}
public void isShowLine(boolean flag) {
line.setVisibility(flag ? VISIBLE : GONE);
}
public void setOnClickLintener(OnClickListener onClickLintener) {
relativeLayout.setOnClickListener(onClickLintener);
}
}
在使用的时候和正常的控件一样
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.wudz.widgetdemo.MyTextLayout
android:id="@+id/my_text"
android:layout_width="match_parent"
android:layout_height="50dp"
app:is_show_line="false"
app:left_text="商品价格"
app:line_color="#000000"
app:right_text="20元"></com.example.wudz.widgetdemo.MyTextLayout>
</RelativeLayout>
在这里就能使用我们定义的属性了,一定要注意,在使用自定义控件一定要加上
xmlns:app="http://schemas.android.com/apk/res-auto"
这个是命名空间
在代码中设置
myTextLayout = (MyTextLayout) findViewById(R.id.my_text);
myTextLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"点击了控件",Toast.LENGTH_SHORT).show();
myTextLayout.setLeftText("商品价格2");
myTextLayout.setRightText("40元");
myTextLayout.isShowLine(true);
}
});
发表评论
-
android二维码扫描
2016-11-23 14:56 697直接上demo地址,不知道写啥https://github. ... -
github简单操作
2016-11-03 09:59 828先以 Square ... -
android中Intent简介
2016-11-03 09:44 722Intent是什么? Android中提供了In ... -
MVVM使用简介
2016-11-02 11:18 1103我们一步步来,从MVC开始。 MVC 我们都知道,模型——视 ... -
android蓝牙简介
2016-10-27 15:41 659Bluetooth是目前使用最广泛的无线通讯协议,近距离无线通 ... -
BigDecimal
2016-10-27 14:18 654转载http://jeelee.iteye.com/b ... -
DataBinding+Retorfit+Rxjava简单示例
2016-10-25 10:17 963目前比较流行的DataBinding+Retorfit+Rxj ... -
RecycleView
2016-10-25 10:06 976RecycleView是谷歌在5.0后新出的一款控件,可以代替 ... -
Error:Execution failed for task ':app:preDexDebug'.
2016-09-18 21:54 795在使用as开发的时候有时候会遇到这个错误 Error:Exec ... -
android6.0权限管理
2016-09-04 15:41 737在android6.0中谷歌对权限加强了管理,运行时权限必须开 ... -
设置ProgressBar的默认颜色
2016-09-04 15:33 1468ProgressBar progressBar = (Prog ... -
圆角按钮
2016-09-04 15:31 601<?xml version="1.0" ... -
svn提交失败Error:svn: E165001: Commit failed (details follow): svn: E165001: Failed
2016-07-22 16:15 8719在使用as的时候,svn提交代码的时候出现这个错误: E ... -
gson解析工具类
2016-07-22 11:34 912今天后台调东西,我这暂时调不了,称这个时间在来个博客,其实 ... -
android仿支付宝支付底部dialog,多个模块切换
2016-07-21 14:55 4413从上班以来,入职的每个公司都特别忙,想写个博客都写不了,今 ... -
android带清除按钮的输入框
2016-06-21 16:35 996话不多说,直奔主题,清除按钮的输入框,上代码 packa ...
相关推荐
我们来讲一下自定义组合控件,相信大家也接触过自定义组合控件吧,话不多说,直接干(哈~哈~): 大家看到这个觉得这不是很简单的吗,这不就是写个布局文件就搞定嘛,没错,确实直接上布局就行,不过,我只是用这个...
用户控件是一种复合控件,它将多个标准VB控件组合在一起,形成一个单一的、可重用的单元。创建用户控件的过程涉及到以下步骤: 1. **创建新组件**: 在VB6.0环境中,选择"工程"菜单,然后点击"添加用户控件"。这将...
- 使用LabVIEW的"控件工具栏",可以添加基本的UI元素,如按钮、指示器、文本框等,通过组合这些元素来构建自定义控件的外观。 - 编写完成后,可以通过"控件属性"对话框将VI标记为控件模板,这样就可以在其他程序中...
在安卓应用开发中,自定义控件是提升用户体验和界面个性化的重要手段。本文将深入探讨如何创建一个自定义的组合式控件,特别是下拉选择框。下拉选择框(Dropdown Spinner)通常用于提供多个选项让用户进行单选,它...
本文将深入探讨如何在WinForms中进行自定义控件的创建和窗体美化,以解决系统默认控件外观不尽如人意的问题。 一、自定义控件的创建 1. 继承现有控件:你可以通过继承System.Windows.Forms中的控件类,如Button、...
用户控件是ASP.NET中的基本自定义UI元素,它是通过将多个标准ASP.NET控件组合在一起,形成一个复合控件来实现的。用户控件可以看作是网页的微型版,具有自己的HTML、服务器控件和脚本。创建用户控件的主要步骤包括:...
在Android开发中,自定义控件是提升应用独特性和用户体验的重要手段。组合控件,顾名思义,是指将多个基本控件通过特定的方式组合在一起,形成一个具有新功能或新外观的复合控件。本篇文章将深入探讨如何在Android中...
自定义控件(组合控件)源码(WebControl) 自定义控件(组合控件)源码(WebControl) 自定义控件(组合控件)源码(WebControl)
总结来说,自定义控件属性和组合控件是Android开发中的高级技巧,能够帮助开发者实现高度定制的用户界面。自定义属性允许我们为控件增加更多的可配置选项,而组合控件则让我们能够利用已有组件构建更复杂的视图。...
- **基础概念**:组合是指将多个现有的控件组合在一起,形成一个新的功能更强大的控件。这种方式更灵活,可以将复杂的功能分解为多个简单组件,便于维护和复用。 - **步骤**: 1. 在XML布局中嵌套多个控件,通过`...
自定义控件是winform应用程序中最基本的组件之一,它们可以提供丰富的交互体验和个性化的界面设计。开发自定义控件需要具备一定的编程基础和winform开发经验。 winform自定义控件可以分为三种类型:复合控件...
标题“labview自定义控件、以及一些各种布尔控件.zip”表明这是一个包含多个自定义控件和布尔类型控件的压缩包资源。这些控件可能包括按钮、开关等交互元素,且特别强调了布尔类型的控件,这通常指的是能开启或关闭...
其次,**用户控件(User Control)**是一种特殊类型的自定义控件,它是由多个现有的.NET控件组合而成的新控件。用户控件提供了一种可视化设计的方式,允许开发者在设计器中拖放控件并布局,就像构建一个小型的用户...
这个压缩包"Android自定义控件源码.rar"包含了一些自定义控件的源代码,虽然不能保证每个都可直接运行,但它们提供了丰富的学习资源,帮助开发者理解和实践自定义控件的创建过程。下面将详细探讨Android自定义控件的...
在Windows Presentation Foundation (WPF) 中,自定义控件是一种扩展和定制用户界面元素的方式,以便更好地满足应用程序的独特需求。WPF提供了丰富的内置控件,但有时这些控件可能无法完全满足我们的设计或功能需求...
在Android开发中,自定义控件是提升应用用户体验和界面设计独特性的重要手段。通过将系统提供的基础控件进行组合和扩展,我们可以创造出满足特定需求的复杂组件。本教程将深入探讨如何在Android Studio中利用现有...
自定义控件是C#编程中一个重要的概念,它允许开发者根据需求扩展或修改内置控件的功能和外观,以满足特定项目的需求。在本案例中,我们将深入探讨如何自定义ComboBox控件。 ComboBox控件是Windows Forms中一个非常...
- 组件整合:如果你需要将多个标准控件组合成一个新的复杂控件,如日历选择器。 5. **注意事项** - 性能优化:自定义控件可能会增加程序的复杂性,因此要注意性能优化,避免过度绘制或不必要的消息处理。 - 兼容...