UI Kits 用户交互工具¶
Toast¶
Toast.makeText(context, "hint", Toast.LENGTH_LONG).show()
自定义Toast
View layout = getLayoutInflater().inflate(R.layout.dialog, null);
Toast toast = new Toast(this);
toast.setGravity(Gravity.BOTTOM, 0, 20);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();
Notification¶
状态栏通知
NotificationManager and NotificationChannel¶
创建通知之前需要设置NotificationManager和Channel
channel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_DEFAULT);
manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
manager.createNotificationChannel(channel);
普通通知¶
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId);
builder.setContentTitle("这是通知的标题")
.setSmallIcon(R.drawable.ic_launcher_foreground) // 必须设置小图标
.setContentText("这是通知的内容")
.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);
Intent intent = new Intent(this, NextActivity.class);
intent.putExtra("msg", "通知的内容");
// PendingIntent.FLAG_ONE_SHOT 一次性通知
PendingIntent pendingIntent = PendingIntent.getActivity(this, 1, intent, PendingIntent.FLAG_ONE_SHOT);
builder.setContentIntent(pendingIntent);
manager.notify(1, builder.build());
进度条通知¶
new Thread() {
@Override
public void run() {
int notificationId = 100;
NotificationCompat.Builder builder = new NotificationCompat.Builder(MainActivity.this, channelId);
builder.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentTitle("正在滚动进度条");
for (int i=0; i<=100; ++i) {
builder.setProgress(100, i, false);
manager.notify(notificationId, builder.build());
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
builder.setContentTitle("滚动完成");
manager.notify(notificationId, builder.build());
}
}.start();
大视图通知¶
- 设置builder
- 设置style
- 发送通知
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId);
builder.setSmallIcon(R.drawable.ic_launcher_foreground);
switch ((int)Math.floor(Math.random()*3)) {
case 0:
NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
inboxStyle.setBigContentTitle("这是一条大型标题哦");
inboxStyle.addLine("第一条通知");
inboxStyle.addLine("第二条通知");
inboxStyle.addLine("第三条通知");
inboxStyle.setSummaryText("本次一共发送了3条通知");
builder.setStyle(inboxStyle);
break;
case 1:
NotificationCompat.BigTextStyle bigTextStyle = new NotificationCompat.BigTextStyle();
bigTextStyle.setBigContentTitle("这是一条大标题");
bigTextStyle.setSummaryText("下面是一条大标题");
builder.setStyle(bigTextStyle);
break;
case 2:
NotificationCompat.BigPictureStyle bigPictureStyle = new NotificationCompat.BigPictureStyle();
bigPictureStyle.bigPicture(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher_foreground));
bigPictureStyle.setSummaryText("下面是一张很大的图片");
builder.setStyle(bigPictureStyle);
break;
}
manager.notify(4, builder.build());
自定义通知¶
参考RemoteView以及setContent()
并不是所有的控件都可以在通知区域显示 比如switch就不行
通知区域的高度是有限的,不能无限占用
Dialog¶
对话框
- 创建builder对象,并设置对话框参数
- 设置所显示的内容
- 为对话框中的空间绑定监听器
- 使用builder生成Dialog对象
- 调用builder的show方法显示对话框
AlertDialog¶
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("这是一场开发者测试");
builder.setMessage("我是新手开发者Jack");
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.i("TAG", "用户点击了确认按钮");
}
});
builder.show();
AlertDialog alertDialog = builder.create();
alertDialog.show();
ProgressDialog¶
DatePickerDialog¶
- 创建DatePickerDialog.OnDateSetListener
- 创建DatePickerDialog
- show()
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
DatePickerDialog.OnDateSetListener onDateSetListener = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
textView.setText("" + year + " " + month + " " + dayOfMonth);
}
};
DatePickerDialog dialog = new DatePickerDialog(this, onDateSetListener, 2018, 8, 8);
dialog.show();
TimePickerDialog¶
自定义Dialog¶
setView()
inflate()
LayoutInflater inflater = LayoutInflater.from(this);
final View dialogView = inflater.inflate(R.layout.dialog, null);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("自定义对话框控件");
builder.setView(dialogView);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle(((TextView)dialogView.findViewById(R.id.editText1)).getText());
builder.setMessage(((TextView)dialogView.findViewById(R.id.editText2)).getText());
builder.show();
}
});
builder.show();
Dialog生命周期管理¶
为Dialog对象分配一个唯一id,当使用showDialog(int id)
显示对话框时,Activity检查持有该id的Dialog对象是否存在,如果存在则直接显示
- 重写
onCreateDialog(int id)
- 可以操作
onPrepareDialog(int id, Dialog dialog)
PopupWindow¶
IO blocked
Menu¶
- OptionMenu
- ContextMenu
- SubMenu
- PopupMenu
TextView¶
属性
- gravity 空间内容对其方式
文本属性
- text
- textColor
- textStyle
- textSize 以sp为单位
- background
autoLink
- all, none
- phone, web, email, map
阴影属性
阴影效果是运行时属性,不会在设计器中体现
- shawdowColor, shawdowRadius 阴影颜色与模糊程度
- shawdowDx, shawdowDy 水平偏移与竖直偏移
边框 自定义Shape左为Background
http://www.runoob.com/w3cnote/android-tutorial-edittext.html
drawableXxx
autolink
融合Html
部分可点击TextView:SpannableString
EditText¶
属性
- hint
- textColorHint
- selectAllOnFocus
- inputType
- singleLine
支持HTML标签 <b>
, <i>
, <u>
getText().toString()
Button¶
class MyActivity extends AppCompactActivity
implements View.OnClickListener
{
@Override
public void OnCreated(Bundle savedInstanceState)
{
findViewById(R.id.button).setOnClickListener(this);
}
@Override
public void OnClick(View view)
{
// Related opearations...
}
}
也可以在xml中定义点击处理事件
ImageButton¶
通过src属性链接到文件
ImageView¶
属性
- src 内容,不会自动拉伸
- background 背景,根据View宽度自动拉伸
RadioButton & CheckBox¶
RadioGroup getChildCount()
getChildAt()
RadioButton / CheckBox isChecked()
注意到RadioButton的Listener与CheckBox的Listener处于不同的包中
// android.widget.RadioGroup.OnCheckedChangeListener
// 注意方法签名中的checkedId是R类分配的id
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.radioButton:
textView.setText("One");
break;
case R.id.radioButton2:
textView.setText("Two");
break;
case R.id.radioButton3:
textView.setText("Three");
break;
}
}
// android.widget.CompoundButton.OnCheckedChangeListener
ToggleButton¶
属性
- checked
- textOn, textOff 按下按钮,断开按钮时显示的文本
check()
是否被选中
Switch¶
开关
ProgressBar¶
getMax();
getProgress();
getSecondaryProgress(); // 类似与视频缓冲进度
increasementProgressBy(int diff);
isIndeterminate(); // 是否处于不确定模式下
setIndeterminate(boolean bool) // 设置不确定模式
SeekBar¶
拖动条
RatingBar¶
星级评分条
ScrollView¶
fullScroll()
Date and Time¶
TextClock, AnalogClock, Chronometer, DatePicker, TimePicker, CalendarView
DatePicker¶
属性
- startYear, endYear 均是包含区间
月份设置 0~11
datePicker.init(year, month, day, listener)
TimePicker¶
setIs24HourView()
OnTimeChangedListener
AutoCompleteTextView¶
自动完成文本域,提示用户自动完成的强大功能
创建和绑定适配器
private ArrayAdapter<String> buildAdapter() {
String data[] = {
"Beijing", "Shanghai", "Guangzhou", "China", "Tianjin"
};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, data);
return adater;
}
AutoCompleteTextView autoCompleteTextView = findViewById(R.id.autoCompleteTextView);
autoCompleteTextView.setAdapter(buildAdapter());
ExpandableListView¶
可折叠列表
ViewFlipper¶
翻转视图 用于制作用户第一次登陆的引导页面等