如果系统提供的控件足以满足开发者的日常需求,那么可优先使用系统提供的控件,如果系统提供的控件无法满足开发需求,则开发者可以在系统提供的控件上新增新的的功能。
效果图:
?这里有两种布局方法:
第一种就是使用系统的提供的控件,当着这种办法就是所谓的笨办法,繁琐的代码:
<?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="85dp">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="设置是否更新"
android:textSize="@dimen/text_content"
android:layout_marginTop="@dimen/top"
android:layout_marginLeft="@dimen/top"
android:textColor="@color/black"/>
<TextView
android:id="@+id/tv_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="自动更新已经关闭"
android:textSize="@dimen/text_content"
android:layout_marginTop="@dimen/top"
android:layout_marginLeft="@dimen/top"
android:textColor="@color/black"
android:layout_below="@id/tv_name"/>
<!-- 为了使全局获取焦点,必须让CheckBox失去焦点
android:clickable="false"
android:focusable="false"
-->
<CheckBox
android:clickable="false"
android:focusable="false"
android:id="@+id/cb_state"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginRight="@dimen/top"/>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_alignParentBottom="true"
android:layout_marginLeft="@dimen/top"
android:background="@color/show_color"/>
</RelativeLayout>
第二种就是自定继RelativeLayout类,需要自定义布局文件,例如上边的为自定义的布局文件,使用
View.inflate(context, R.layout.text_item_layout,SetTextView.this);加载到TextView控件上,
package com.example.mobileguard.ui;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.CheckBox;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.example.mobileguard.R;
/**
* 自定义组合控件 两个TextView 一个CheckView 一个View
*/
public class SetTextView extends RelativeLayout {
private TextView tv_desc; //描述
private TextView tv_title; //标题
private CheckBox cd_state; //复选框
public SetTextView(Context context) {
super(context);
initView(context);
}
public SetTextView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public SetTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
}
public SetTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initView(context);
}
/**
* 初始化布局文件
*/
private void initView(Context context) {
//把一个布局文件——View加载到SetTextView上
View.inflate(context, R.layout.text_item_layout,SetTextView.this);
tv_title = (TextView) findViewById(R.id.tv_name);
tv_desc = (TextView) findViewById(R.id.tv_desc);
cd_state = (CheckBox)findViewById(R.id.cb_state);
}
/**
* 检查组合是否有焦点
* @return
*/
public boolean isChecked(){
return cd_state.isChecked();
}
/**
* true 关 false 开 设置组合控件是否被选中的状态
* @param state
*/
public void setChecked(boolean state){
if(state){
// setDesc("自动更新已经关闭");
}else {
// setDesc("自动更新已经开启");
}
cd_state.setChecked(state); //设置复选框的状态
}
public void setDesc(String msg){
tv_desc.setText(msg);
}
}
?得到自定义组合控件,就可以在布局文件中,只需要轻轻松松几行代码就实现繁琐代码所呈现的效果:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SetCenterActivity"
android:orientation="vertical">
<TextView
style="@style/navTitle"
android:text="设置中心"/>
<com.example.mobileguard.ui.SetTextView
android:id="@+id/st_update"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
是不是很简单呢??
|