今天我们要实现的效果如下:

当然列表中的标签显示的个数是可控的,实现个数可控的标签的话,我们就需要自定义View。

我们自定义一个抽象类继承LinearLayout并实现我们定义的接口:

BaseTagView:

/*** 标签,继承此抽象类* @author LinHai Gu** @param <T>*/
public abstract class BaseTagView<T> extends LinearLayout implements SelectTag<T>{private Context mContext;public BaseTagView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);mContext = context;initView();}public BaseTagView(Context context, AttributeSet attrs) {super(context, attrs);mContext = context;initView();}public BaseTagView(Context context) {super(context);mContext = context;initView();}private void initView() {setOrientation(LinearLayout.HORIZONTAL);}/*** 添加标签,可配* @param datas 数据源* @param num 显示的标签数*/public void addTag(List<T> datas,int num) {removeAllViews();LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);params.setMargins(0, 0, 10, 0);if (datas.size() > num) {for (int i = 0; i < num; i++) {T data = datas.get(i);TextView textView = (TextView) LayoutInflater.from(mContext).inflate(R.layout.tagtext_view, null);textView.setText(getTag(data));textView.setLayoutParams(params);addView(textView);}} else {for (int i = 0; i < datas.size(); i++) {T data = datas.get(i);TextView textView = (TextView) LayoutInflater.from(mContext).inflate(R.layout.tagtext_view, null);textView.setText(getTag(data));textView.setLayoutParams(params);addView(textView);}}}}

定义接口SelectTag:

/*** * @author LinHai Gu** @param <T>*/
public interface SelectTag<T> {/*** 获取标签内容* @param data* @return*/public abstract String getTag(T data);}

在这里为什么用到了泛型,这是因为我们需要的是一个公共的控件,而不是为某一个界面而写的。

在BaseTagView抽象类中的addTag方法中需要导入一个TextView布局文件:

tagtext_view:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/text_line" android:textSize="12dp"android:textColor="#999999"android:padding="2dp">
</TextView>

text_line:是专门给TextView外部添加标签的边框,当然你可以根据需要制作一些好看的标签样式

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">   <solid android:color="@android:color/transparent" />   <corners android:topLeftRadius="1dp"  android:topRightRadius="1dp"   android:bottomRightRadius="1dp"  android:bottomLeftRadius="1dp"/><stroke android:width="1dp"android:color="#999999"/>
</shape>

以上我们的公共控件基本完成。

这时候假设有一个项目第一个页面从服务器获取到了标签列表,并显示在列表中,标签的值存放在一个PageObject对象中:

PageObject:

/*** 假设这是某页面请求到的标签数据* @author LinHai Gu**/
public class PageObject implements Serializable{private static final long serialVersionUID = 100230230204204021L;public String tagName;
}

接着我们就要显示这些标签,因此我们可以为不同的模块去创建不同的标签,假设第一个界面的标签View是这样的:

public class PageOneTagView extends BaseTagView<PageObject>{public PageOneTagView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}public PageOneTagView(Context context, AttributeSet attrs) {super(context, attrs);}public PageOneTagView(Context context) {super(context);}public void setTagList(ArrayList<PageObject> list,int num){addTag(list,num);}@Overridepublic String getTag(PageObject data) {return data.tagName;}}

通过子类定义setTagList方法传入我们想要显示的标签列表,并显示的个数就行了。

以下使我们的主布局:

MainActivity:

public class MainActivity extends Activity {private Datapter datapter=new Datapter();private ArrayList<PageObject> list=new ArrayList<PageObject>();private ListView lv_tag;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);       initData();initView();}/*** 假设这边是从服务获取到的标签列表*/private void initData(){for(int i=0;i<10;i++){PageObject obj=new PageObject();obj.tagName="标签"+i;list.add(obj);}}private void initView(){lv_tag=(ListView)findViewById(R.id.lv_list);lv_tag.setAdapter(datapter);}class Datapter extends BaseAdapter {@Overridepublic int getCount() {return 23;}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {viewHolder viewh;if (convertView == null) {viewh = new viewHolder();convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.list_item, parent, false);viewh.tag = (PageOneTagView) convertView.findViewById(R.id.page_tag);convertView.setTag(viewh);} else {viewh = (viewHolder) convertView.getTag();}/** 添加标签,并显示4个标签*/viewh.tag.setTagList(list, 4);return convertView;}}class viewHolder {public PageOneTagView tag;}
}

activity_main:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.bill.MainActivity" ><ListViewandroid:id="@+id/lv_list"android:layout_width="fill_parent"android:layout_height="fill_parent" ></ListView></RelativeLayout>

list_item:(导入我们继承BaseTagView的类)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><ImageViewandroid:id="@+id/iv_logo"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/ic_launcher" /><com.bill.page1.PageOneTagViewandroid:id="@+id/page_tag"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginLeft="10dp"android:layout_toRightOf="@id/iv_logo" ></com.bill.page1.PageOneTagView></RelativeLayout>

