自定义控件

title_layout.xml

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
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/titleviews"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="@color/purple_200">

<ImageView
android:id="@+id/title_iv_left"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:src="@mipmap/icon_back"/>
<ImageView
android:id="@+id/title_iv_right"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginRight="10dp"
android:layout_alignParentRight="true"
android:src="@mipmap/icon_setting"/>
<TextView
android:id="@+id/title_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="标题"
android:layout_centerInParent="true"
android:textSize="20sp"/>

</RelativeLayout>

TitleView.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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package com.xyl.app1105.view;
import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.xyl.app1105.R;


/**
* 作者:animee on 2022/11/5 17:07
* 接口回调:
* 当这个类的某项事件由它触发,但是功能不是由它决定,就可以用接口回调解决。
* 1. 创建接口,编写回调方法
* 2. 在这个类中,将接口设置为成员变量,然后通过set方法对其进行赋值
* 3. 在被触发的地方调用这个接口的方法
*/
public class TitleView extends RelativeLayout implements View.OnClickListener {
ImageView leftIv,rightIv;
TextView titleTv;
RelativeLayout layout;

public interface OnClickImgListener{
public void onClick(View view);
}
OnClickImgListener leftListener, rightListener;
public void setOnClickLeftImgListener(OnClickImgListener leftListener){
this.leftListener = leftListener;
}
public void setOnClickRightImgListener(OnClickImgListener rightListener){
this.rightListener = rightListener;
}

// 在代码当中创建view对象时,会调用的构造方法
public TitleView(Context context) {
this(context,null);
}
// 在布局当中写view对象时,会调用的构造方法
public TitleView(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.title_layout,this);
initView();
setEvent();
}

private void setEvent() {
leftIv.setOnClickListener(this);
rightIv.setOnClickListener(this);
}

private void initView() {
leftIv = findViewById(R.id.title_iv_left);
rightIv = findViewById(R.id.title_iv_right);
titleTv = findViewById(R.id.title_tv);
layout = findViewById(R.id.titleviews);
}
/** 设置标题*/
public void setTitle(String title){
titleTv.setText(title);
}
public void setTitle(int titleId){
titleTv.setText(titleId);
}
/** 设置标题颜色*/
public void setTitleColor(int color){
titleTv.setTextColor(color);
}
/** 设置背景颜色*/
public void setBgResource(int color){
layout.setBackgroundResource(color);
}
public void setBgColor(int color){
layout.setBackgroundColor(color);
}

/** 设置是否显示左右图片*/
public void setVisibleImg(int left,int right){
leftIv.setVisibility(left);
rightIv.setVisibility(right);
}

/** 修改左边显示图片*/
public void setLeftImgResource(int resId){
leftIv.setImageResource(resId);
}
public void setRightImgResource(int resId){
rightIv.setImageResource(resId);
}

@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.title_iv_left:
// ((Activity)getContext()).finish();
if(leftListener != null){
leftListener.onClick(view);
}
break;
case R.id.title_iv_right:
if(rightListener!=null){
rightListener.onClick(view);
}
break;
}
}
}

对话框

  1. 新建AlertDialog.Builder对象
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
  2. 设置一些属性
    builder.setXXX()
  3. builder.create().show();

简单对话框

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* 最简单的对话框: 确认对话框
*/
private void simpleDialog() {
//1. 创建对话框的装饰对象
AlertDialog.Builder builder = new AlertDialog.Builder(this);
//2. 设置显示内容
builder.setIcon(R.mipmap.jvxie)
.setTitle("提示信息")
.setMessage("您确定要退出当前页面吗")
//右边按钮
.setPositiveButton("取消", null)
//左边按钮
.setNegativeButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
//3. 获取对话框对象
AlertDialog dialog = builder.create();
dialog.show();
}

单选对话框

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* 单选按钮的对话框
*/
private void singleDialog() {
String [] arr = {"男", "女", "其他"};
//1. 创建对话框的装饰对象
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.mipmap.baiyang)
.setTitle("请选择您的性别")
.setSingleChoiceItems(arr, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showToast("您选择了性别: " + arr[which]);
//取消对话框
dialog.cancel();
}
});
builder.create().show();
}

private void showToast(String s) {
Toast.makeText(this, s, Toast.LENGTH_SHORT).show();
}

列表对话框

1
2
3
4
5
6
7
8
9
10
11
12
13
private void listDialog() {
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mDatas);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.mipmap.jinniu)
.setTitle("请选择您的学校科目")
.setAdapter(adapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showToast("您选择了: " + mDatas.get(which));
}
});
builder.create().show();
}

多选按钮对话框

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
String mArr[] = {"JAVA", "Android", "C", "C++", "Python", "数据运营", "算法", "数据结构", "C#"};
boolean bArr[] = {false, false, false, false,false,false,false,false,false};
/**
* 多选按钮对话框
*/
private void multiDialog() {
List<String> list = new ArrayList<>();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.mipmap.jinniu)
.setTitle("请选择您的学校科目")
.setMultiChoiceItems(mArr, bArr, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {

}
}).setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
for (int i = 0; i < bArr.length; i++) {
if(bArr[i]){
list.add(mArr[i]);
}
}
showToast("您选择了: " + list.toString());
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.create().show();
}

