1.设置hint的字体大小
在Android xml文件中并没有直接设置hint字体大小的属性。如果hint文字的大小不希望跟正常字体的大小一样,就只能通过代码的方式来进行处理。
提供两种方式:
//设置"用户名"提示文字的大小
EditText etUserName = (EditText)findViewById(R.id.et_usernanme);
SpannableString s = new SpannableString("请输入用户名");
AbsoluteSizeSpan textSize = new AbsoluteSizeSpan(14,true);
s.setSpan(textSize,0,s.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
etUserName.setHint(s);
//设置"密码"提示文字的大小
EditText etPassword = (EditText)findViewById(R.id.et_password);
//用html的方式来设置这个属性,毕竟都是String
etPassword.setHint(Html.fromHtml("<font color=\"#cbccd1\"><small>请输入密码</small></font>"));
//etPassword.setHint(Html.fromHtml("<font color=\"#cbccd1\"><small><small>请输入密码</small></small></font>"));
2.定时器
①延迟处理
TimerTask task = new TimerTask() {
@Override
public void run() {
//要执行的操作
}
};
Timer timer = new Timer();
timer.schedule(task, 2000);//2秒后执行TimeTask的run方法
②指定日期运行一次
String sdate = "2018-02-14";
SimpleDateFormat sf = new SimpleDateFormat("yy-MM-dd");
Date date = sf.parse(sdate);
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("系统正在运行……");
}
}, date); //在指定的日期运行一次定时任务
注:如果date日期在今天之前,则启动定时器后,立即运行一次定时任务run方法;如果date日期在今天之后,则启动定时器后,会在指定的将来日期运行一次任务run方法
③在距当前时刻的一段指定距离后,每隔指定时间运行一次定时器任务
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("系统正在运行……");
}
}, 5000, 2000);
当启动定时器后,5s之后开始每隔2s执行一次定时器任务。
停止的方法:
timer.cancel();
3.ScrollView fillViewport属性
为了屏幕适配,包含多元素的布局一般都会使用ScrollView,以便小屏手机滑动查看,但是在大屏手机上内容全部加载,导致下方空白。
android:fillViewport="true" 是一个布局属性,它用于在ScrollView中填充视图的高度,以便在内容不足以填满屏幕时也能填充整个屏幕。这个属性只适用于ScrollView或其子类。当ScrollView中的内容小于屏幕高度时,如果不设置该属性,ScrollView不会填充整个屏幕,而是只显示其内容所占的部分。而当设置了该属性后,ScrollView会将其内容拉伸至填满整个屏幕,使得用户在浏览内容时不会出现界面空白的情况。
需要注意的是,android:fillViewport="true"只会在ScrollView的内容不足以填满整个屏幕时起作用,如果内容已经填满了整个屏幕,则该属性不会有任何作用。
比如下图,我们希望最后的Button是置底的,同时是可以跟随滑动的。
由于子布局高度小于ScrollView的高度,定义子布局match_parent或者fill_parent不起作用,因此设置layout_gravity也不起作用。此时只需要在scrollview里添加属性android:fillViewport=”true” 就可以了,使得子布局高度和scrollview一样,而当子布局高度超过scrollview的高度时,这个属性就没有意义了。
4.按钮模拟点击performClick()无效
原因:开发过程中遇到button.performClick()无效,原因是View.performClick()需要在UI线程中调用才会有效执行。
响应系统调用的方法(比如报告用户动作的onKeyDown()或一个生命周期回调方法)永远在界面线程中进程,所以onCreate里面调用button的performClick没问题, 而通过code直接调用相当于是代码执行,并不会触发android的UI线程。
两个解决方法:
①View.post(Runnable)方法
View.postDelayed(new Runnable(){
@Override
public void run() {
button.performClick();
}
}, 1000);
在post(Runnable action)方法里,View获得当前线程(即UI线程)的Handler,然后将action对象post到Handler里。在Handler里,它将传递过来的action对象包装成一个Message(Message的callback为action),然后将其投入UI线程的消息循环中。在Handler再次处理该Message时,有一条分支(未解释的那条)就是为它所设,直接调用runnable的run方法。而此时,已经路由到UI线程里,因此,我们可以毫无顾虑的来更新UI。
②Activity.runOnUiThread(Runnable)方法
Activity.runOnUiThread(new Runnable() {
@Override
public void run() {
button.performClick();
}
});
把更新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给Activity.runOnUiThread(Runnable)。 这样Runnable对像就能在ui程序中被调用。如果当前线程是UI线程,那么行动是立即执行;如果当前线程不是UI线程,操作是发布到事件队列的UI线程。
5.adb命令启动Activity
①不带参数启动Activity
adb shell am start -n com.app.test/.MainActivity
②带参数的启动Activity
adb shell am start -n com.app.test/.MainActivity --ei start_index 1 --es str "hello"
表示启动Activity并传递两个参数:
第一个参数是start_index,整型,值为1;第二个参数是str,字符串,值为"hello"
等同于Java代码:
Intent intent= new Intent();
intent.setComponent(new ComponentName("com.app.test", "com.app.test.MainActivity"));
intent.putExtra("start_index", 1);
③指定Action
adb shell am start -a android.intent.action.MAIN -n com.app.test/.MainActivity --ei start_index 1
4.指定category
adb shell am start -c android.intent.category.LAUNCHER -n com.app.test/.MainActivity --ei start_index 1
5.同时指定action和category都可以
adb shell am start -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -n com.app.test/.MainActivity --ei start_index 1
对应命令的介绍:
-a action;activity对应的action;
--es key stringValue; 传递 String 参数;
--ez key booleanValue; 传递 Boolean 参数;
--ei key intValue; 传递 int 参数;
--el key longValue; 传递 long 参数;
--ef key floatValue; 传递 float 参数;