Android应用开发学习第五天-中级控件

目录

图形定制

drawable类

形状图形-shape

点9图片

状态列表图形-StateListDrawable

复选框-CheckBox

开关按钮-switch

单选按钮-RadioButton

编辑框-editText

焦点变更监听-setOnFocusChangeListener  

文本变化监听器-addTextChangedListener

提醒对话框-AlertDialog

日期选择-DatePicker

日期对话框-DatePickerDialog

时间选择-TimePicker

时间对话框-TimePickerDialog


图形定制

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);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值