当写布局的时候,有很多的条目都一样,如果你想复制粘贴的话,那布局文件可就太长了,太难受了。
如果用ListView的多套布局的话,那也太麻烦了,如果布局的个数特别特别的多的话,那会想相当麻烦。
使用自定义View,把同样的布局抽取出来
代码如下: viewsettingitem.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="60dp"
android:padding="5dp" >
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/black"
android:textSize="18sp" />
<TextView
android:id="@+id/tv_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_title"
android:layout_marginTop="3dp"
android:textColor="#a000"
android:textSize="16sp" />
<!--由于这个条目上面有一个CheckBox 他会抢焦点的
所以加上三个属性
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
就OK了-->
<CheckBox
android:id="@+id/cb_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
android:layout_centerVertical="true" />
<View
android:layout_width="match_parent"
android:layout_height="0.2dp"
android:layout_alignParentBottom="true"
android:background="#a000" />
</RelativeLayout>
自定义View:SettingItemView
package com.wisdom.mobiesafe.view;
import com.wisdom.mobiesafe.R;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.CheckBox;
import android.widget.RelativeLayout;
import android.widget.TextView;
/**
* 设置中新的自定义控件
* @author ZZH
*
*/
public class SettingItemView extends RelativeLayout {
private TextView tvTitle;
private TextView tvDesc;
private CheckBox cbStatus;
public SettingItemView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView();
}
public SettingItemView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public SettingItemView(Context context) {
super(context);
initView();
}
/**
* 初始化布局
*/
private void initView() {
// 将自定义的布局文件设置给当前的SettingItemView
View.inflate(getContext(), R.layout.view_setting_item, this);
tvTitle = (TextView)findViewById(R.id.tv_title);
tvDesc = (TextView)findViewById(R.id.tv_desc);
cbStatus = (CheckBox)findViewById(R.id.cb_status);
}
public void setTitle(String title){
tvTitle.setText(title);
}
public void setDesc(String desc){
tvDesc.setText(desc);
}
/**
* 返回勾选状态
* @return
*/
public boolean isChecked(){
return cbStatus.isChecked();
}
public void setChecked(boolean check){
cbStatus.setChecked(check);
}
}
然后在布局文件中使用该布局: activity_setting.xml
<com.wisdom.mobiesafe.view.SettingItemView
android:id="@+id/siv_update"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</com.wisdom.mobiesafe.view.SettingItemView>
在Activity里面:SettingActivity
package com.wisdom.mobiesafe.activity;
import com.wisdom.mobiesafe.R;
import com.wisdom.mobiesafe.view.SettingItemView;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
/**
* 设置中心
* @author ZZH
*
*/
public class SettingActivity extends Activity {
private SettingItemView sivUpdate;//设置升级
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_setting);
sivUpdate = (SettingItemView) findViewById(R.id.siv_update);
sivUpdate.setTitle("自动更新设置");
sivUpdate.setDesc("自动更新已开启");
sivUpdate.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//判断当前的状态
if(sivUpdate.isChecked()){
//设置不勾选
sivUpdate.setChecked(false);
sivUpdate.setDesc("自动更新已关闭");
}else{
sivUpdate.setChecked(true);
sivUpdate.setDesc("自动更新已开启");
}
}
});
}
}
由于这个条目上面有一个CheckBox 把CheckBox给禁掉,他会抢焦点的所以加上三个属性
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
就OK了