前言:本文章伴随我学习Android Studio的过程中,将自己遇到的问题以及相应的解决方案整理发布,持续更新中…
1.在xml布局文件中设置数字键盘,自定义其输入内容
android:inputType="number"//设置为数字键盘
android:digits="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,. -"
//此digits中可以自由设置需要实现的输入内容
效果如下:
2.音量按键监听
以实现自定义音量按键执行事件(应将其添加在OnCreat方法之外)
/音量按键监听,其实就是监听有什么按键被触发,然后进行相应操作。
@Override//重写
public boolean onKeyDown (int keyCode, KeyEvent event) {
(预留位置)
switch (keyCode) {//此处的KeyCode变量其是指向按键对应的内容,比如按下音量+、—
// 音量减小
case KeyEvent.KEYCODE_VOLUME_DOWN:
//输入执行事件
}
return true;//若要执行音量键原有功能,可设为false
// 音量增大
case KeyEvent.KEYCODE_VOLUME_UP:
//输入执行事件
}
return true;
}
return super.onKeyDown (keyCode, event);
}
虽然此音量按键监听的实现方法就是如上方代码所示,但是我们会有需要通过音量按键来执行对应的操作,比如实现相应的方法或者是对布局的控件进行设置操作。
此时容易陷入死胡同:我一直疑惑为什么我无法在onKeyDown方法中,调用控件或者调用OonCreate中的方法,我明明在其中声明了控件和创建了类和方法。
直到我看到了我们老师的一句话:
看似没有回答我的问题,但却已经回答了问题。于是,我就索性尝试把OonCreate方法中的声明丢进去onKeyDown方法之中,体现在上方我代码中注释了预留位置的区域,具体测试结果看下图:
上图(1、2)表示我将onKeyDown方法写在的位置(这次出现上诉问题的前提),(4)为我之前想直接通过onKeyDown方法,去自定义音量按键对应事件的时候遇到的错误,一是控件TextView tv1 无法解析,一是调用已经写的方法报错,软件甚至建议修改为局部变量。那我们索性就将其把OonCreate方法中的声明丢进去onKeyDown方法之中,就完美的解决了这个问题,实现了音量按键监听中的方法。(大家可以自己对比体会一下)
总结:
1.onKeyDown方法和onKeyDown方法是两个不同的方法,所以,出现之前的报错是正常的,我们只需在对应方法中重新声明(对应的内容)即可。
2.对于控件,无论本地方法还是内部方法等等相互隔离不是共用的方法可以分别声明需要用的控件等等,毕竟我们的事件还是对控件进行相关操作,声明只不过是保证能在方法中实现找到并进行操作。
3.为什么如此简单的的不同方法,对应声明看似简单的技能,正常编程就应该想到,但是这就是所谓的进入了死胡同,或者可以理解为思维突然凝固了,适当休息,从不同的方向思考,培养文科生的发散思维,跳出框架看问题,从不同的方向看问题,或许就能茅塞顿开,找到解决问题的方法。
笔者注:以上理解基于学习过程中的体会,若有纰漏欢迎大佬指出修改!
3.CheckBox监听器
复选框,以实现多重选择功能
CheckBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(CheckBox.isChecked()) {
//若该选项被选中,将执行的操作
}
}
});
4.单选按钮监听器
一般引入RadioGroup以实现改组内的单选具有排他性,也就是只能选择其一选项
RadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {
RadioButton RadioButton=findViewById(RadioButton.getCheckedRadioButtonId());
if(RadioButton.isChecked()){
//若其中指定的RadioButton,执行事件(对RadioButton控件需要自行申明)
}
}
});
5.控件是否显示
if (条件) {
控件ID.setVisibility(View.INVISIBLE);//满足条件执行,使控件不可见
} else {
控件ID.setVisibility(View.VISIBLE);//满足条件执行,使控件可见
}
6.Button监听器
Button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//满足条件执行事件
}
});
}
7.EditText监听器(实时监听)
EditText控件ID.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
//在编辑框改变前执行的事件
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//编辑框改变的时候执行的事件
}
@Override
public void afterTextChanged(Editable s) {
//编辑框改变之后执行的事件
}
});
8.EditText监听器(焦点离开监听)
EditText控件ID.setOnFocusChangeListener(new android.view.View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
// 此处为得到焦点时的处理内容
} else {
// 此处为失去焦点时的处理内容
}
}
});
///错误提示。效果如下:
EditText控件ID.setError("输入时间错误,请重新输入!");
9.Toast显示文本
Toast msg1=Toast.makeText(this,"文本内容",Toast.LENGTH_SHORT)//持续时间约2s
//第三个参数可以改为:Toast.LENGTH_LONG(持续时间约3.5s)
msg1.show();//调用show方法实现
//smg1可改为其他自己定义的变量名
10.获取字符串指定位置字符
String str="123456789"
String str0=str.substring(int star.int end);
//返回从star开始到end(不包括end位置)取的字符串
//例如:
String str0=str.substring(str.length()-2,str.length()-1);
//返回倒数第二位的字符给str0
if(str0.equals("对应字符串"))//比较字符串相同条件建议使用equals方法
//如果传入参数为负数,则会报错
11.判断输入字符串是否为规定的正确日期/时间格式
我们通过Try Catch来处理异常,而我们的异常就是输入的字符串是否能被我们通SimpleDateForma类中的方法parse转化为正确的Date类型,若不可以,那么抛出常:java.lang.ClassCastException。
转而执行catch中的语句。
如下图体现的是输入字符串是否为正确的格式yyyyMMdd,例如:2022428
// String str = "2022/4/28";
try {
///
SimpleDateFormat dt1 = new SimpleDateFormat("yyyyMMdd");
dt1.setLenient(false);
//方法的含义是是否严格解析日期
//若为false,则禁止SimpleDateFormat的自动计算功能。
// SimpleDateFormat dt2 = new SimpleDateFormat("yyyy-MM-dd");
// SimpleDateFormat dt3 = new SimpleDateFormat("yyyy年MM月dd日");
// SimpleDateFormat dt4 = new SimpleDateFormat("yyyy/MM/dd");
// SimpleDateFormat tt1 = new SimpleDateFormat("HHmm");
// SimpleDateFormat tt2 = new SimpleDateFormat("HH:mm");
// SimpleDateFormat tt3 = new SimpleDateFormat("HH点mm分");
// SimpleDateFormat tt4 = new SimpleDateFormat("HH时mm分");
Date Dt1 = dt1.parse(str);
// Date Dt2 = dt2.parse(str);
// Date Dt3 = dt3.parse(str);
// Date Dt4 = dt4.parse(str);
// Date Tt1 = tt1.parse(str);
// Date Tt2 = tt2.parse(str);
// Date Tt3 = tt3.parse(str);
// Date Tt4 = tt4.parse(str);
// tv1.setText(Dt11);
}catch (ParseException e){
tv1.setText("执行异常");
}
/try catch模板
try{
//
}catch(ParseException e//可改为其他异常){
//
}
12.DatePickerDialog监听器(点击“确定”按钮触发)
//如果想要单机Button等等控件弹出DatePickerDialog
//需要在对应监听器中定义DatePickerDialog对象
//通过方法(对象名称.show())实现
DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int i, int i1, int i2) {
//执行事件
}
};
13.TimePickerDialog监听器(点击“确定”按钮触发)
Calendar cl=Calendar.getInstance();
TimePickerDialog td=new TimePickerDialog(MainActivity.this,timeSetListener,cl.get(Calendar.HOUR_OF_DAY),cl.get(Calendar.MINUTE),true);
td.show();
///同DatePickerDialog类似,通过定义对象,方法show弹出。只不过其中初始化TimePickerDialog的时间,小时分钟参数,采用Calendar中的方法实现获取。
TimePickerDialog.OnTimeSetListener timeSetListener=new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker timePicker, int i, int i1) {
//执行事件
}
};
14.字符串分割存入数组:split()方法
将字符串分割为子字符串,然后将结果作为字符串数组返回。
String a="2022-4-28"
String[] aa = a.split("-");//以"-"去分割,若为转义字符( | , + , * , ^ , $ 等等),前面必须得加"\\"。
/效果:aa[]={2022,4,28}
15.RatingBar监听器
rb1.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
@Override
public void onRatingChanged(RatingBar ratingBar, float v, boolean b) {
//执行的事件
}
});
16.EditText的键盘回车键监听
通过点击回车键,执行监听中的事件操作,可在XML布局定义自己的回车按键。
actionSearch : 搜索
actionSend : 发送
actionDone : 完成
et1.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
String str=et1.getText().toString();
//执行事件
return false;
}
});
17.seekbar监听器
控件ID.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
//TO DO
// 获取的i变量数值则为seekbar调整的进度值
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
//TO DO
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//TO DO
}
});
18.自定义RatingBar图案
首先在XML中布局RatingBar控件,并使用:
<RatingBar
android:id="@+id/RB"
android:progressDrawable="@drawable/tuan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:stepSize="0.5"
android:rating="2.5">
</RatingBar>
如上图在drawable中新建drawable Resource File,直接将内容改为下方配置:
此处RatingBar步长为0.5
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background"
android:drawable="/**1**/"/>//此处调用的资源为RatingBar未选中的黑白照片
<item android:id="@android:id/secondaryProgress"
android:drawable="/**2**/"/>//此处调用的资源为RatingBar选中一半的(左彩色,右黑白照片)
<item android:id="@android:id/progress"
android:drawable="/**3**/"/>//此处调用的资源为RatingBar选中的彩色照片
</layer-list>
最后在XML中使用下方命令调用即可。
android:progressDrawable=“@drawable/tuan”
如果有什么不明白的问题,可以评论留言,大家一起交流讨论鸭!