Android -- Handling back button press Inside Fragments
干货(1)
首先创建一个抽象类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();
}
}
}
}
干货(2)
在Fragment的onResume中通过View去监听。(要注意setFocusableInTouchMode()和requestFocus())
@Override
public void onResume() { super.onResume(); getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){ // handle back button return true; } return false;
}
});
}
我是天王盖地虎的分割线
参考:http://vinsol.com/blog/2014/10/01/handling-back-button-press-inside-fragments/
http://stackoverflow.com/questions/22552958/handling-back-press-when-using-fragments-in-android
最新文章
- 使用JSONObject.fromObject的时候出现“There is a cycle in the hierarchy”异常 的解决办法
- Linux 目录配置
- Properties类的使用方法
- loj 1026( tarjan + 输出割边 )
- CentOS6.6系统源代码安装mysql5.5.28教程(附源码包下载地址)+sysbench的安装
- 遇到double 数目过大,转String变成科学计数法
- [Netbeans]为面板设置背景图片
- MEF 编程指南(三):声明导出
- Oracle-查看oracle是否有表被锁
- Delphi 停靠技术的应用
- Javascript:DOM表格操作
- windows mongodb 安装
- android 签名被篡改(Keystore was tampered with, or password was incorrect)
- Spring接口编程_设值注入和构造注入
- Android笔记:Fragment与ViewPager组合时,如何在FragmentActicity获取Fragment对象
- R语言︱排序问题
- C# Note11:如何优雅地退出WPF应用程序
- [Z] SQL SERVER 的前世今生--各版本功能对比
- 黄聪:OTP动态密码_Java代码实现
- 20145221高其_MSF基础应用
热门文章
- nuxus 3在Maven项目的配置和POM文件的配置
- python实例[判断操作系统类型]
- There are no packages available for install
- 采用ASP.NET IIS 注册工具 (Aspnet_regiis.exe)对web.config实行本地加密
- nginx源码学习 资料
- Xamarin adventures – Differences between iOS simulator and device
- Task Parallel Library02,更进一步
- delphiredisclient开源GIT
- iOS 程序插件及功能动态更新思路
- iOS webservice 接口使用方法