目录
焦点变更监听-setOnFocusChangeListener
文本变化监听器-addTextChangedListener
图形定制
drawable类
引用时@drawable/文件名称
形状图形-shape
描述常见的几何形状,矩形、圆角矩形、圆形、椭圆等
创建描述XML文件:
指定文件定制的图形类型:
图形描述方向:
stroke描边的属性:
corners指定圆角:
gradient渐变设置:
渐变类型:
实例:圆角矩形:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!--指定形状内部的填充颜色-->
<solid android:color="@color/green"/>
<!--指定形状轮廓的粗细与颜色-->
<stroke android:width="2dp" android:color="@color/black"/>
<!--指定圆角的半径-->
<corners android:radius="20dp"/>
</shape>
点9图片
特点:
将图片设为背景时,不会因为拉伸使图片变形
仅拉伸内容,不拉伸轮廓
制作:
状态列表图形-StateListDrawable
xml制作:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--选择器-->
<!--被按下时使用-->
<item android:drawable="@color/red" android:state_pressed="true"/>
<!--没有被按下时使用-->
<item android:drawable="@color/black"/>
</selector>
复选框-CheckBox
java动态设置是否勾选图标、文字不同:
public class check_box extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_check_box);
CheckBox check_1 = findViewById(R.id.check_1);
//设置选中状态改变监听事件
check_1.setOnCheckedChangeListener(this);
}
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
String desc = String.format("%s",b ? "取消勾选":"勾选");
compoundButton.setText(desc);
}
}
开关按钮-switch
<Switch
android:layout_width="60dp"
android:layout_height="48dp"
android:layout_gravity="end" />
单选按钮-RadioButton
需要用单选按钮组包含选项,xml绘制:
对单选框组进行监听 :
tv_result = findViewById(R.id.tv_result);
RadioGroup group = findViewById(R.id.rg_gender);
group.setOnCheckedChangeListener(this); //单选监听
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
if (i == R.id.rb_male){
tv_result.setText("你是一个帅气的男孩");
}else if (i == R.id.rb_female)
tv_result.setText("你是一个漂亮的女孩");
else
tv_result.setText("请选择");
}
编辑框-editText
文本框TextView无法在APP端编辑
输入的文本类型:
焦点变更监听-setOnFocusChangeListener
适用于对一个编辑框输入完后,对输入内容是否合规做判断,由下一个编辑框触发
username = findViewById(R.id.username);
EditText pass = findViewById(R.id.pass);
pass.setOnFocusChangeListener(this);
@Override
public void onFocusChange(View view, boolean b) {
if (b){
//聚焦在password框
String name = username.getText().toString(); //获取username的文本内容
if (TextUtils.isEmpty(name) || name.length()<2){
//name不合规,重新获取焦点进行编辑
username.requestFocus();
//提示信息
Toast.makeText(this,"请输入正确用户名",Toast.LENGTH_SHORT).show();
}
}
}
编辑框第一次点击触发焦点变更事件,第二次点击触发点击事件
文本变化监听器-addTextChangedListener
正在输入的编辑框触发
写法一:
pass.addTextChangedListener(this);
@Override
public void afterTextChanged(Editable editable) {
//EditText.getText()的返回类型为Editable
//获取已输入的文本
String passtext = editable.toString();
//若文本长度达到6,关闭软键盘
if (passtext.length() == 6){
//从系统服务中获取输入法管理器---activity
InputMethodManager imm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
//关闭输入法的软键盘---view获取窗口令牌
imm.hideSoftInputFromWindow(pass.getWindowToken(),0);
}
}
写法二:
pass.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
}
});
写法三:
//新建一个类,专门用于处理该类问题,传入编辑框对象和最大允许输入字符长度
pass.addTextChangedListener(new HideTextWatcher(pass,6));
public class HideTextWatcher implements TextWatcher {
private EditText edit; //编辑框对象
private int maxLength; //最大长度
public HideTextWatcher(EditText v,int maxLength){
this.edit = v;
this.maxLength = maxLength;
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
}
}
提醒对话框-AlertDialog
组成:标题、内容、否定按钮、肯定按钮
按钮点击,弹出提醒对话框。点击事件:
@Override
public void onClick(View view) {
//创建提示对话框的构造器
AlertDialog.Builder builder = new AlertDialog.Builder(this);
//设置标题的图标
builder.setIcon(R.drawable.first);
//设置标题
builder.setTitle("尊敬的客户");
//设置内容
builder.setMessage("确定卸载?");
//设置肯定按钮并添加监听
builder.setPositiveButton("卸载", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
//设置否定按钮
builder.setNegativeButton("取消", (dialogInterface, i) -> {
});
//设置中性按钮
builder.setNeutralButton("再想想", (dialogInterface, i) -> {
});
//根据构造器构造对话框
Dialog dialog = builder.create();
dialog.show();
}
日期选择-DatePicker
获取选择的日期信息:
if (view.getId() == R.id.btn_sure) {
String desc = String.format("%s年%s月%s日",datePicker.getYear(),datePicker.getMonth()+1,datePicker.getDayOfMonth());
text_date.setText(desc);
}
//由于月份是从0-11,所以需要加一
日期对话框-DatePickerDialog
//传入上下文(activity/this)、监听事件(this)、开始年月日
DatePickerDialog dialog = new DatePickerDialog(this,this,2023,5,17);
dialog.show();
//监听事件
@Override
public void onDateSet(DatePicker datePicker, int year, int month, int day) {
String desc = String.format("%s年%s月%s日",year,month+1,day);
text_date.setText(desc);
}
可以用calendar获得当前日期信息:
//获取当前日历实例
Calendar calendar = Calendar.getInstance();
//获取年、月、日、时、分
calendar.get(Calendar.YEAR);
calendar.get(Calendar.MONTH);
calendar.get(Calendar.DAY_OF_MONTH);
calendar.get(Calendar.HOUR_OF_DAY);
calendar.get(Calendar.MINUTE);
时间选择-TimePicker
获取:
findViewById(R.id.btn_sure_time).setOnClickListener(this);
timePicker = findViewById(R.id.time_text);
timePicker.setIs24HourView(true); //24小时
if (view.getId() == R.id.btn_sure_time){
String desc = String.format("%s时%s分",timePicker.getHour(),timePicker.getMinute());
text_date.setText(desc);
}
时间对话框-TimePickerDialog
//时间提示框,android.R.style.Theme_Holo_Light_Dialog滚动选择
TimePickerDialog dialog1 = new TimePickerDialog(this,android.R.style.Theme_Holo_Light_Dialog,this,15,34,true);
dialog1.show();
//时钟选择
TimePickerDialog dialog1 = new TimePickerDialog(this,this,15,34,true);
//监听事件
@Override
public void onTimeSet(TimePicker timePicker, int hour, int minute) {
String desc = String.format("%s时%s分",hour,minute);
text_date.setText(desc);
}