1,实现逻辑:
组合控件:
【1】创建SettingItemView继承RelativeLayout 或者 LinearLayout 或者ViewGroup
【2】构造方法中this 传递方法。减少代码重复使用
【3】创建itme布局,添加子view的布局
【4】在要使用控件的布局文件中使用控件。
自定义属性:
【1】在values文件夹里 创建attrs.xml 文件
【2】按照规定语法 添加属性,参考sdk 中Textview中的属性,添加命名空间
【3】获取需要设置值的控件(findviewbyid)
【4】 在构造方法里取出需要设置的属性的值进行赋值
3,实现代码:
组合控件:
【1】创建想组合的控件布局
【2】继承RelativeLayout重写构造方法this传递,initView中添加布局显示
package view;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Build;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.sjws.R;
/**
* Created by Lenovo on 2019/2/22.
*/
public class SettingItemView extends RelativeLayout {
private TextView tvTitle;
private ImageView ivToggle;
public SettingItemView(Context context) {
this(context,null);
}
/**
* 在布局文件里用的时候 走这个构造
*
* @param context
* @param attrs
* 布局里设置的所有的属性 都在这个对象里
*/
public SettingItemView(Context context, AttributeSet attrs) {
this(context, attrs,-1);
}
/**
* 在布局文件里用的时候 并且设置了样式 走这个构造
*
* @param context
* @param attrs
* 布局里设置的所有的属性 都在这个对象里
*/
public SettingItemView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
private void initView() {
// 1.生成要添加的子view
View child = View.inflate(getContext(), R.layout.view_setting_item,
null);
addView(child);
// 小标题
tvTitle = (TextView) findViewById(R.id.tv_siv_title);
// 右侧的开关图片
ivToggle = (ImageView) findViewById(R.id.iv_siv_toggle);
}
}
【3】在想要展示的页面调用控件
自定义属性:因为每个控件都不一样,要给他附加不同的值,但是组合控件里面没有相对应的属性,我们自己定义属性来使用
【1】 values文件夹里 创建attrs.xml 名字不要全命名
【2】在要展示的布局中添加命名空间,调用属性发现没有用,我们需要在空间中获取属性设置
【3】 在构造方法里取出需要设置的属性的值
package view;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.sjws.R;
/**
* 组合控件
* Created by Lenovo on 2019/2/22.
*/
public class SettingItemView extends RelativeLayout {
private TextView tvTitle;
private ImageView ivToggle;
public SettingItemView(Context context) {
this(context,null);
}
/**
* 在布局文件里用的时候 走这个构造
*
* @param context
* @param attrs
* 布局里设置的所有的属性 都在这个对象里
*/
public SettingItemView(Context context, AttributeSet attrs) {
this(context, attrs,-1);
}
/**
* 在布局文件里用的时候 并且设置了样式 走这个构造
*
* @param context
* @param attrs
* 布局里设置的所有的属性 都在这个对象里
*/
public SettingItemView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
// 取出从布局文件里设置的属性值 都在attrs对象里
// 参1 要检索的全部 的属性集合 参2 检出出的属性的int数组 R文件已经生成
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.SettingItemView);
// 取出小标题的内容
String title = typedArray
.getString(R.styleable.SettingItemView_siv_title);
// 取出右侧图片是否显示的状态
boolean isShow = typedArray.getBoolean(
R.styleable.SettingItemView_siv_enable, true);
// 取出设置的背景的枚举值
int bgId = typedArray.getInt(
R.styleable.SettingItemView_siv_background, 0);
//用完释放一下
typedArray.recycle();
// 给控件赋值
tvTitle.setText(title);
// 控制view是否显示
ivToggle.setVisibility(isShow ? View.VISIBLE : View.INVISIBLE);
// 背景
switch (bgId) {
case 0:
setBackgroundResource(R.drawable.first_selector);
break;
case 1:
setBackgroundResource(R.drawable.middle_selector);
break;
case 2:
setBackgroundResource(R.drawable.last_selector);
break;
default:
break;
}
}
private void initView() {}
}
【4】 initview中获取需要设置值的控件(findviewbyid)
private void initView() {
// 1.生成要添加的子view
View child = View.inflate(getContext(), R.layout.view_setting_item,
null);
addView(child);
// 小标题
tvTitle = (TextView) findViewById(R.id.tv_siv_title);
// 右侧的开关图片
ivToggle = (ImageView) findViewById(R.id.iv_siv_toggle);
}
【5】给控件赋值
// 给控件赋值
tvTitle.setText(title);
// 控制view是否显示
ivToggle.setVisibility(isShow ? View.VISIBLE : View.INVISIBLE);
// 背景
switch (bgId) {
case 0:
setBackgroundResource(R.drawable.first_selector);
break;
case 1:
setBackgroundResource(R.drawable.middle_selector);
break;
case 2:
setBackgroundResource(R.drawable.last_selector);
break;
default:
break;
}
日常笔记,组合控件,含自定义属性,别的组合控件原理也差不多,对你们有帮助的希望可以点赞支持,鼓励我一下,给我一个前进的动力。哈哈哈哈哈