android 获取当前fragment单个对象(解决fragment返回键问题)
2016-03-10 14:57
417 查看
在做fragment返回的时候,因为fragment里不能直接写onKeyDown方法,所以只能在fragmentactivity里操作(我的fragment都是依附在fragmentactivity上的,通过tabhost显示出来)。在这边有两种方法:
方法一:在这边只要获取到当前的fragment单个对象就可以实现了,再用instanceof进行判断是哪个fragment。
贴代码:
方法二:自定义一个BackHandledFragment,在写一个BackHandledInterface接口,通过这个接口,可以调用BackHandledFragment里面的ononBackPressed()。
BackHandledFragment.java
在你的fragment中声明一个private boolean hadIntercept;,然后重写
在fragmentactivity声明private BackHandledFragment mBackHandedFragment;,然后重写setSelectedFragment方法:
重写fragmentactivity里的onBackPressed方法:
ok!这就是所有的代码了,直接复制到项目里就可以的。
主要是
也可以通过findfragmentbyid或findfragmentbttag来获取。
onKeyDown和onBackPressed虽然都有返回的作用,但是他们是有区别的。
方法一:在这边只要获取到当前的fragment单个对象就可以实现了,再用instanceof进行判断是哪个fragment。
贴代码:
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { Fragment ft = (Fragment) getSupportFragmentManager().findFragmentById(R.id.realtabcontent);//realtabcontent为你的容器,装载fragment的 if (ft instanceof HomeFragment || ft instanceof PersonalFragment) { if ((System.currentTimeMillis() - mExitTime) > 2000) { Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show(); mExitTime = System.currentTimeMillis(); } else { finish(); } return true; } else if (ft instanceof LoginFragment) { ((LoginFragment) ft).onKeyDown(keyCode, event);//onKeyDown在LoginFragment里面重写了,只是随便写了一个方法而已....... return false; } else if (ft instanceof RegisterFragment) { ((RegisterFragment) ft).onKeyDown(keyCode, event); return false; } } return super.onKeyDown(keyCode, event); }
方法二:自定义一个BackHandledFragment,在写一个BackHandledInterface接口,通过这个接口,可以调用BackHandledFragment里面的ononBackPressed()。
BackHandledFragment.java
package com.example.demo.fragment; import com.example.sihaiproject.interfaces.BackHandledInterface; import android.os.Bundle; import android.support.v4.app.Fragment; public abstract class BackHandledFragment extends Fragment { protected BackHandledInterface mBackHandledInterface; /** * 所有继承BackHandledFragment的子类都将在这个方法中实现物理Back键按下后的逻辑 * FragmentActivity捕捉到物理返回键点击事件后会首先询问Fragment是否消费该事件 * 如果没有Fragment消息时FragmentActivity自己才会消费该事件 */ public 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); } } BackHandledInterface.java package com.example.demo.interfaces; import com.example.sihaiproject.fragment.BackHandledFragment; public interface BackHandledInterface { public abstract void setSelectedFragment(BackHandledFragment selectedFragment); }
在你的fragment中声明一个private boolean hadIntercept;,然后重写
@Override public boolean onBackPressed() { if(hadIntercept){ return false; }else{ getFragmentManager().popBackStack(); hadIntercept = true; return true; } }
在fragmentactivity声明private BackHandledFragment mBackHandedFragment;,然后重写setSelectedFragment方法:
@Override public void setSelectedFragment(BackHandledFragment selectedFragment) { this.mBackHandedFragment = selectedFragment; }
重写fragmentactivity里的onBackPressed方法:
@Override public void onBackPressed() { if (mBackHandedFragment == null || !mBackHandedFragment.onBackPressed()) { if (getSupportFragmentManager().getBackStackEntryCount() == 0) { finish(); } else { getSupportFragmentManager().popBackStack(); } } }
ok!这就是所有的代码了,直接复制到项目里就可以的。
主要是
Fragment ft = (Fragment) getSupportFragmentManager().findFragmentById(R.id.realtabcontent);,这句话的作用就是获取当前fragment对象。
也可以通过findfragmentbyid或findfragmentbttag来获取。
onKeyDown和onBackPressed虽然都有返回的作用,但是他们是有区别的。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories