首先,必须明白自己要做什么样子的重复布局,以图1为例,创建一个自定义布局:(图1)。有三个组件,一个TextView(设置你想输入的信息,如姓名等),一个ImageView(用来显示头像),最后是一个EditText(显示输入的文字);你可以根据自己的需求进行更换图片,和TextView中的文字或者字体的颜色等。具体步骤如下:
1.在res->values文件夹下建立一个Resource Type的类型为Values、名为attrs的xml文件,在<resouece>节点下添加如下代码:
<span style="font-size:18px;"><declare-styleable name="MyView">这段代码的作用是声明自定义控件在R文件的名字,即:MyView,以及你要进行的属性设置(头像等的设置)的名字(如代码中的text_color)和取值(如代码中的reference),这些属性具体怎么设置,就像你用Android系统中的组件一样,可以这样使用app:text_color=”#666666“这样进行设置;其中,取值为”reference“意味着来自设置的值,假如是color或者是String则代表该属性有默认值可以取,如果同时存在,reference优先选取。
<attr name="text_color" format="reference|color" />
<attr name="image_drawable" format="reference" />
<attr name="text" format="reference|string"></attr>
</declare-styleable></span>
2.创建一个类(MyView)继承自RelativeLayout,重载三个构造方法,参数少的调用参数多的,在三个参数的构造方法中进行代码编辑:(1)声明如下全局变量:(由于ImageView和EditText需要在一个布局上才能显示,所以定义两个布局参数imageLayout、etLayout)。
private TextView textView ;(2)获取你所设置的属性,主要是根据在attrs中设置的属性进行获取, 一般来说在<resouece>的节点下有节点,就获取及格属性;根据上下文对象,调用静态方法obtainStyleAttributes(*所在res目录下的文件名* ,*该文件所在的位置,自定义控件在R文件的名字*),并且返回一个TypeArray类型的数组。根据不同属性的不同取值进行在TypeArray中进行获取,最后记得recycle这个数组。
private LayoutParams imageLayout ;
private ImageView iv ;
private LayoutParams etLayout ;
private EditText editText ;
TypedArray typedArray = context.obtainStyledAttributes(attrs , R.styleable.MyView) ;(3)根据上一步获取的值,对各个组件进行初始化、属性设置和位置设置,由于ImageView和EditText需要在一个布局参数上才能显示,所以需要把他们添加到布局参数中
int textColor = typedArray.getColor(R.styleable.MyView_text_color, Color.RED) ;
int drawable = typedArray.getResourceId(R.styleable.MyView_image_drawable ,R.drawable.ic_launcher) ;
String text = typedArray.getString(R.styleable.MyView_text) ;
typedArray.recycle() ;
textView的设置:
textView = new TextView(context) ;imageView的设置:
textView.setId(5) ;
textView.setText(text) ;
textView.setTextColor(textColor) ;
imageLayout = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT) ;iv = new ImageView(context) ;iv.setId(6) ;iv.setImageResource(drawable) ;imageLayout.addRule(RelativeLayout.BELOW, 5) ;imageLayout.setMargins(0, 30 , 0, 0) ;EditText的设置:
etLayout = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT) ;(4)最后,调用addView()方法进行添加组件,有布局参数的组件需要都添加。
editText = new EditText(context) ;
editText.setId(7) ;
editText.setHint("input...") ;
etLayout.addRule(RelativeLayout.RIGHT_OF, 6) ;
etLayout.addRule(RelativeLayout.ALIGN_BOTTOM, 6) ;
addView(textView) ;addView(iv, imageLayout) ;addView(editText, etLayout) ;至此,一个自定义的布局文件已经建立完成。
最后是,自定义布局的使用:
例如你想在MainActivity中使用,需在其头部布局文件的中加入
<span style="font-size:18px;">xmlns:app="http://schemas.android.com/apk/res/*MainActivity的包名*"</span>
ps:app这个名字可以随意。
在你想调用这个复用布局的地方写入一个节点,节点的名称是你所写MyView类的位置(包名+类名),之后,和普通的组件使用相同,在下面设置高、宽,注:假如你想要设置自定义控件中的属性,就需要用到上面在头文件中注册的名字是app的标记,使用方法为app:*在attrs中注册的属性名称*="*你想要的值*"
<pre name="code" class="html"><cn.com.tarena.recycle.view.MyView
android:id="@+id/auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:text_color="#FFFF00"
app:text="GSD1507"
app:image_drawable="@drawable/headimage10"
/>
总结:自定义的重复布局的具体流程可以理解为这样:当MainActivity加载这个自定义布局时,它会通过attrs文件获取到你想要显示的值,然后再以一个Layout的形式,显示在MainActivity上面。
以上仅是个人理解。