Android - Date & Time 组件

1. TextClock 文本时钟

TextClock 可以以字符串格式显示当前的日期和时间

效果

用法非常简单,没有什么值得说的,android:format24Hour 属性的参数就是一个时间格式化字符串,之后可能会单独写一篇文章

示例代码

1
2
3
4
5
<TextClock
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:format24Hour="yyyy-MM-dd HH:mm:ss"
/>

Android - Date/TimePickerDialog 日期和时间选择器

DatePickerDialog 和 TimePickerDialog 可以供用户来选择日期和时间

示例代码

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
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

findViewById(R.id.btn_pick_date).setOnClickListener(this);
findViewById(R.id.btn_pick_time).setOnClickListener(this);
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_pick_date:
Calendar cale1 = Calendar.getInstance();
new DatePickerDialog(
MainActivity.this,
new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
String result = "";
// 这里获取到的月份需要 +1s
result += "你选择的日期是:" + year + "年" + (monthOfYear + 1) + "月" + dayOfMonth + "日";
Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show();
}
},
cale1.get(Calendar.YEAR),
cale1.get(Calendar.MONTH),
cale1.get(Calendar.DAY_OF_MONTH)
).show();
break;
case R.id.btn_pick_time:
Calendar cale2 = Calendar.getInstance();
new TimePickerDialog(
MainActivity.this,
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
String result = "";
result += "你选择的时间是:" + hourOfDay + "时" + minute + "分";
Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show();
}
},
cale2.get(Calendar.HOUR_OF_DAY),
cale2.get(Calendar.MINUTE),
true
).show();
break;
}
}
}

Android - ProgressDialog 进度对话框

创建进度对话框主要有两种方法

  • 1. 直接调用 ProgressDialog 提供的静态方法 show() 显示
  • 2. 创建 ProgressDialog 对象,再设置对话框的参数,最后调用 show() 显示

ProgressDialog 有 STYLE_HORIZONTAL 和 STYLE_SPINNER 两种样式

示例代码

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
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private ProgressDialog pd2 = null;

private final static int MAXVALUE = 100;
private int progressStart = 0;
private int add = 0;

@SuppressLint("HandlerLeak")
final Handler hand = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0x114514) {
//设置进度条的当前值
pd2.setProgress(progressStart);
}
if (progressStart >= MAXVALUE) {
pd2.dismiss();
}
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

findViewById(R.id.btn1).setOnClickListener(this);
findViewById(R.id.btn2).setOnClickListener(this);
findViewById(R.id.btn3).setOnClickListener(this);
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1:
ProgressDialog.show(MainActivity.this, "Loading", "少女祈祷中...", false, true);
break;
case R.id.btn2:
ProgressDialog pd1 = new ProgressDialog(MainActivity.this);
// 依次设置标题,内容
pd1.setTitle("Loading");
pd1.setMessage("思考好玩的加载提示中...");
pd1.setCancelable(true);
// 这里是设置进度条的风格, HORIZONTAL 是水平进度条, SPINNER 是圆形进度条
pd1.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd1.setIndeterminate(true);
// 调用 show() 方法将ProgressDialog显示出来
pd1.show();
break;
case R.id.btn3:
progressStart = 0;
add = 0;
pd2 = new ProgressDialog(MainActivity.this);
pd2.setMax(MAXVALUE);
pd2.setTitle("Loading");
pd2.setMessage("正在挽救纱世里...");
pd2.setCancelable(false);
pd2.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// 取消不确定性进度
pd2.setIndeterminate(false);
pd2.show();
// 新建一个线程更新进度
new Thread() {
public void run() {
while (progressStart < MAXVALUE) {
progressStart = 2 * takeTime();
hand.sendEmptyMessage(0x114514);
}
}
}.start();
break;
}
}

private int takeTime() {
add++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return add;
}
}

Android - Notification 通知

1. 基本使用流程

状态通知栏主要涉及到2个类:Notification 和 NotificationManager

Notification: 通知信息类,它里面对应了通知栏的各个属性
NotificationManager: 是状态栏通知的管理类,负责发通知、清除通知等操作。

基本使用流程:

Step 1. 获得 NotificationManager 对象:NotificationManager mNManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Step 2. 创建一个通知栏的 Builder 构造类:Notification.Builder mBuilder = new Notification.Builder(this);
Step 3. 对 Builder 进行相关的设置,比如标题,内容,图标,动作等
Step 4. 调用 Builder 的 build() 方法为 notification 赋值
Step 5. 调用 NotificationManager的 notify() 方法发送通知

