android 获取当前fragment单个对象(解决fragment返回键问题)
来源:互联网 发布:网页游戏编程入门 编辑:程序博客网 时间:2024/06/08 06:14
在做fragment返回的时候,因为fragment里不能直接写onKeyDown方法,所以只能在fragmentactivity里操作(我的fragment都是依附在fragmentactivity上的,通过tabhost显示出来)。在这边有两种方法:
方法一:在这边只要获取到当前的fragment单个对象就可以实现了,再用instanceof进行判断是哪个fragment。
贴代码:
@Overridepublic 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();@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if(!(getActivity() instanceof BackHandledInterface)){throw new ClassCastException("Hosting Activity must implement BackHandledInterface");}else{this.mBackHandledInterface = (BackHandledInterface)getActivity();}}@Overridepublic void onStart() {super.onStart();//告诉FragmentActivity,当前Fragment在栈顶mBackHandledInterface.setSelectedFragment(this);}}BackHandledInterface.javapackage com.example.demo.interfaces;import com.example.sihaiproject.fragment.BackHandledFragment;public interface BackHandledInterface {public abstract void setSelectedFragment(BackHandledFragment selectedFragment);}
在你的fragment中声明一个private boolean hadIntercept;,然后重写
@Overridepublic boolean onBackPressed() {if(hadIntercept){return false;}else{getFragmentManager().popBackStack();hadIntercept = true;return true;}}
在fragmentactivity声明private BackHandledFragment mBackHandedFragment;,然后重写setSelectedFragment方法:
@Overridepublic void setSelectedFragment(BackHandledFragment selectedFragment) {this.mBackHandedFragment = selectedFragment;}
重写fragmentactivity里的onBackPressed方法:
@Overridepublic 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虽然都有返回的作用,但是他们是有区别的。
- android 获取当前fragment单个对象(解决fragment返回键问题)
- Android ViewPager刷新Fragment数据(ViewPager获取Fragment对象)
- Android ViewPager刷新Fragment数据(ViewPager获取Fragment对象)
- [android] Fragment嵌套与返回键问题
- 获取当前ViewPager里面的Fragment对象
- 获取当前显示的fragment对象
- Android Fragment getActivity返回null解决
- Android Fragment getActivity返回null解决
- Android Fragment getActivity返回null解决
- Android Fragment getActivity返回null解决
- android Fragment 通信 返回键
- android fragment 监听返回键
- android Fragment 返回键 退出
- Android fragment监听返回键
- Android中Fragment装载WebView 返回键设置问题
- Android:销毁当前Fragment
- android 解决fragment+viewpager+fragment滑动卡顿的问题
- 返回键(基于Fragment)
- PAT (Basic Level)1041. 考试座位号
- SYDZ 辗转相除法的原理与实现
- 推酷
- Android的animation动画
- 利用UncaughtExceptionHandler捕获全局异常
- android 获取当前fragment单个对象(解决fragment返回键问题)
- iOS上线到APP Store流程
- 【电子签到】v1.0版本正式上线!免费下载!
- 如果测试自己的编译器打是大端还是小端
- State Threads
- 在PHP中调用接口
- s7500刷Android442
- viewWillAppear不执行
- 关于HttpClient(调用openstack rest接口失败)