android开发系列之使用xml自定义控件
在android开发设计的全过程中,有的情况下应对好几个Activity里边一些同样的合理布局,大家必须写数次同样的编码,另外这类方式给大家的新项目维护保养也产生了非常大麻烦。那麼是否有一种行得通的方法可以将Activity里边同样的合理布局分拆的很清晰呢?自然是有的,这个时候就到自定控制隆重登场了。
实际上在android里边有多种多样方式去完成自定控制,可是今日这篇blog里边只详细介绍应用xml的方法开展自定控制的建立。请看下面的这类情景,无论在哪个网页页面里边都是有个题目,包含一条垂直居中的文字信息内容和在左边的返回按钮。这个时候大家就可以将上边的题目拆分为一个控制,随后在该控制里边显现出一个text特性和一个按键的点击事件。
最先使我们先来建立一个前台接待的xml文件用以置放合理布局,编码以下所显示:
<?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" android:background="@color/test" android:gravity="center_vertical"> <TextView android:id="@ id/tvBack" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="<" android:layout_alignParentLeft="true" /> <TextView android:id="@ id/tvTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="登陆" android:layout_centerHorizontal="true"/> </RelativeLayout>
能够见到在上面的合理布局里边,大家仅仅置放了2个TextView,一个表明回到,另一个则表明title。
见到这儿聪慧的你或许就能猜到,是否会在自定控制的情况下,大家也一样必须选用某类方式载入上边的合理布局文档,随后在载入的情况下另外关系自身界定好的特性和事件到上边回到的TextView点击事件和题目的TextView的text特性呢?是的,可以看较为关键的后台管理关系编码类界定:
public class TitleControl extends RelativeLayout { }
能够发觉TitleControl我们都是立即从RelativeLayout承继而成的,那样的话TitleControl就归属于一种View控制了。下面所需做的事儿,便是界定特性和事件了。如今假定大家必须界定一个MyText特性,那麼应该怎么做呢?可以看以下编码:
public class TitleControl extends RelativeLayout { private TextView tvBack, tvTitle; private String title; public TitleControl(Context context) { super(context); } public TitleControl(Context context, AttributeSet attrs) { super(context, attrs); View view = View.inflate(context, R.layout.activity_title, this); tvTitle = (TextView) view.findViewById(R.id.tvTitle); tvBack = (TextView) view.findViewById(R.id.tvBack); tvBack.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { } }); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.title); title = a.getString(R.styleable.title_MyText); a.recycle(); tvTitle.setText(title, TextView.BufferType.SPANNABLE); } public String getTitle() { return this.title; } public void setTitle(String title) { this.title = title; } }
在上面的编码里边大家根据View的inflate方式载入前台接待网页页面,随后根据findViewById方式就找到前台接待必须关系的控制了。可是我们自己界定的特性放到哪儿呢?一种较为非常容易维护保养的作法便是将特性置放在xml文件里边。下边就要大家讨论一下特性的xml代码:
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="title"> <attr name="MyText" format="string"/> </declare-styleable> </resources>
在我们界定好特性xml以后,就可以根据下边的这一段编码,将我们自己界定的MyText特性关系到TextView的Text特性上边了。那样就等同于完成了自定特性。
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.title); title = a.getString(R.styleable.title_MyText); a.recycle(); tvTitle.setText(title, TextView.BufferType.SPANNABLE);
保证这儿大家就差一个自定事情了,那麼大家怎样去界定一个事情关系到TextView的点一下上边呢?回答是根据回调函数方式的方法完成的,可以看回调函数方式的界定:
private ITitleCallback iTitleCallback; public interface ITitleCallback { void OnBackClickLinear(); } public void setTitleClickLinear(ITitleCallback iTitleCallback) { this.iTitleCallback = iTitleCallback; }
随后在TextView点一下的情况下实行以下编码就可以了:
tvBack = (TextView) view.findViewById(R.id.tvBack); tvBack.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(iTitleCallback!=null){ iTitleCallback.OnBackClickLinear(); } } });
好啦,今日就到这儿吧!若有不对,热烈欢迎拍砖。