自定义对话框

layout/dialog_input.xml

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
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:padding="20dp">
<TextView
android:id="@+id/dialog_input_tv1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="备注"
android:textSize="26sp"
android:textStyle="bold"/>
<EditText
android:id="@+id/diput_et1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="20dp">
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/diput_btn1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="取消"
android:background="@drawable/bg_btn"/>
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/diput_btn2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="10dp"
android:text="确定"
android:background="@drawable/bg_btn"/>
</LinearLayout>

</LinearLayout>

view/inputMsgDialog.java

相当于弹出一个小页面,所以与之前自定义view不同的是不需inflate转换成view对象,也因此可以直接在自定义类中调用onClick方法

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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package com.xyl.app1107.view;

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import androidx.annotation.NonNull;

import com.xyl.app1107.R;

public class InputMsgDialog extends Dialog implements View.OnClickListener {
EditText inputEt;
Button rightBtn, leftBtn;
TextView titleTv;

public InputMsgDialog(@NonNull Context context) {
super(context);
}

public interface OnBtnClickListener{
public void onBtnClick(int gravity);
}
OnBtnClickListener onLeftBtnClickListener, onRightBtnClickListener;

public void setOnLeftBtnCLickListener(OnBtnClickListener onLeftBtnClickListener){
this.onLeftBtnClickListener = onLeftBtnClickListener;
}

public void setOnRightBtnClickListener(OnBtnClickListener onRightBtnClickListener){
this.onRightBtnClickListener = onRightBtnClickListener;
}


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_input);
initView();
setEvent();
}

private void setEvent() {
leftBtn.setOnClickListener(this);
rightBtn.setOnClickListener(this);
}

private void initView() {
titleTv = findViewById(R.id.dialog_input_tv1);
inputEt = findViewById(R.id.diput_et1);
rightBtn = findViewById(R.id.diput_btn1);
leftBtn = findViewById(R.id.diput_btn2);
}
public void setTitle(String text){
titleTv.setText(text);
}

public void setTitleColor(int color){
titleTv.setTextColor(color);
}

public void setButtonText(String left, String right){
leftBtn.setText(left);
rightBtn.setText(right);
}
public void setWidth(){
//得到当前对话框的窗口
Window window = getWindow();
//得到窗口的属性对象
WindowManager.LayoutParams wlp = window.getAttributes();
//设置窗口位置
wlp.gravity = Gravity.BOTTOM;
//获取屏幕的宽度
Display display = window.getWindowManager().getDefaultDisplay();
wlp.width = display.getWidth();
//将背景设置为透明,去除边框
window.setBackgroundDrawableResource(android.R.color.transparent);
//设置窗口属性
window.setAttributes(wlp);
}
/**
* 获取输入内容的函数
*/
public String getInputMsg(){
return inputEt.getText().toString().trim();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.diput_btn1:
if(onLeftBtnClickListener!=null){
onLeftBtnClickListener.onBtnClick(Gravity.LEFT);
}
cancel();
break;
case R.id.diput_btn2:
if (onRightBtnClickListener!=null){
onRightBtnClickListener.onBtnClick(Gravity.RIGHT);
}
cancel();
break;
}
}
}

使用自己写的dialog

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 使用自己写的对话框
*/
private void customDialog(){
InputMsgDialog dialog = new InputMsgDialog(this);
dialog.show();

dialog.setTitle("记录消费信息");
dialog.setTitleColor(Color.RED);
dialog.setWidth();
dialog.setOnRightBtnClickListener(new InputMsgDialog.OnBtnClickListener() {
@Override
public void onBtnClick(int gravity) {
String inputMsg = dialog.getInputMsg();
tv = findViewById(R.id.tv1);
tv.setText(inputMsg);
}
});
}

日期对话框

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 显示日期对话框
*/
private void showDateDialog() {
Calendar calendar = Calendar.getInstance();
DatePickerDialog dialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
String msg = year + "年" + (month+1) + "月" + dayOfMonth + "日";
tv.setText(msg);
}
}, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH));
dialog.show();
}

时间对话框

1
2
3
4
5
6
7
8
9
10
11
private void showTimeDialog() {
Calendar calendar = Calendar.getInstance();
TimePickerDialog timePickerDialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
String msg = hourOfDay + ":" + minute;
tv.setText(msg);
}
}, calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), true);
timePickerDialog.show();
}

进度对话框

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
int value = 0;
ProgressDialog dialog;
Handler handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (value>=100) {
dialog.dismiss();
}
else{
value += 1;
dialog.setProgress(value);
handler.sendEmptyMessageDelayed(1, 100);
}
}
};
private void showProgressDialog() {
dialog = new ProgressDialog(this);
dialog.setIcon(R.mipmap.shuiping);
dialog.setMessage("正在加载中....");
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setMax(100);
dialog.show();
value = 0;
handler.sendEmptyMessageDelayed(1, 100);
}