个人GitHub项目地址:https://github.com/LinhaiGu/TabView

转载请注明出处:http://blog.csdn.net/hai_qing_xu_kong/article/details/45919871情绪控_

Android之自定义控件一起制作自定义标签相关推荐

  1. Android自定义标签列表控件LabelsView

    无论是在移动端的App,还是在前端的网页,我们经常会看到下面这种标签的列表效果: 标签从左到右摆放,一行显示不下时自动换行.这样的效果用Android源生的控件很不好实现,所以往往需要我们自己去自定义 ...

  2. android 自定义标签选项

    无论是在移动端的App,还是在前端的网页,我们经常会看到下面这种标签的列表效果: 标签列表 标签从左到右摆放,一行显示不下时自动换行.这样的效果用Android源生的控件很不好实现,所以往往需要我们自 ...

  3. Android自定义标签列表控件LabelsView解析

    无论是在移动端的App,还是在前端的网页,我们经常会看到下面这种标签的列表效果: 标签从左到右摆放,一行显示不下时自动换行.这样的效果用Android源生的控件很不好实现,所以往往需要我们自己去自定义 ...

  4. android 自定义 theme,为Android手机制作自定义主题

    我是一名新的移动开发人员,我知道如何在应用程序上放置主题,到目前为止,我已经能够制作2个移动应用程序,但我想尝试为手机制作自定义主题.我想知道是否有人对以下内容有想法. 1.how to make a ...

  5. android 如何去掉自定义标签页,Android中为TextView增加自定义的HTML标签

    Android中的TextView,本身就支持部分的Html格式标签.这其中包括常用的字体大小颜色设置,文本链接等.使用起来也比较方便,只需要使用Html类转换一下即可.比如: textView.se ...

  6. Android中为TextView增加自定义的HTML标签

    为什么80%的码农都做不了架构师?>>>    Android中的TextView,本身就支持部分的Html格式标签.这其中包括常用的字体大小颜色设置,文本链接等.使用起来也比较方便 ...

  7. android ui 扁平化,android 自定义标签的使用,实现扁平化UI设计

    2014年8月6日11:06:44 android对自定义标签的使用,实现扁平化UI设计: 1.attrs.xml文件中自定义标签 如: //reference指的是是从string.xml引用过来 ...

  8. android学习笔记---66_自定义标签页

    2013/7/17 66_自定义标签页 技术qq交流群:JavaDream:251572072 教程下载,在线交流:创梦IT社区:___________以前的网站现在不弄了,抱歉 smdl2tmp1. ...

  9. android手机微信收藏功能实现,Android模仿微信收藏文件的标签处理功能

    最近需要用到微信的标签功能(如下图所示).该功能可以添加已有标签,也可以自定义标签.也可以删除已编辑菜单.研究了一番.发现还是挺有意思的,模拟实现相关功能. 该功能使用类似FlowLayout的功能. ...

最新文章

  1. sort,uniq,wc,history命令简介
  2. Bean的解析与注册
  3. [译]使用LazZiya.ExpressLocalization开发多语言支持的ASP.NET Core 2.x项目
  4. gbdt 算法比随机森林容易_随机森林与GBDT
  5. C如何将二维数组作为返回值
  6. MATLAB 随机过程基本理论
  7. oracle使用with as提高查询效率
  8. 计算机系统中处理的图片可分为,第五章图像处理.doc
  9. 自动生成一列不重复数据库
  10. 2021-3测试通过:eclipse安装svn插件
  11. 彼得·德鲁克 : 管理自己
  12. [LeetCode][easy]Longest Commong Prefix
  13. 十大视频会议软件排名与免费视频会议软件有哪些?
  14. python 简洁优雅的装饰数据类——dataclass(通过生成只有部分属性值的子类解决初始化时没有默认值必须传所有字段值的问题)
  15. 路由器设置DMZ步骤
  16. matlab升幂降幂排列,升幂排列与降幂排列测试题及答案
  17. 如何退出SCALA命令界面
  18. java软件测试经典案例,java语言编程案例 - Mrsjjl的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  19. 曾李青的五年投资经验总结:早期创业公司的九种死法
  20. 高等数学——旋转体的体积

热门文章

  1. python保存图片到指定路径_python将处理好的图像保存到指定目录下的方法
  2. 使用dwz框架搭建网站后台
  3. Theano - Numpy 新手
  4. JavaSE学习总结(六)——接口、抽象类、内部类
  5. js解决EasyUI页面渲染速度慢问题(Mask遮罩)
  6. lua工具库penlight--05日期和时间
  7. 2012 RDS Remote App 对于win7的支持问题
  8. Openresty使用
  9. opencv 图片读取和视频读取(一)
  10. 随堂小测app冲刺(六)