资源建议放到assets中去。速度快。文件不多可以直接放到raw。
aapt 打包成apk文件。
imageview的宽高设置固定大小,则注意参数scletype这个参数设置。
imageview.setLayoutParams(new LinearLayout.LayoutParams(200,100))
在linearlayout中addview 添加view,这个view 通常可以是一个layout,通过inflate进来。可以添加多个view
onstarttrackingTouch 从哪里开始滑动
ToggleButton 开关状态按钮
onFocusChange当控件的焦点发生变化时触发。
SpannableString来设置超链接、颜色、字体等属性 //创建一个 SpannableString对象
msp = new SpannableString("字体测试字体大小一半两倍前景色背景色正常粗体斜体粗斜体下划线删除线x1x2电话邮件网站短信彩信地图X轴综合");
//设置字体(default,default-bold,monospace,serif,sans-serif)
msp.setSpan(new TypefaceSpan("monospace"), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
msp.setSpan(new TypefaceSpan("serif"), 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置字体大小(绝对值,单位:像素)
msp.setSpan(new AbsoluteSizeSpan(20), 4, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
msp.setSpan(new AbsoluteSizeSpan(20,true), 6, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //第二个参数boolean dip,如果为true,表示前面的字体大小单位为dip,否则为像素,同上。
在按钮上设置图文并茂的: ImageSpan 和SpannableString
SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类:.
Format(data) 将一个 Date 格式化为日期/时间字符串.
Calendar calendar = Calendar.getInstance();返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化.
calendar.getTime()返回一个表示此 Calendar 时间值(从历元至现在的毫秒偏移量)的 Date 对象,
菜单的弹出和定时影藏:
1.在有按键按下时:先不管是什么按键,有可能要弹出菜单。
当影藏菜单的timer对象不为空时,这时候timer对象已经存在,手动取消,并值为null,当timer为null时,将对象new出来,并给出具体的时间到的任务。这个任务可以是发影藏消息刷新UI。
public void startHideMenu() {
if (mHideMenu != null) {
mHideMenu.cancel();
mHideMenu = null;
}
if (mHideMenu == null) {
mHideMenu = new Timer();
}
mHideMenu.schedule(new TimerTask() {
@Override
public void run() {
if (mHandler != null) {
mHandler.sendEmptyMessage(HIDEMENU);
}
}
}, 3000);
}
在影藏的任务中:如果菜单是show状态,将它dismiss掉,并取消之前的定时器。这个时候已经是影藏菜单了,所以应该removeMessages(HIDEMENU);
public void hideMenu() {
if (mPopMenu != null && mPopMenu.isShowing()) {
if (mHideMenu != null) {
mHideMenu.cancel();
mHideMenu = null;
}
mHandler.removeMessages(HIDEMENU);
mPopMenu.dismiss();
}
}
2菜单的出现:出现和消失都可以按菜单键的反复来确定:
switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_MENU: {
if (mPopMenu.isShowing()) {
hideMenu();
} else {
showMenu();
}
//菜单出现了之后又要启动定时影藏功能来超时去影藏。
public void showMenu() {
if (!mPopMenu.isShowing()) {
mPopMenu.showAtLocation(mMainView, Gravity.CENTER_HORIZONTAL
| Gravity.BOTTOM, 0, 0);
startHideMenu();
}
}
3在主页上显示时间并隔一段时间刷新下:思路:起一个定时器,定时发送刷新消息,在handler中接收到消息即重新置时间值,
上面思路忽略了android activity的生命周期的问题。定时器的产生需伴随着android的 onResume 和onPause 操作来,即在onResume 中启动定时器,在onPause中cancel定时器。
4主页上各个控件焦点的移动:
初始情况下:如果是向上的按键:最上面的一个按键requestFocus();如果是向下的按键:判断焦点在哪个控件上,例如:list和gridview,若在其上则设置选中其首个
if (mLeftSetList.hasFocus()) {
mLeftSetList.setSelection(0);
} else if (mDlnaDevices.hasFocus()) {
if (mDlnaDevices.getCount() > 0) {
mDlnaDevices.setSelection(0);
}
}
5,注意在此之后控件requestFocus 之后,即要实现控件的setOnFocusChangeListener(btnOnFocusChangeListener);同步刷新其他的控件。
6,
系统启动时,packagemanagerservice读取所有manifest信息,包括activity等,应用程序启动时候。launcher进行系统级判断,比如最小SDK等。四大组件在需要的时候根据启动的共享区信息初始化。
7,线程池加队列:初始化一定数量的线程,而将任务即runnable发到队列中,线程从队列中去取runnable 来执行。队列没有任务,就让线程等待