Android-Button

StateListDrawable

  StateListDrawable:StateListDrawable就是对应于selector标签,也是表示一个Drawable集合,每个Drawable都对应View的一种状态
  StateListDrawable用途:设置可单击的View的背景,常和ShapeDrawable一起使用

StateListDrawable常用属性

  1. drawable: 引用的drawable位图
  2. state_focused: 是否获得焦点
  3. state_pressed: 控件是否被按下
  4. state_enaabled: 控件是否可用
  5. state_selected: 控件时是否被选择,针对有滚轮的情况
  6. state_checked: 控件是否被勾选
  7. state_checkable: 控件可否被勾选

Button使用drawable文件设置背景

Button继承自TextView,基本属性大致相同

Button背景选择器

1.在app/src/main/res/drawable目录下创建一个drawable资源文件

2.导入几张drawable图片

3.在资源文件中写入对应的item标签

1
2
3
4
5
6
7
8
9

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 被按下时-->
<item android:drawable="@drawable/ic_baseline_accessible_24" android:state_pressed="false"/>
<!-- 没有按下时-->
<item android:drawable="@drawable/ic_baseline_accessible_forward_24" android:state_pressed="true"/>
</selector>

4.将按钮的背景设置为drawable文件

1
2
3
4
5
6
<Button
android:layout_width="80dp"
android:layout_height="80dp"
android:id="@+id/btn1"
android:background="@drawable/button1"
android:text="按钮"/>

5.当按钮按下时,背景为ic_baseline_accessible_forward_24,松开时为ic_baseline_accessible_24

Button事件处理

单击事件

1
2
3
4
5
6
7
8
btn1 = findViewById(R.id.btn1);

btn1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
tv_one.setText("大丈夫生居天地间,岂能郁郁久居人下");
}
});

单击事件还可以在xml中对某控件添加

1
2
3
4
5
6
7
8
<Button
android:layout_width="80dp"
android:layout_height="80dp"
android:id="@+id/btn1"
<!-- 需要有对应的TestClick()方法-->
android:onClick="TestClick"
android:background="@drawable/button1"
android:text="按钮"/>

长按事件

1
2
3
4
5
6
7
8
9
10
btn1 = findViewById(R.id.btn1);

btn1.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
tv_one.setText("须知少时凌云志,曾许人间第一流");
// 返回true时,不再执行OnClick事件(若存在)
return true;
}
});

触摸事件

触摸事件分为三种

  1. ACTION_UP = 1(离开)
  2. ACTION_DOWM = 0(按下)
  3. ACTION_MOVE = 2(移动)
1
2
3
4
5
6
7
8
btn1.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
tv_one.setText("他日若遂凌云志,敢笑黄巢不丈夫");
// 返回true时,不再相应OnClick和OnLongClick事件(若存在)
return false;
}
});

RadioButton和RadioGroup

  1. RadioButton是安卓中用来实现单选功能的组件
  2. RadioGroup是一个可以容纳多个RadioButton的容器

在没有RadioGroup的情况下,RadioButton可以全部选中,RadioGroup中的RadioButton只能选中一个

常用方法

1
2
3
4
5
6
7
8
9
10
11
//1.获取按钮组中选中按钮的id
RadioGroup.getCheckedRadioButtonId();

//2.清除选中状态
RadioGroup.clearCheck();

//3.设置指定单选按钮为选中状态,如果传递-1则等同于clearCheck
RadioGroup.check();

//4.RadioGroup的单选按钮选中状态事件监听器
RadioGroup.setOnCheckedChangeListener();

操作方式

布局文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical"
android:gravity="center"
xmlns:android="http://schemas.android.com/apk/res/android">
<RadioGroup
android:id="@+id/group1"
android:background="@color/lightyellow"
android:layout_width="match_parent"
android:gravity="center"
android:layout_height="200dp">
<!-- 添加android:checked="true"可设置默认选中-->
<RadioButton
android:id="@+id/btn1"
android:text="炎龙铠甲"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<RadioButton
android:id="@+id/btn2"
android:text="风鹰铠甲"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<RadioButton
android:id="@+id/btn3"
android:text="黑犀铠甲"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<RadioButton
android:id="@+id/btn4"
android:text="地虎铠甲"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<RadioButton
android:id="@+id/btn5"
android:text="雪獒铠甲"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RadioGroup>
</LinearLayout>

java代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
private RadioGroup group;
private RadioButton btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

group = findViewById(R.id.group1);
// 选中R.id.btn1
group.check(R.id.btn1);
// 多选按钮组选中事件
group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
// 得到选中的按钮
btn = findViewById(checkedId);
Toast.makeText(MainActivity.this,btn.getText(),Toast.LENGTH_SHORT).show();
}
});
}
}

checkBox(多选按钮)

为其设置check=”true”属性则选中

常用方法

1
2
3
4
5
//判断checkBox是否为选中状态
check.isChecked();

//选中状态事件监听
check.setOnCheckedChangeListener();

实例

提示选中的复选框的文本内容,当没有复选框被选中时,按钮不可点击

布局文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_height="match_parent"
android:id="@+id/linear1"
android:layout_width="match_parent"
android:orientation="vertical"
android:gravity="center"
xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBox
android:id="@+id/checkBox1"
android:text="炎龙铠甲"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<CheckBox
android:id="@+id/checkBox2"
android:text="风鹰铠甲"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<CheckBox
android:id="@+id/checkBox3"
android:text="黑犀铠甲"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<CheckBox
android:id="@+id/checkBox4"
android:text="地虎铠甲"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<CheckBox
android:id="@+id/checkBox5"
android:text="雪獒铠甲"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<!-- 初始状态设置为不可点击-->
<Button
android:id="@+id/btn1"
android:text="选中状态"
android:enabled="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>

java代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.LinearLayout;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener {
private CheckBox[] checkBoxes = new CheckBox[5];
private Button btn1;
private LinearLayout linear1;
private int count;
private List<String> list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

linear1 = findViewById(R.id.linear1);
// linear1.getChildCount()获取linear1子控件的个数
for (int i = 0;i < linear1.getChildCount();i++){
// 获取第i个子控件
View view = linear1.getChildAt(i);
// 判断是否为CheckBox类型
if (view instanceof CheckBox){
// 将View型强转为CheckBox型
checkBoxes[i] = (CheckBox) view;
checkBoxes[i].setOnCheckedChangeListener(this);
}
}

// 给底部按钮添加click
btn1 = findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String str = "";
for (int i = 0;i < list.size();i++){
str += list.get(i) + ";";
}
Toast.makeText(MainActivity.this,str,Toast.LENGTH_SHORT).show();
}
});
}

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// 判断点击后的checkBox是否为选中状态
if (isChecked){
count++;
list.add(buttonView.getText().toString());
// 如果按钮不可点击则设置为可点击
if (!btn1.isEnabled()){
btn1.setEnabled(true);
}
}
else {
count--;
list.remove(buttonView.getText().toString());
// 全部未选中时设置按钮为不可点击
if (count == 0){
btn1.setEnabled(false);
}
}
}
}