真的很乱七八糟,就当写给自己看吧,囧
1.多线程更新ui的方法:
众所周知,android的系统ui十分蛋疼,只能在主线程更新,也就是说,只能在ui所在的主activity处更新,包括一切的弹出对话框,动态控件的显示等。
在其他线程时,只能通过间接更新来实现。我所用的方法就是在主线程实现一个handler成员,通过发送消息给它来更新ui。
以下为一个简单例子:
public class MyActivity extends Activity
{
public static final int UI_MSG1 = 0;//UI更新消息1
public static final int UI_MSG2 = 1;//UI更新消息2
private Handler mHandler = new Handler()
{
public void handleMessage (Message msg)
{
switch(msg.what)
{
case UI_MSG1:
//做一些更新
break;
case UI_MSG2:
//做一些更新
break;
}
}
};
Handler GetHandler() {return mHandler;}
//省略其他代码
}
//如果其他地方需要更新ui,则发送更新消息给主activity对象即可
activity.GetHandler().sendEmptyMessage(MyActivity.UI_MSG1);//此处activity假设为一个MyActivity对象,这里只做示例用
2.关于findViewById:
如果是代码中自定义的控件(即layout中没有,也无资源id),需要在程序运行中实际显示出来,也就是show的时点后,通过id获取的view才会有效。
这里举一个获取AlertDialog的例子,下面的代码通过获取view来实现居中显示:
1
2 dlg.show();
3 TextView messageText = (TextView)dlg.findViewById(android.R.id.message);//如果这行代码放在show之前,则messageText的值为0
4 messageText.setGravity(android.view.Gravity.CENTER_HORIZONTAL);
3.获取屏幕的宽高
受android的横屏竖屏切换机制所影响,Activity中getWindowManager().getDefaultDisplay()的getWidth() 或者getHeight()方法常常会获得颠倒的宽高,如果你的程序需要使用固定的横屏或固定的竖屏,只需比较所获取宽高的大小再根据情况重新赋值给自己的宽高变量即可,如果宽比高大则表示横屏,反之则竖屏。
4.在view中拦截触摸/按键事件
其实这个网上的资料很多,就是重写view类的onKeyDown/onKeyUp/onTouchEvent方法来处理自己的事件,其中onTouchEvent中又包括ACTION_MOVE,ACTION_DOWN,ACTION_UP这些事件。
如果view有调用requestFocus,则上述方法优先响应于activity的同名方法。反之,可能会无响应。
然后说说返回值。
一般来说,都是直接返回父类的方法,例如:return super.onTouchEvent(event);
上述方法最后都要返回一个布尔值,key事件的返回值只是表示是否只被这个view截取(既返回true时),如果想要继续传递给其他view,则可返回false。
touch事件中,返回值则意味着事件是否被处理,如果返回false,则不会继续接下去的事件响应(move和up事件),如果想要保证触摸事件被处理,可以一直返回true。也可以在view初始化时设置setClickab(true)。
5.关于waiting for the debugger to attach
有时候一些设备通过eclipse的debug模式安装程序后,只能通过eclipse来运行,设备上则不能直接运行,这样很不方便。
解决方法:
在你项目的manifest.xls中,加入以下权限
<uses-permission android:name="android.permission.SET_DEBUG_APP"></uses-permission>