PS. 还可以调用 NotificationManager 的 cancel() 方法取消通知

2. 常用方法

首先创建 Builder 构造类

1
Notification.Builder mBuilder = new Notification.Builder(this);

然后再调用下述的相关的方法进行设置

Android - Vibrator 设备震动控制

首先需要在 AndroidManifest.xml 中申明权限

1
<uses-permission android:name="android.permission.VIBRATE" />

实例化 Vibrator 类

1
Vibrator vibrator = (Vibrator) getApplicationContext().getSystemService(VIBRATOR_SERVICE);

单次震动

1
2
// 参数为震动时间,单位为 ms
vibrator.vibrate(1000);

循环震动

1
2
3
4
5
long[] patter = {50, 50, 50, 100};
// 第一个参数接受一个 long 型数组
// patter 的偶下标为静止时间,奇下标为震动时间
// 第二个参数为循环模式,指定从数组的哪个下标开始循环,-1为不循环
vibrator.vibrate(patter, 0);

停止/取消震动

1
vibrator.cancel();

Android 帧动画

  • 在 drawable 目录下新建 frames.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">

<item
android:drawable="@drawable/p1"
android:duration="50" />

<item
android:drawable="@drawable/p2"
android:duration="50" />

<item
android:drawable="@drawable/p3"
android:duration="50" />

<item
android:drawable="@drawable/p4"
android:duration="50" />

</animation-list>
  • 在页面中调用 frames.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<ImageView
android:id="@+id/iv"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
app:srcCompat="@drawable/frames" />

</LinearLayout>
  • 解析并开启动画
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

ImageView iv = findViewById(R.id.iv);

AnimationDrawable animationDrawable = (AnimationDrawable) iv.getDrawable();
if(!animationDrawable.isRunning()){
animationDrawable.start();
}
}
}

  • 下面是纯代码方式实现
1
2
3
4
5
6
7
8
9
AnimationDrawable animationDrawable1 = new AnimationDrawable();
int[] ids = {R.drawable.p1,R.drawable.p2,R.drawable.p3,R.drawable.p4};
for(int i = 0 ; i < 4 ; i ++){
Drawable frame = getResources().getDrawable(ids[i]);
animationDrawable1.addFrame(frame,50);
}
animationDrawable1.setOneShot(false);
iv.setBackground(animationDrawable1);
animationDrawable1.start();

Android - CameraManager 控制闪光灯

需要注意的是安卓不同版本间会有一些变化,安卓7.0以上和7.0以下的版本有所区别

安卓 7.0 以上:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@TargetApi(Build.VERSION_CODES.N)
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void flashControl(boolean enable) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
try {
CameraManager cameraManager = (CameraManager) getApplicationContext().getSystemService(Context.CAMERA_SERVICE);
String[] ids = cameraManager.getCameraIdList();
for (String id : ids) {
CameraCharacteristics c = cameraManager.getCameraCharacteristics(id);
Boolean flashAvailable = c.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
Integer lensFacing = c.get(CameraCharacteristics.LENS_FACING);
if (flashAvailable != null && flashAvailable && lensFacing != null && lensFacing == CameraCharacteristics.LENS_FACING_BACK) {
cameraManager.setTorchMode(id, enable);
}
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
}

安卓 7.0 以下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Camrea camera = Camera.open();
Camera.Parameters parameters = camera.getParameters();
// 开启闪光灯
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameters);
// 关闭闪光灯
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);

// 最后需要在销毁函数中回收资源
@Override
public void onDestroy() {
super.onDestroy();
camera.release();
}

Android 使用 Gson 解析 Json

解析 Json

实例 Json 数据:

1
2
3
4
5
6
7
8
{
"name": "RED NENO",
"age": 16,
"hobby": [
{"game": "RainbowSix Siege"},
{"programming": "JavaScript"}
]
}

Android 打开第三方应用

前言

安卓开发过程中,难免会遇到需要打开第三方应用(e.g. QQ、微信、支付宝)或者系统应用(e.g. 电话、短信、相册)等进行相关操作的情况。我总结了一些常用的第三方应用唤起方式,供备忘和参考。

查阅系统应用包名

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×