自定义样式与主题

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

#样式与主题(重点)

##01_样式
样式:主要作用于控件上的,修饰控件的一些属性;

自定义样式:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="button_color_stype">
        <item name="android:background" >#ff0000</item>
        <item name="android:textColor">#00ff00</item>
    </style>
    
    <style name="textview_color_stype">
        <item name="android:background" >#ff0000</item>
        <item name="android:textColor">#0000ff</item>
    </style>
    
    <style name="textview_color_stype_largesize" parent="textview_color_stype">
        <item name="android:textSize" >20sp</item>
        <item name="android:background" >#0000ff</item>
    </style>
    
</resources>

##02_主题

主题:界面或者整个应用程序的风格;
theme
定义主题的方法与定义样式完全一样;

代码:
<?xml version="1.0" encoding="utf-8"?>

</resources>


<activity
        android:name="com.itheima.style.MainActivity"
        android:label="@string/app_name"
        android:theme="@style/my_theme_activity_background"
         >

自定义组合控件# ***

public class SettingView extends RelativeLayout {

		//在代码中使用的时候调用
		public SettingView(Context context) {
			super(context);
			//实现不管采用哪种方式使用自定义组合控件,都能调用init()方法
			init();
			
		}
		//在布局文件使用的时候调用 ,多了样式文件
		public SettingView(Context context, AttributeSet attrs, int defStyle) {
			super(context, attrs, defStyle);
			
			init();
			
		}
		//在布局文件使用的时候调用
		public SettingView(Context context, AttributeSet attrs) {
			super(context, attrs);
			
			init();
			
		}
		/**
		 * 添加布局文件
		 */
		private void init(){
			//添加布局文件
	//		TextView textView = new TextView(getContext());
	//		textView.setText("这是一个自定义组合控件的textview");
			//第一种方式
			//将布局文件那转化成view对象
	//		View view = View.inflate(getContext(), R.layout.settingview, null);//爹有了,直接找孩子,亲生的
	//		//添加
	//		this.addView(view);//给相对布局添加一个textview
	//		this.addView(child, params);//layoutParams : 用代码给控件设置属性,就表示要设置控件在自定义空间中的属性
			//第二种方式
			//root:给view对象找一个父控件
			View.inflate(getContext(), R.layout.settingview, this);//孩子有了,直接找爹,喜当爹,不使用,不设置属性,父控件会使用原控件的属性
		}
	
	}

#自定义控件的点击事件# **

1.将自定义组合控件移植到手机卫士
2.在自定义组合控件中添加改变控件状态的方法,来方便我们改变自定义控件中控件的值

	/**
	 * 设置标题
	 * @param title
	 */
	public void setTitle(String title){
		tv_setting_title.setText(title);
	}
	/**
	 * 设置描述信息
	 * @param des
	 */
	public void setDes(String des){
		tv_setting_des.setText(des);
	}
	/**
	 * 设置checkbox的状态
	 * @param isChecked
	 */
	public void setChecked(boolean isChecked){
		cb_setting_isupdate.setChecked(isChecked);
	}
	/**
	 * 获取checkbox的状态
	 * @return
	 */
	public boolean isChecked(){
		//isChecked();获取checkbox的状态
		return cb_setting_isupdate.isChecked();
	}
3.在activity中使用相应的方法
	//初始化自定义组合控件中的控件的值
	sv_setting_update.setTitle("提示更新");
	sv_setting_update.setDes("打开提示更新");
	sv_setting_update.setChecked(true);
	
	sv_setting_update.setOnClickListener(new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			if (sv_setting_update.isChecked()) {
				//关闭提示更新
				sv_setting_update.setDes("关闭提示更新");
				sv_setting_update.setChecked(false);
			}else{
				//打开提示更新
				sv_setting_update.setDes("打开提示更新");
				sv_setting_update.setChecked(true);
			}
		}
	});

自定义属性# **

查看系统属性文件:sdk\platforms\android-16\data\res\values\attrs.xml

