android返回键监听中return false,return true的区别;最好有个例子
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android返回键监听中return false,return true的区别;最好有个例子相关的知识,希望对你有一定的参考价值。
public boolean onKeyDown(int keyCode, KeyEvent event)
//截获按键事件
if(keyCode == KeyEvent.KEYCODE_MENU)
//退出对话框
return false;
如上:android返回键监听中return false;是什么意思,和return true有什么不同,
只监听一次吗?后续的不再监听?网上说如果返回false则时间不继续传递,也就是不会触发相应的后续事件,我试了下即使return true也可以在退出对话框,后按回车,继续退出主activity,和return false效果一样啊,请帮忙讲解,谢谢!
public boolean onKeyDown(int keyCode, KeyEvent event) //截获按键事件 if(keyCode == KeyEvent.KEYCODE_BACK//退出对话框 return false;
你返回false那么久依然会退出这个activity,就是系统调用的返回的处理。但是你要是返回true,那么久不会退出这个activity,就没有系统对返回的处理。追问
不明白,说的好乱,我试过 返回true. 退出对话框, 再按返回键,继续会退出这个activity,和你讲的不一样。 请用事实说话
追答你把这段代码复制进去吧 我偷了个懒,上个回答我偷了个懒,直接复制的你的
@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event)
if (keyCode == KeyEvent.KEYCODE_BACK)
Log.e("按了返回了", "但是不退出这个Activity");
return true;
return super.onKeyDown(keyCode, event);
参考技术A 我是这么记的-。-
拿到这个事件之后,舔完了,要不要把这个事件吃掉~
返回true是吃掉,后面的监听就得不到这个事件了-。-
返回false就是不吃,后面的监听还可以再得到这个动作~继续舔~然后判断要不要吃掉...
推荐你看这个文章吧~看完就懂了http://blog.csdn.net/android_tutor/article/details/7193090 参考技术B android的onKeyDown函数的返回值是这个意思,假如你返回true就是告诉系统我已经对这个回调进行了处理了,不需要系统再处理了。但是你返回false就是告诉系统,我对这个回调做了处理,但是好像不完善,希望系统再帮我处理一下。
Android 优雅的让Fragment监听返回键
Activity可以很容易的得到物理返回键的监听事件,而Fragment却不能。假设FragmentActivity有三个Fragment,一般安卓用户期望点击返回键会一层层返回到FragmentActivity。当然,我们可以将每个Fragment对应的Transaction放到BackStack中,但是如果每个Fragment有对返回事件的特殊消费,那么在FragmentActivity的onBackPressed()中的代码就会比较混乱,例如:
@Override public void onBackPressed() { if(selectedFragment.equals(fragmentA) && fragmentA.hasExpandedRow()) { fragmentA.collapseRow(); } else if(selectedFragment.equals(fragmentA) && fragmentA.isShowingLoginView()) { fragmentA.hideLoginView(); } else if(selectedFragment.equals(fragmentA)) { popBackStack(); } else if(selectedFragment.equals(fragmentB) && fragmentB.hasCondition1()) { fragmentB.reverseCondition1(); } else if(selectedFragment.equals(fragmentB) && fragmentB.hasCondition2()) { fragmentB.reverseCondition2(); } else if(selectedFragment.equals(fragmentB)) { popBackStack(); } else { // handle by activity super.onBackPressed(); } }
这对于有代码洁癖的程序猿显然是不能容忍的,后来发现了一种优雅的解决方案。
首先创建一个抽象类BackHandledFragment,该类有一个抽象方法onBackPressed(),所有BackHandledFragment的子类在onBackPressed方法中处理各自对Back事件的消费逻辑。onBackPressed返回布尔值,宿主FragmentActivity将会根据该方法的返回值判断子Fragment是否有消费Back事件。此外,宿主FragmentActivity还会保持一份当前Fragment的引用,当用户按下Back键时,宿主Activity会判断当前Fragment是否需要消费该事件,如果没有Fragment消费才会自己消费。
public abstract class BackHandledFragment extends Fragment { protected BackHandledInterface mBackHandledInterface; /** * 所有继承BackHandledFragment的子类都将在这个方法中实现物理Back键按下后的逻辑 * FragmentActivity捕捉到物理返回键点击事件后会首先询问Fragment是否消费该事件 * 如果没有Fragment消息时FragmentActivity自己才会消费该事件 */ protected abstract boolean onBackPressed(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(!(getActivity() instanceof BackHandledInterface)){ throw new ClassCastException("Hosting Activity must implement BackHandledInterface"); }else{ this.mBackHandledInterface = (BackHandledInterface)getActivity(); } } @Override public void onStart() { super.onStart(); //告诉FragmentActivity,当前Fragment在栈顶 mBackHandledInterface.setSelectedFragment(this); } }
宿主FragmentActivity需要继承BackHandledIntegerface,子Fragment会通过该接口告诉宿主FragmentActivity自己是当前屏幕可见的Fragment。
public interface BackHandledInterface { public abstract void setSelectedFragment(BackHandledFragment selectedFragment); }
所以在Fragment的onCreate中会判断宿主FragmentActivity是否已继承了该接口。在Fragment的onStart()方法中就会调用该接口告诉宿主FragmentActivity自己是当前屏幕可见的Fragment。
宿主FragmentActivity就可以在onBackPressed()方法中对Back事件进行判断处理了。
public class MainActivity extends FragmentActivity implements BackHandledInterface{ private BackHandledFragment mBackHandedFragment; private boolean hadIntercept; @Override public void setSelectedFragment(BackHandledFragment selectedFragment) { this.mBackHandedFragment = selectedFragment; } @Override public void onBackPressed() { if(mBackHandedFragment == null || !mBackHandedFragment.onBackPressed()){ if(getSupportFragmentManager().getBackStackEntryCount() == 0){ super.onBackPressed(); }else{ getSupportFragmentManager().popBackStack(); } } } }
示例程序Github链接。
以上是关于android返回键监听中return false,return true的区别;最好有个例子的主要内容,如果未能解决你的问题,请参考以下文章