布局的重复使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/android_I_t/article/details/49590961

首先,必须明白自己要做什么样子的重复布局,以图1为例,创建一个自定义布局:p1(图1)。有三个组件,一个TextView(设置你想输入的信息,如姓名等),一个ImageView(用来显示头像),最后是一个EditText(显示输入的文字);你可以根据自己的需求进行更换图片,和TextView中的文字或者字体的颜色等。具体步骤如下:

1.在res->values文件夹下建立一个Resource Type的类型为Values、名为attrs的xml文件,在<resouece>节点下添加如下代码

<span style="font-size:18px;"><declare-styleable name="MyView">
        <attr name="text_color" format="reference|color" />
        <attr name="image_drawable" format="reference" />
        <attr name="text" format="reference|string"></attr>
    </declare-styleable></span>
这段代码的作用是声明自定义控件在R文件的名字,即:MyView,以及你要进行的属性设置(头像等的设置)的名字(如代码中的text_color)和取值(如代码中的reference),这些属性具体怎么设置,就像你用Android系统中的组件一样,可以这样使用app:text_color=”#666666“这样进行设置;其中,取值为”reference“意味着来自设置的值,假如是color或者是String则代表该属性有默认值可以取,如果同时存在,reference优先选取。

2.创建一个类(MyView)继承自RelativeLayout,重载三个构造方法,参数少的调用参数多的在三个参数的构造方法中进行代码编辑:(1)声明如下全局变量:(由于ImageView和EditText需要在一个布局上才能显示,所以定义两个布局参数imageLayout、etLayout)。

        private TextView textView ;
	private LayoutParams imageLayout ;
	private ImageView iv ;
	private LayoutParams etLayout ;
	private EditText editText ;
(2)获取你所设置的属性,主要是根据在attrs中设置的属性进行获取, 一般来说在<resouece>的节点下有节点,就获取及格属性;根据上下文对象,调用静态方法obtainStyleAttributes(*所在res目录下的文件名* ,*该文件所在的位置,自定义控件在R文件的名字*),并且返回一个TypeArray类型的数组。根据不同属性的不同取值进行在TypeArray中进行获取,最后记得recycle这个数组。

TypedArray typedArray = context.obtainStyledAttributes(attrs , R.styleable.MyView) ;
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() ;
(3)根据上一步获取的值,对各个组件进行初始化、属性设置和位置设置,由于ImageView和EditText需要在一个布局参数上才能显示,所以需要把他们添加到布局参数中

textView的设置:

textView = new TextView(context) ;
textView.setId(5) ;
textView.setText(text) ;
textView.setTextColor(textColor) ;
imageView的设置:
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) ;
editText = new EditText(context) ;
editText.setId(7) ;
editText.setHint("input...") ;
etLayout.addRule(RelativeLayout.RIGHT_OF, 6) ;
etLayout.addRule(RelativeLayout.ALIGN_BOTTOM, 6) ;
(4)最后,调用addView()方法进行添加组件,有布局参数的组件需要都添加。
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上面。

以上仅是个人理解。





猜你喜欢

转载自blog.csdn.net/android_I_t/article/details/49590961