1.res -> values -> attrs.xml(固定写法)
	<resources>
	     <declare-styleable name="cn.itcast.mobilesafexian02.ui.SettingView">
	         <attr name="title" format="string" /><!-- format : 格式 类型-->
	         <attr name="des_on" format="string" />
	         <attr name="des_off" format="string" />
	     </declare-styleable>
	</resources>
2.到布局文件中使用自定义属性

	命名空间:xmlns:itcast="http://schemas.android.com/apk/res/cn.itcast.mobilesafexian02"

	<cn.itcast.mobilesafexian02.ui.SettingView
        android:id="@+id/sv_setting_update"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        itcast:title="提示更新"
        itcast:des_on="打开提示更新"
        itcast:des_off="关闭提示更新"
    ></cn.itcast.mobilesafexian02.ui.SettingView>

3.在代码中使用,是自定义属性有意义,两个参数的构造函数中
		//在布局文件使用的时候调用
		public SettingView(Context context, AttributeSet attrs) {
			super(context, attrs);
			
			init();
			
			//AttributeSet保存有控件的所有属性,通过AttributeSet获取控件的所有属性了
	//		int count = attrs.getAttributeCount();//获取控件属性的个数
	//		System.out.println("属性个数:"+count);
	//		for (int i = 0; i < count; i++) {
	//			//获取相应的属性的值
	//			System.out.println(attrs.getAttributeValue(i));
	//		}
			//通过命名空间和属性的名称获取属性的值
			//namespace : 命名空间
			//name : 属性的名称
			String title = attrs.getAttributeValue("http://schemas.android.com/apk/res/cn.itcast.mobilesafexian02", "title");
			des_on = attrs.getAttributeValue("http://schemas.android.com/apk/res/cn.itcast.mobilesafexian02", "des_on");
			des_off = attrs.getAttributeValue("http://schemas.android.com/apk/res/cn.itcast.mobilesafexian02", "des_off");
			//使用获取的属性的值
			//设置标题控件的值
			tv_setting_title.setText(title);
			//设置描述信息的值
			if (isChecked()) {
				tv_setting_des.setText(des_on);
			}else{
				tv_setting_des.setText(des_off);
			}
			
		}
	在setChecked方法中增加
		/**
		 * 设置checkbox的状态
		 * @param isChecked
		 */
		public void setChecked(boolean isChecked){
			cb_setting_isupdate.setChecked(isChecked);
			//相当于将sv_setting_update.setDes("打开提示更新");封装到了这个方法中
			if (isChecked()) {
				tv_setting_des.setText(des_on);
			}else{
				tv_setting_des.setText(des_off);
			}
		}
4.在activity中去除相应的方法

sv_setting_update = (SettingView) findViewById(R.id.sv_setting_update);

	//初始化自定义组合控件中的控件的值

// sv_setting_update.setTitle(“提示更新”);
//根据保存的状态设置初始化的状态
//defValue : 没有update的时候使用的值
if (sp.getBoolean(“update”, true)) {
// sv_setting_update.setDes(“打开提示更新”);
sv_setting_update.setChecked(true);
}else{
// sv_setting_update.setDes(“关闭提示更新”);
sv_setting_update.setChecked(false);
}

	sv_setting_update.setOnClickListener(new OnClickListener() {
		
		@Override
		public void onClick(View v) {
			Editor edit = sp.edit();
			if (sv_setting_update.isChecked()) {
				//关闭提示更新

// sv_setting_update.setDes(“关闭提示更新”);
sv_setting_update.setChecked(false);
edit.putBoolean(“update”, false);
// edit.apply();//可以保存到文件中,但是仅限于9版本之上,9版本之下是保存到内存中的
}else{
//打开提示更新
// sv_setting_update.setDes(“打开提示更新”);
sv_setting_update.setChecked(true);
edit.putBoolean(“update”, true);
}
edit.commit();
}
});

猜你喜欢

转载自blog.csdn.net/wdx_1136346879/article/details/86527815