本章节举几个我们在开发中经常用到的例子说明Android事件传递机制。
例1
listview的setOnItemClickListener和setOnItemLongClickListener
//点击事件 listview.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { Log.d("PositionTabActivity", "item点击事件!!!!!!!!!!!!"); } }); //长按事件 listview.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { Log.d("PositionTabActivity", "item长按事件!!!!!!!!!!!!"); return false; } });
可以看到长按事件重写的方法是有返回值的返回值类型 boolean
当返回false时
点击效果
长按效果
也就是说此条件下长按事件结束后(长按item抬起后)还执行了点击事件。
当返回true时
点击效果
长按效果
也就是说此条件下长按事件结束后(长按item抬起后)没有执行点击事件。
总结:listview item点击事件和长按事件都有的情况下(比如item点击进入详情页 item长按删除 两者功能不一样所以要写两个)
当长按事件返回false时不仅执行长按监听还执行了点击监听。
当长按事件返回true时只执行长按监听。
例2
Tabhost多个页面
当返回操作要在主activity中操作
主activity onKeyDown方法
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_BACK){ if((System.currentTimeMillis()-mExitTime)>2000){ toast.showToast("再按一次退出!"); mExitTime=System.currentTimeMillis(); }else{ finish(); } return false; } return super.onKeyDown(keyCode, event); }
其中一个页面onKeyDown方法
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { return false; } return super.onKeyDown(keyCode, event); }
效果:
此时在子activity中(上图中选中的页面)可以退出app。
要是其中一个页面onKeyDown方法
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { return true; } return super.onKeyDown(keyCode, event); }
此时在子activity中(上图中选中的页面)退出app时没有反应。
总结:Tabhost时 所有子activity的onKeyDown方法都必须 return false; 此时才可以在所有子activity中退出APP。